Commit 646603ad authored by Allen Chen's avatar Allen Chen

commit

parent 6d15a950
...@@ -85,21 +85,24 @@ ...@@ -85,21 +85,24 @@
<artifactId>spring-boot-starter-amqp</artifactId> <artifactId>spring-boot-starter-amqp</artifactId>
</dependency> </dependency>
<!--pdf -->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency> <dependency>
<groupId>com.itextpdf</groupId> <groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId> <artifactId>kernel</artifactId>
<version>5.5.13</version> <version>7.2.6</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency> <dependency>
<groupId>com.itextpdf</groupId> <groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId> <artifactId>layout</artifactId>
<version>5.2.0</version> <version>7.2.6</version>
</dependency> </dependency>
<!-- 处理图片 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.2.6</version>
</dependency>
<!--条形码 --> <!--条形码 -->
<dependency> <dependency>
<groupId>com.google.zxing</groupId> <groupId>com.google.zxing</groupId>
......
package org.ta.pddserver.PDFTemplate;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
/**
*
*/
public class BarCodeUtils {
/** 条形码宽度 */
private static final int WIDTH = 500;
/** 条形码高度 */
private static final int HEIGHT = 70;
/** 加文字 条形码 */
private static final int WORDHEIGHT = 95;
/**
* 设置 条形码参数
*/
private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
private static final long serialVersionUID = 1L;
{
// 设置编码方式
put(EncodeHintType.CHARACTER_SET, "utf-8");
}
};
/**
* 把带logo的二维码下面加上文字
* @author fxbin
* @param image 条形码图片
* @param words 文字
* @return 返回BufferedImage
*/
public static BufferedImage insertWords(BufferedImage image, String words){
// 新的图片,把带logo的二维码下面加上文字
if (StringUtils.isNotEmpty(words)) {
BufferedImage outImage = new BufferedImage(WIDTH, WORDHEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = outImage.createGraphics();
// 抗锯齿
setGraphics2D(g2d);
// 设置白色
setColorWhite(g2d);
// 画条形码到新的面板
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
// 画文字到新的面板
Color color=new Color(0, 0, 0);
g2d.setColor(color);
// 字体、字型、字号
g2d.setFont(new Font("微软雅黑", Font.PLAIN, 18));
//文字长度
int strWidth = g2d.getFontMetrics().stringWidth(words);
//总长度减去文字长度的一半 (居中显示)
int wordStartX=(WIDTH - strWidth) / 2;
//height + (outImage.getHeight() - height) / 2 + 12
int wordStartY=HEIGHT+20;
// 画文字
g2d.drawString(words, wordStartX, wordStartY);
g2d.dispose();
outImage.flush();
return outImage;
}
return null;
}
/**
* 生成 图片缓冲
* @author fxbin
* @param vaNumber VA 码
* @return 返回BufferedImage
*/
public static BufferedImage getBarCode(String vaNumber){
try {
Code128Writer writer = new Code128Writer();
// 编码内容, 编码类型, 宽度, 高度, 设置参数
BitMatrix bitMatrix = writer.encode(vaNumber, BarcodeFormat.CODE_128, WIDTH, HEIGHT, hints);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
/**
* 生成 图片缓冲图片大小自己输入
* @author fxbin
* @param vaNumber VA 码
* @return 返回BufferedImage
*/
public static BufferedImage getBarCode(String vaNumber,int width,int height){
try {
Code128Writer writer = new Code128Writer();
// 编码内容, 编码类型, 宽度, 高度, 设置参数
BitMatrix bitMatrix = writer.encode(vaNumber, BarcodeFormat.CODE_128, width, height, hints);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
/**
* 把带logo的二维码下面加上文字大小自己输入
* @author fxbin
* @param image 条形码图片
* @param words 文字
* @return 返回BufferedImage
*/
public static BufferedImage insertWords(BufferedImage image, String words ,int width,int wordheight,int height){
// 新的图片,把带logo的二维码下面加上文字
if (StringUtils.isNotEmpty(words)) {
BufferedImage outImage = new BufferedImage(width, wordheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = outImage.createGraphics();
// 抗锯齿
setGraphics2D(g2d);
// 设置白色
setColorWhite(g2d);
// 画条形码到新的面板
g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
// 画文字到新的面板
Color color=new Color(0, 0, 0);
g2d.setColor(color);
// 字体、字型、字号
g2d.setFont(new Font("微软雅黑", Font.PLAIN, 18));
//文字长度
int strWidth = g2d.getFontMetrics().stringWidth(words);
//总长度减去文字长度的一半 (居中显示)
int wordStartX=(width - strWidth) / 2;
//height + (outImage.getHeight() - height) / 2 + 12
int wordStartY=height+20;
// 画文字
g2d.drawString(words, wordStartX, wordStartY);
g2d.dispose();
outImage.flush();
return outImage;
}
return null;
}
/**
* 设置 Graphics2D 属性 (抗锯齿)
* @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
*/
private static void setGraphics2D(Graphics2D g2d){
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g2d.setStroke(s);
}
/**
* 设置背景为白色
* @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
*/
private static void setColorWhite(Graphics2D g2d){
g2d.setColor(Color.WHITE);
//填充整个屏幕
g2d.fillRect(0,0,600,600);
//设置笔刷
g2d.setColor(Color.BLACK);
}
}
package org.ta.pddserver.PDFTemplate;
import java.io.*;
/**
* 文件操作代码
*
* @author cn.outofmemory
* @date 2013-1-7
*/
public class FileUtils {
/**
* 将文本文件中的内容读入到buffer中
* @param buffer buffer
* @param filePath 文件路径
* @throws IOException 异常
* @author cn.outofmemory
* @date 2013-1-7
*/
public static void readToBuffer(StringBuffer buffer, String filePath) throws IOException {
InputStream is = new FileInputStream(filePath);
String line; // 用来保存每行读取的内容
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
line = reader.readLine(); // 读取第一行
while (line != null) { // 如果 line 为空说明读完了
buffer.append(line); // 将读到的内容添加到 buffer 中
buffer.append("\n"); // 添加换行符
line = reader.readLine(); // 读取下一行
}
reader.close();
is.close();
}
/**
* 读取文本文件内容
* @param filePath 文件所在路径
* @return 文本内容
* @throws IOException 异常
* @author cn.outofmemory
* @date 2013-1-7
*/
public static String readFile(String filePath){
try {
StringBuffer sb = new StringBuffer();
FileUtils.readToBuffer(sb, filePath);
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
public static long getFileSize(String filename) {
File file = new File(filename);
if (!file.exists() || !file.isFile()) {
System.out.println("文件不存在");
return -1;
}
return file.length();
}
public static long getFileSize(File file) {
if (!file.exists() || !file.isFile()) {
System.out.println("文件不存在");
return -1;
}
return file.length();
}
/*
public static String genChecksum(String file, CheckSumAlgoType checkSumAlgoType) {
*/
/**
* 使用org.apache.commons.codec.digest.DigestUtils
*//*
String checksum = null;
try {
switch (checkSumAlgoType) {
case MD5:
checksum = DigestUtils.md5Hex(new FileInputStream(file));
break;
case SHA_1:
checksum = DigestUtils.sha1Hex(new FileInputStream(file));
break;
case SHA_256:
checksum = DigestUtils.sha256Hex(new FileInputStream(file));
break;
case SHA_512:
checksum = DigestUtils.sha512Hex(new FileInputStream(file));
break;
default:
checksum = DigestUtils.md5Hex(new FileInputStream(file));
}
} catch (Exception e) {
e.printStackTrace();
}
return checksum;
}
public static String genChecksum(File file, CheckSumAlgoType checkSumAlgoType) {
*/
/**
* 使用org.apache.commons.codec.digest.DigestUtils
*//*
String checksum = null;
try {
switch (checkSumAlgoType) {
case MD5:
checksum = DigestUtils.md5Hex(new FileInputStream(file));
break;
case SHA_1:
checksum = DigestUtils.sha1Hex(new FileInputStream(file));
break;
case SHA_256:
checksum = DigestUtils.sha256Hex(new FileInputStream(file));
break;
case SHA_512:
checksum = DigestUtils.sha512Hex(new FileInputStream(file));
break;
default:
checksum = DigestUtils.md5Hex(new FileInputStream(file));
}
} catch (Exception e) {
e.printStackTrace();
}
return checksum;
}
*/
public static void copy(String source, String dest, int bufferSize) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(source);
out = new FileOutputStream(dest);
byte[] buffer = new byte[bufferSize];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean checkDir(String dirName) {
try {
File dir = new File(dirName);
if (dir.exists()) {
System.out.println("创建目录" + dirName + "失败,目标目录已经存在");
} else {
if (!dirName.endsWith(File.separator)) {
dirName = dirName + File.separator;
}
if (dir.mkdirs()) {
System.out.println("创建目录" + dirName + "成功!");
} else {
System.out.println("创建目录" + dirName + "失败!");
return false;
}
}
}catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
//删除文件夹
//param folderPath 文件夹完整绝对路径
public static void delFolder(String folderPath) {
try {
delAllFile(folderPath); //删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
File myFilePath = new File(filePath);
myFilePath.delete(); //删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}
}
//删除指定文件夹下所有文件
//param path 文件夹完整绝对路径
public static boolean delAllFile(String path) {
boolean flag = false;
File file = new File(path);
if (!file.exists()) {
return flag;
}
if (!file.isDirectory()) {
return flag;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件
delFolder(path + "/" + tempList[i]);//再删除空文件夹
flag = true;
}
}
return flag;
}
}
\ No newline at end of file
package org.ta.pddserver.PDFTemplate;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;
public class QRCodeUtils {
private static final String CHARSET = "utf-8";
private static final String FORMAT = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 3000;
// LOGO宽度
private static final int LOGO_WIDTH = 600;
// LOGO高度
private static final int LOGO_HEIGHT = 600;
static BufferedImage createImage(String content, String logoPath, boolean needCompress) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (logoPath == null || "".equals(logoPath)) {
return image;
}
// 插入图片
QRCodeUtils.insertImage(image, logoPath, needCompress);
return image;
}
/**
* 插入LOGO
*
* @param source 二维码图片
* @param logoPath LOGO图片地址
* @param needCompress 是否压缩
* @throws Exception
*/
private static void insertImage(BufferedImage source, String logoPath, boolean needCompress) throws Exception {
File file = new File(logoPath);
if (!file.exists()) {
throw new Exception("logo file not found.");
}
Image src = ImageIO.read(new File(logoPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress) { // 压缩LOGO
if (width > LOGO_WIDTH) {
width = LOGO_WIDTH;
}
if (height > LOGO_HEIGHT) {
height = LOGO_HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
}
// 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_SIZE - width) / 2;
int y = (QRCODE_SIZE - height) / 2;
graph.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
}
/**
* 生成二维码(内嵌LOGO)
* 二维码文件名随机,文件名可能会有重复
*
* @param content 内容
* @param logoPath LOGO地址
* @param destPath 存放目录
* @param needCompress 是否压缩LOGO
* @throws Exception
*/
public static String encode(String content, String logoPath, String destPath, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtils.createImage(content, logoPath, needCompress);
mkdirs(destPath);
String fileName = new Random().nextInt(99999999) + "." + FORMAT.toLowerCase();
ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName));
return fileName;
}
/**
* 生成二维码(内嵌LOGO)
* 调用者指定二维码文件名
*
* @param content 内容
* @param logoPath LOGO地址
* @param destPath 存放目录
* @param fileName 二维码文件名
* @param needCompress 是否压缩LOGO
* @throws Exception
*/
public static String encode(String content, String logoPath, String destPath, String fileName, boolean needCompress) throws Exception {
BufferedImage image = QRCodeUtils.createImage(content, logoPath, needCompress);
mkdirs(destPath);
fileName = fileName.substring(0, fileName.indexOf(".") > 0 ? fileName.indexOf(".") : fileName.length())
+ "." + FORMAT.toLowerCase();
ImageIO.write(image, FORMAT, new File(destPath + "/" + fileName));
return fileName;
}
/**
* 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.
* (mkdir如果父目录不存在则会抛出异常)
*
* @param destPath 存放目录
*/
public static void mkdirs(String destPath) {
File file = new File(destPath);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
}
/**
* 生成二维码(内嵌LOGO)
*
* @param content 内容
* @param logoPath LOGO地址
* @param destPath 存储地址
* @throws Exception
*/
public static String encode(String content, String logoPath, String destPath) throws Exception {
return QRCodeUtils.encode(content, logoPath, destPath, false);
}
/**
* 生成二维码
*
* @param content 内容
* @param destPath 存储地址
* @param needCompress 是否压缩LOGO
* @throws Exception
*/
public static String encode(String content, String destPath, boolean needCompress) throws Exception {
return QRCodeUtils.encode(content, null, destPath, needCompress);
}
/**
* 生成二维码
*
* @param content 内容
* @param destPath 存储地址
* @throws Exception
*/
public static String encode(String content, String destPath) throws Exception {
return QRCodeUtils.encode(content, null, destPath, false);
}
/**
* 生成二维码(内嵌LOGO)
*
* @param content 内容
* @param logoPath LOGO地址
* @param output 输出流
* @param needCompress 是否压缩LOGO
* @throws Exception
*/
public static void encode(String content, String logoPath, OutputStream output, boolean needCompress)
throws Exception {
BufferedImage image = QRCodeUtils.createImage(content, logoPath, needCompress);
ImageIO.write(image, FORMAT, output);
}
/**
* 生成二维码
*
* @param content 内容
* @param output 输出流
* @throws Exception
*/
public static void encode(String content, OutputStream output) throws Exception {
QRCodeUtils.encode(content, null, output, false);
}
/**
* 解析二维码
*
* @param file 二维码图片
* @return
* @throws Exception
*/
public static String decode(File file) throws Exception {
BufferedImage image;
image = ImageIO.read(file);
if (image == null) {
return null;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
result = new MultiFormatReader().decode(bitmap, hints);
String resultStr = result.getText();
return resultStr;
}
/**
* 解析二维码
*
* @param path 二维码图片地址
* @return
* @throws Exception
*/
public static String decode(String path) throws Exception {
return QRCodeUtils.decode(new File(path));
}
public static void main(String[] args) throws Exception {
String text = "http://www.baidu.com";
//不含Logo
// QRCodeUtils.encode(text, null, "e:\\", true);
String tex1 = "www.baidu.com";
//不含Logo
QRCodeUtils.encode(tex1, null, "e:\\", true);
//含Logo,不指定二维码图片名
//QRCodeUtils.encode(text, "E:\\666.jpg", "E:\\", true);
//含Logo,指定二维码图片名
//QRCodeUtils.encode(text, "E:\\logo.png", "E:\\", "qrcode1", true);
//String decode = QRCodeUtil.decode("e:\\qrcode.jpg");
//System.out.println(decode);
}
}
package org.ta.pddserver.PDFTemplate;
import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
public boolean makeZip(String pdfName,Map<String, ByteArrayOutputStream> outMap, String name, HttpServletResponse response) throws IOException {
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("fileName", name);
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
try {
byte[] buf = new byte[1024];
for (String key : outMap.keySet()) {
out.putNextEntry(new ZipEntry(pdfName+"-" + key + ".pdf"));
byte[] data = outMap.get(key).toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(data);
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
response.flushBuffer();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
return false;
}
}
...@@ -10,6 +10,8 @@ public class PddAPIConfig { ...@@ -10,6 +10,8 @@ public class PddAPIConfig {
// 工单API地址 // 工单API地址
public static final String URL_GD = "https://gw-api.pinduoduo.com/api/router"; public static final String URL_GD = "https://gw-api.pinduoduo.com/api/router";
// 基础API地址
public static final String BASE_URL = "https://gw-api.pinduoduo.com/api/router";
// 临沂海际韩国集运 测试环境参数 // 临沂海际韩国集运 测试环境参数
......
package org.ta.pddserver.config;
public class YJTConfig {
// 临沂海际韩国集运 生产环境参数
// 应用基础参数
public static final String CLIENT_ID = "8f5f3f9c92e847b2894fc1c0afce3d62";
public static final String CLIENT_SECRET = "281d79ad5117d20a35efb9e7b0d5f7ee436399b0";
// 基础API地址
public static final String URL = "https://xxxx";
}
...@@ -46,6 +46,7 @@ public class DataGetController { ...@@ -46,6 +46,7 @@ public class DataGetController {
private TraceObjectImpl traceObjectImpl; private TraceObjectImpl traceObjectImpl;
@Resource @Resource
private CollectReceiverDetailImpl collectReceiverDetailImpl; private CollectReceiverDetailImpl collectReceiverDetailImpl;
@Resource
private LogOrderMailDetailIoImpl logOrderMailDetailIoImpl; private LogOrderMailDetailIoImpl logOrderMailDetailIoImpl;
/*待拆包列表*/ /*待拆包列表*/
......
...@@ -434,6 +434,11 @@ public class PddLocalController { ...@@ -434,6 +434,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
//更新log_order_mail_detail //更新log_order_mail_detail
Boolean result = logOrderMailDetailImpl.updateByMailNo(receiveRequest.getMailNo(), logOrderMailDetailIoEntity.getStatus()); Boolean result = logOrderMailDetailImpl.updateByMailNo(receiveRequest.getMailNo(), logOrderMailDetailIoEntity.getStatus());
...@@ -519,6 +524,11 @@ public class PddLocalController { ...@@ -519,6 +524,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
LogOrderMailDetailIoEntity logOrderMailDetailIoEntity = new LogOrderMailDetailIoEntity(); LogOrderMailDetailIoEntity logOrderMailDetailIoEntity = new LogOrderMailDetailIoEntity();
logOrderMailDetailIoEntity.setMailNo(inBoundRequest.getMailNo()); logOrderMailDetailIoEntity.setMailNo(inBoundRequest.getMailNo());
...@@ -619,6 +629,11 @@ public class PddLocalController { ...@@ -619,6 +629,11 @@ public class PddLocalController {
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
// String resp = PddHttpTool.postRequest(requestModel); // String resp = PddHttpTool.postRequest(requestModel);
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
LogOrderMailDetailIoEntity logOrderMailDetailIoEntity = new LogOrderMailDetailIoEntity(); LogOrderMailDetailIoEntity logOrderMailDetailIoEntity = new LogOrderMailDetailIoEntity();
...@@ -761,6 +776,11 @@ public class PddLocalController { ...@@ -761,6 +776,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
// logOrderMailDetailIoEntity.setMailNo(finishUnpackRequest.getMailNo()); // logOrderMailDetailIoEntity.setMailNo(finishUnpackRequest.getMailNo());
...@@ -901,6 +921,11 @@ public class PddLocalController { ...@@ -901,6 +921,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
// logOrderMailDetailIoEntity.setMailNo(finishUnpackRequest.getMailNo()); // logOrderMailDetailIoEntity.setMailNo(finishUnpackRequest.getMailNo());
...@@ -1052,15 +1077,18 @@ public class PddLocalController { ...@@ -1052,15 +1077,18 @@ public class PddLocalController {
for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) { for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) {
PddServiceConsoOutboundRequest.PackageInfo packageInfo = new PddServiceConsoOutboundRequest.PackageInfo(); PddServiceConsoOutboundRequest.PackageInfo packageInfo = new PddServiceConsoOutboundRequest.PackageInfo();
notifyRequest.getPackageInfos().add(packageInfo); notifyRequest.getPackageInfos().add(packageInfo);
if (notifyRequest.getSegmentCode().equals("RETURNSELLER")) {
packageInfo.setOutboundMailNo(outPackage.getMailNo());
packageInfo.setExpressCode(outPackage.getExpressCode());
} else {
// ---- 开始 修改为不认同前端输入,改为系统自动生成 // ---- 开始 修改为不认同前端输入,改为系统自动生成
// packageInfo.setOutboundMailNo(outPackage.getMailNo());
// packageInfo.setExpressCode(outPackage.getExpressCode());
WaybillOperator.WaybillInfo waybillInfo = waybillOperator.generateWaybillInfo(); WaybillOperator.WaybillInfo waybillInfo = waybillOperator.generateWaybillInfo();
packageInfo.setOutboundMailNo(waybillInfo.getMailNo()); packageInfo.setOutboundMailNo(waybillInfo.getMailNo());
packageInfo.setExpressCode(waybillInfo.getExpressCode()); packageInfo.setExpressCode(waybillInfo.getExpressCode());
outPackage.setExpressCode(waybillInfo.getExpressCode()); outPackage.setExpressCode(waybillInfo.getExpressCode());
outPackage.setMailNo(waybillInfo.getMailNo()); outPackage.setMailNo(waybillInfo.getMailNo());
// 结束 ---- // 结束 ----
}
packageInfo.setPackageType(outPackage.getPackageType()); packageInfo.setPackageType(outPackage.getPackageType());
packageInfo.setLength(outPackage.getLength()); packageInfo.setLength(outPackage.getLength());
...@@ -1274,6 +1302,11 @@ public class PddLocalController { ...@@ -1274,6 +1302,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
if (outBoundRequest.getOutPackageList() != null && outBoundRequest.getOutPackageList().size() > 0) { if (outBoundRequest.getOutPackageList() != null && outBoundRequest.getOutPackageList().size() > 0) {
for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) { for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) {
...@@ -1327,6 +1360,11 @@ public class PddLocalController { ...@@ -1327,6 +1360,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
PddServiceConsoDerelictionResponse response = JSON.parseObject(resp, PddServiceConsoDerelictionResponse.class); PddServiceConsoDerelictionResponse response = JSON.parseObject(resp, PddServiceConsoDerelictionResponse.class);
if (response != null) { if (response != null) {
...@@ -1380,6 +1418,11 @@ public class PddLocalController { ...@@ -1380,6 +1418,11 @@ public class PddLocalController {
requestModel.setTimestamp(time); requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET)); requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel); String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多上送信息失败:" + respObject.getString("message") + ";请联系技术人员。");
}
JSONObject response = JSONObject.parseObject(resp).getJSONObject("response"); JSONObject response = JSONObject.parseObject(resp).getJSONObject("response");
if (response != null) { if (response != null) {
......
...@@ -5,11 +5,11 @@ import com.alibaba.fastjson.JSONObject; ...@@ -5,11 +5,11 @@ import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.ta.pddserver.config.PddAPIConfig; import org.ta.pddserver.config.PddAPIConfig;
import org.ta.pddserver.entity.*; import org.ta.pddserver.entity.*;
import org.ta.pddserver.model.ConsignmentOrder;
import org.ta.pddserver.model.api.response.CollectOrderResponse; import org.ta.pddserver.model.api.response.CollectOrderResponse;
import org.ta.pddserver.model.enums.IdentityErrorType; import org.ta.pddserver.model.enums.IdentityErrorType;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel; import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
...@@ -18,14 +18,10 @@ import org.ta.pddserver.model.pddlg.common.TraceObject; ...@@ -18,14 +18,10 @@ import org.ta.pddserver.model.pddlg.common.TraceObject;
import org.ta.pddserver.model.pddlg.request.LGBaseModel; import org.ta.pddserver.model.pddlg.request.LGBaseModel;
import org.ta.pddserver.model.pddlg.request.PddLogisticsCoTrackQueryRequest; import org.ta.pddserver.model.pddlg.request.PddLogisticsCoTrackQueryRequest;
import org.ta.pddserver.model.pddlg.request.PddLogisticsCoTrackSubRequest; import org.ta.pddserver.model.pddlg.request.PddLogisticsCoTrackSubRequest;
import org.ta.pddserver.rabbit.RabbitYJTSender;
import org.ta.pddserver.service.impl.*; import org.ta.pddserver.service.impl.*;
import org.ta.pddserver.utils.JsonResponse; import org.ta.pddserver.utils.*;
import org.ta.pddserver.utils.PddJYPriceTool;
import org.ta.pddserver.utils.PddSignTool;
import org.ta.pddserver.utils.WorldexUtil;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -33,6 +29,10 @@ import java.util.List; ...@@ -33,6 +29,10 @@ import java.util.List;
@RestController @RestController
public class PddOpenController { public class PddOpenController {
@Value("${pdd.jyt}")
private Integer jyt;
@Resource @Resource
private OrderCreateImpl orderCreateImpl; private OrderCreateImpl orderCreateImpl;
@Resource @Resource
...@@ -95,6 +95,9 @@ public class PddOpenController { ...@@ -95,6 +95,9 @@ public class PddOpenController {
@Resource @Resource
ManufacturerImpl manufacturerImpl; ManufacturerImpl manufacturerImpl;
// @Resource
RabbitYJTSender rabbitYJTSender;
@PostMapping("/pdd-open") @PostMapping("/pdd-open")
public JSONObject pddOpenAPI(HttpServletRequest request, public JSONObject pddOpenAPI(HttpServletRequest request,
@RequestBody JYBaseRequestModel requestParam) { @RequestBody JYBaseRequestModel requestParam) {
...@@ -102,13 +105,19 @@ public class PddOpenController { ...@@ -102,13 +105,19 @@ public class PddOpenController {
if (StringUtils.isEmpty(pdd_sign)) { if (StringUtils.isEmpty(pdd_sign)) {
log.error("pdd_sign is empty"); log.error("pdd_sign is empty");
} }
String body = getStringFromRequest(request); String body = HttpRequestHandlerTool.getStringFromRequest(request);
log.info("Request:\n{}", body); log.info("Request:\n{}", body);
try { try {
if (!PddSignTool.verifySignFromBody(body, "PddAPIConfig.CLIENT_SECRET", pdd_sign)) { if (!PddSignTool.verifySignFromBody(body, PddAPIConfig.CLIENT_SECRET, pdd_sign)) {
log.error("验签失败"); log.error("验签失败");
} }
if (this.jyt > 0) {
// 转发给yjt
rabbitYJTSender.mqSendToYJTFromPdd(body);
}
switch (requestParam.getType()) { switch (requestParam.getType()) {
case "pdd.service.conso.order.create": { case "pdd.service.conso.order.create": {
PddServiceConsoOrderCreateRequest createParam = JSON.parseObject(body, PddServiceConsoOrderCreateRequest.class); PddServiceConsoOrderCreateRequest createParam = JSON.parseObject(body, PddServiceConsoOrderCreateRequest.class);
...@@ -277,25 +286,7 @@ public class PddOpenController { ...@@ -277,25 +286,7 @@ public class PddOpenController {
return jsonObject; return jsonObject;
} }
/**
* 获取请求消息体文本
*
* @param request 请求
* @return 消息体文本
*/
private static String getStringFromRequest(HttpServletRequest request) {
StringBuffer buffer = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} catch (IOException e) {
log.error(e.getMessage());
}
return buffer.toString();
}
@PostMapping("/pdd-lg") @PostMapping("/pdd-lg")
public JSONObject pddLogisticAPI(HttpServletRequest request, public JSONObject pddLogisticAPI(HttpServletRequest request,
...@@ -308,7 +299,7 @@ public class PddOpenController { ...@@ -308,7 +299,7 @@ public class PddOpenController {
if (!PddSignTool.verifyLGSign(requestParam, PddAPIConfig.CLIENT_SECRET)) { if (!PddSignTool.verifyLGSign(requestParam, PddAPIConfig.CLIENT_SECRET)) {
log.error("验签失败"); log.error("验签失败");
} }
String body = getStringFromRequest(request); String body = HttpRequestHandlerTool.getStringFromRequest(request);
log.info("Request:\n{}", body); log.info("Request:\n{}", body);
switch (requestParam.getType()) { switch (requestParam.getType()) {
......
package org.ta.pddserver.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.ta.pddserver.entity.LogOrderBuyerDetailEntity;
import org.ta.pddserver.entity.LogOrderItemEntity;
import org.ta.pddserver.entity.LogOrderMailDetailEntity;
import org.ta.pddserver.entity.OrderCreateEntity;
import org.ta.pddserver.service.impl.LogOrderBuyerDetailImpl;
import org.ta.pddserver.service.impl.LogOrderItemImpl;
import org.ta.pddserver.service.impl.LogOrderMailDetailImpl;
import org.ta.pddserver.service.impl.OrderCreateImpl;
import java.util.List;
@RestController
//@RequestMapping("/test")
@Slf4j
public class TestController {
@Resource
OrderCreateImpl orderCreateImpl;
@Resource
LogOrderBuyerDetailImpl logOrderBuyerDetailImpl;
@Resource
LogOrderItemImpl logOrderItemImpl;
@Resource
LogOrderMailDetailImpl logOrderMailDetailImpl;
// @GetMapping("")
public String test() {
List<OrderCreateEntity> orderCreateEntityList = orderCreateImpl.list();
for (OrderCreateEntity orderCreateEntity : orderCreateEntityList) {
String logisticsOrderCode = orderCreateEntity.getLogisticsOrderCode();
LogOrderBuyerDetailEntity buyerDetailEntity = logOrderBuyerDetailImpl.getByOrderCode(logisticsOrderCode);
if (buyerDetailEntity == null) {
log.info("{} 缺少购买者详情信息。 ------------", logisticsOrderCode);
String buyerDetails = orderCreateEntity.getBuyerDetail();
}
List<LogOrderMailDetailEntity> mailDetailEntityList = logOrderMailDetailImpl.getListByCode(logisticsOrderCode);
String mailDetails = orderCreateEntity.getMailDetails();
JSONArray mailArr = JSONArray.parseArray(mailDetails);
if (mailDetailEntityList.size() < mailArr.size()) {
log.info("{} 包裹信息异常 应该 {} 个, 现有{}个。", logisticsOrderCode, mailArr.size(), mailDetailEntityList.size());
// LogOrderMailDetailEntity mailDetailEntity = new LogOrderMailDetailEntity();
// mailDetailEntity.setUid(orderCreateEntity.getUid());
// mailDetailEntity.setLogisticsOrderCode(logisticsOrderCode);
// mailDetailEntity.setMailNo(mailArr.getJSONObject(0).getString("mailNo"));
// mailDetailEntity.setExpressCode(mailArr.getJSONObject(0).getString("expressCode"));
// mailDetailEntity.setStatus(1);
// mailDetailEntity.setCreated(orderCreateEntity.getCreated());
// mailDetailEntity.setUpdated(orderCreateEntity.getUpdated());
// mailDetailEntity.setRemarks("add");
// logOrderMailDetailImpl.save(mailDetailEntity);
}
String items = orderCreateEntity.getItems();
JSONArray itemArr = JSONArray.parseArray(items);
List<LogOrderItemEntity> itemEntityList = logOrderItemImpl.getByCode(logisticsOrderCode);
if (itemEntityList.size() != itemArr.size()) {
log.info("{} 商品信息异常 应该 {} 个, 现有{}个。", logisticsOrderCode, itemArr.size(), itemEntityList.size());
// LogOrderItemEntity orderItemEntity = new LogOrderItemEntity();
// JSONObject itemObject = itemArr.getJSONObject(0);
// orderItemEntity.setUid(itemObject.getString("uid"));
// orderItemEntity.setLogisticsOrderCode(orderCreateEntity.getLogisticsOrderCode());
// orderItemEntity.setItemId(itemObject.getString("itemId"));
// orderItemEntity.setItemName(itemObject.getString("itemName"));
// orderItemEntity.setCategoryId(itemObject.getLong("categoryId"));
// orderItemEntity.setCategoryName(itemObject.getString("categoryName"));
// orderItemEntity.setTotalActualPayment(itemObject.getLong("totalActualPayment"));
// orderItemEntity.setCurrencyUnit(itemObject.getString("currencyUnit"));
// orderItemEntity.setCurrency(itemObject.getString("currency"));
// orderItemEntity.setItemQuantity(itemObject.getInteger("itemQuantity"));
// orderItemEntity.setItemPicUrl(itemObject.getString("itemPicUrl"));
// orderItemEntity.setItemSkuProperty(itemObject.getString("itemSkuProperty"));
// orderItemEntity.setChargedStatus(itemObject.getBoolean("chargedStatus"));
// orderItemEntity.setGoodsType(itemObject.getString("goodsType"));
// orderItemEntity.setMagneticStatus(itemObject.getBoolean("magneticStatus"));
// orderItemEntity.setCreated(orderCreateEntity.getCreated());
// orderItemEntity.setUpdated(orderCreateEntity.getUpdated());
// orderItemEntity.setRemarks("add");
// logOrderItemImpl.save(orderItemEntity);
}
}
return "end";
}
}
package org.ta.pddserver.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.ta.pddserver.config.PddAPIConfig;
import org.ta.pddserver.config.YJTConfig;
import org.ta.pddserver.mapper.YjtLogMapper;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
import org.ta.pddserver.rabbit.RabbitYJTSender;
import org.ta.pddserver.utils.HttpRequestHandlerTool;
import org.ta.pddserver.utils.JsonResponse;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
import java.util.Date;
@RestController
@RequestMapping("/yjt")
@Slf4j
public class YJTController {
// @Resource
private RabbitYJTSender rabbitYJTSender;
@Value("${pdd.jyt}")
private Integer jyt;
@PostMapping("/toPdd")
public Object sendToPDD(HttpServletRequest request) {
String body = HttpRequestHandlerTool.getStringFromRequest(request);
log.info("Receive YJT Request:\n{}", body);
JSONObject jsonObject = JSON.parseObject(body);
if (!PddSignTool.verifySignFromBody(jsonObject.getString("request"), YJTConfig.CLIENT_SECRET, jsonObject.getString("sign"))) {
log.error("验签失败");
return JsonResponse.generateOpenCommonFailedResponse(-1, "验签失败");
}
if (this.jyt > 0) {
// 通过rabbit保存数据
rabbitYJTSender.mqSaveMsgFromYjt(body, HttpRequestHandlerTool.getClientIP(request));
}
JYBaseRequestModel requestModel = new JYBaseRequestModel();
requestModel.setRequest(jsonObject.getString("request"));
requestModel.setRequest_id("" + new Date().getTime());
requestModel.setType(jsonObject.getString("type"));
requestModel.setTarget_client_id(PddAPIConfig.CLIENT_ID);
requestModel.setClient_id(PddAPIConfig.CLIENT_ID);
long time = new Date().getTime() / 1000;
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel);
return resp;
}
}
package org.ta.pddserver.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("yjt_log")
public class YjtLogEntity {
@TableId(value = "id")
private Long id;
@TableField(value = "time")
private Date time;
@TableField(value = "msg")
private String msg;
/**
* 来源ip
*/
@TableField(value = "ip")
private String ip;
}
package org.ta.pddserver.lotto;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.oned.Code128Writer;
import com.google.zxing.oned.Code39Writer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
public class BarcodeUtils {
// 条形码默认宽度
private static final int DEFAULT_WIDTH = 300;
// 条形码默认高度
private static final int DEFAULT_HEIGHT = 100;
// 条形码默认颜色(黑色)
private static final Color DEFAULT_BAR_COLOR = Color.BLACK;
// 条形码背景色(白色)
private static final Color DEFAULT_BACKGROUND_COLOR = Color.WHITE;
/**
* 生成条形码图片(返回字节数组,支持直接输出到前端)
*
* @param content 条形码内容(如"123456789012")
* @param width 宽度
* @param height 高度
* @param barColor 条码颜色
* @param bgColor 背景颜色
* @param withText 是否在条码下方显示文本
* @return 条形码图片字节数组(PNG格式)
*/
public static byte[] generateBarcode(String content, int width, int height,
Color barColor, Color bgColor, boolean withText, int bit) throws WriterException, IOException {
// 1. 校验参数
if (content == null || content.isEmpty()) {
throw new IllegalArgumentException("条形码内容不能为空");
}
width = Math.max(width, DEFAULT_WIDTH);
height = Math.max(height, DEFAULT_HEIGHT);
// 2. 设置条形码参数(编码格式:Code128,支持数字、字母、特殊字符)
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 字符集
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 纠错等级
hints.put(EncodeHintType.MARGIN, 0);
// 3. 生成条形码矩阵
BitMatrix bitMatrix = null;
if (bit == 39) {
Code39Writer writer = new Code39Writer();
bitMatrix = writer.encode(content, BarcodeFormat.CODE_39, width, width / 3, hints);
} else if (bit == 128) {
Code128Writer writer = new Code128Writer();
bitMatrix = writer.encode(content, BarcodeFormat.CODE_128, width, height, hints);
}
// 4. 转换为BufferedImage
BufferedImage barcodeImage = toBufferedImage(bitMatrix, barColor, bgColor);
// 5. 若需要显示文本,在条码下方添加内容
if (withText) {
barcodeImage = addTextBelowBarcode(barcodeImage, content);
}
// 6. 转为字节数组(PNG格式)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(barcodeImage, "png", baos);
return baos.toByteArray();
}
/**
* 生成默认样式的条形码(简化方法)
*/
public static byte[] generateDefaultBarcode(String content) throws WriterException, IOException {
return generateBarcode(content, DEFAULT_WIDTH, DEFAULT_HEIGHT,
DEFAULT_BAR_COLOR, DEFAULT_BACKGROUND_COLOR, false, 128);
}
/**
* 生成默认样式的条形码(简化方法)
*/
public static byte[] generateDefaultBarcode(String content, int width, int height) throws WriterException, IOException {
return generateBarcode(content, width, height,
DEFAULT_BAR_COLOR, DEFAULT_BACKGROUND_COLOR, false, 128);
}
/**
* 生成39的条形码(简化方法)
*/
public static byte[] generate39Barcode(String content, int width, int height) throws WriterException, IOException {
return generateBarcode(content, width, height,
DEFAULT_BAR_COLOR, Color.red, false, 39);
}
/**
* 生成128条形码(简化方法)
*/
public static byte[] generate128Barcode(String content, int width, int height) throws WriterException, IOException {
return generateBarcode(content, width, height,
DEFAULT_BAR_COLOR, DEFAULT_BACKGROUND_COLOR, false, 128);
}
/**
* 将BitMatrix转换为BufferedImage
*/
private static BufferedImage toBufferedImage(BitMatrix matrix, Color barColor, Color bgColor) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int barRGB = barColor.getRGB();
int bgRGB = bgColor.getRGB();
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
// 矩阵中true表示条码(前景色),false表示背景
image.setRGB(x, y, matrix.get(x, y) ? barRGB : bgRGB);
}
}
return image;
}
/**
* 在条形码下方添加文本(显示条形码内容)
*/
private static BufferedImage addTextBelowBarcode(BufferedImage barcodeImage, String text) {
int width = barcodeImage.getWidth();
int height = barcodeImage.getHeight();
int textHeight = 30; // 文本区域高度
// 创建新的图片(原高度 + 文本高度)
BufferedImage newImage = new BufferedImage(width, height + textHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = newImage.createGraphics();
// 1. 绘制原条形码
g2d.drawImage(barcodeImage, 0, 0, null);
// 2. 绘制文本背景(白色)
g2d.setColor(DEFAULT_BACKGROUND_COLOR);
g2d.fillRect(0, height, width, textHeight);
// 3. 绘制文本(居中)
g2d.setColor(DEFAULT_BAR_COLOR);
g2d.setFont(new Font("Arial", Font.PLAIN, 16)); // 文本字体
FontMetrics metrics = g2d.getFontMetrics();
int textX = (width - metrics.stringWidth(text)) / 2; // 水平居中
int textY = height + textHeight - 5; // 垂直位置(距离底部5px)
g2d.drawString(text, textX, textY);
g2d.dispose();
return newImage;
}
/**
* 解析条形码图片,获取内容
*
* @param imagePath 图片路径
* @return 条形码内容
*/
public static String parseBarcode(String imagePath) throws IOException, NotFoundException {
BufferedImage image = ImageIO.read(new File(imagePath));
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
// 设置解析参数
Map<DecodeHintType, Object> hints = new HashMap<>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
// 解析条形码
Result result = new MultiFormatReader().decode(bitmap, hints);
return result.getText();
}
/**
* 解析条形码字节数组(适用于网络传输的图片)
*/
public static String parseBarcode(byte[] imageBytes) throws IOException, NotFoundException {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Map<DecodeHintType, Object> hints = new HashMap<>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
Result result = new MultiFormatReader().decode(bitmap, hints);
return result.getText();
}
}
\ No newline at end of file
package org.ta.pddserver.lotto;
import com.google.zxing.WriterException;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.properties.HorizontalAlignment;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ImagePdfGenerator {
public static byte[] generatePdfWithTextImage() throws Exception {
// 1. 将文字转为图片(示例:韩文“안녕하세요,世界!”)
byte[] imageBytes = TextToImageUtils.textToImage(
"317758904820",
"1172",
"REN SUPING",
"010-3619-****",
"21353",
"인천광역시 부평구 부평동 126-9 유진마젤란주상복합 오피스텔1205호",
"PP25111223915187411540070",
"B-26-평64",
"X 부평구 부평5동",
"부평(대)",
"평64-이구용"
);
// 2. 初始化PDF
ByteArrayOutputStream pdfBaos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(pdfBaos);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc, new PageSize((int) (150 * 300 / 25.4), (int) (100 * 300 / 25.4)));
// 3. 将图片嵌入PDF
ImageData imageData = ImageDataFactory.create(imageBytes);
Image image = new Image(imageData);
// 设置图片在PDF中居中显示
image.setHorizontalAlignment(HorizontalAlignment.LEFT);
document.add(image);
// 4. 关闭文档
document.close();
return pdfBaos.toByteArray();
}
}
\ No newline at end of file
...@@ -2,9 +2,12 @@ package org.ta.pddserver.mapper; ...@@ -2,9 +2,12 @@ package org.ta.pddserver.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.ta.pddserver.entity.LogOrderBuyerDetailEntity; import org.ta.pddserver.entity.LogOrderBuyerDetailEntity;
@Mapper @Mapper
public interface LogOrderBuyerDetailMapper extends BaseMapper<LogOrderBuyerDetailEntity> { public interface LogOrderBuyerDetailMapper extends BaseMapper<LogOrderBuyerDetailEntity> {
@Select("SELECT * FROM `log_order_buyer_detail` WHERE `logisticsOrderCode` = #{logisticsOrderCode};")
LogOrderBuyerDetailEntity findByOrderCode(String logisticsOrderCode);
} }
...@@ -14,4 +14,7 @@ public interface LogOrderItemMapper extends BaseMapper<LogOrderItemEntity> { ...@@ -14,4 +14,7 @@ public interface LogOrderItemMapper extends BaseMapper<LogOrderItemEntity> {
@Select("SELECT `itemName`, `categoryName`, `totalActualPayment`,`currencyUnit`, `currency`, `itemQuantity`, `itemPicUrl`,`itemSkuProperty`,`chargedStatus`,`goodsType`,`magneticStatus` FROM `log_order_item` WHERE `logisticsOrderCode` = #{logisticsOrderCode}") @Select("SELECT `itemName`, `categoryName`, `totalActualPayment`,`currencyUnit`, `currency`, `itemQuantity`, `itemPicUrl`,`itemSkuProperty`,`chargedStatus`,`goodsType`,`magneticStatus` FROM `log_order_item` WHERE `logisticsOrderCode` = #{logisticsOrderCode}")
List<LogOrderItemResponse> getListByLogisticsOrderCode(@Param("logisticsOrderCode") String logisticsOrderCode); List<LogOrderItemResponse> getListByLogisticsOrderCode(@Param("logisticsOrderCode") String logisticsOrderCode);
@Select("SELECT * FROM `log_order_item` WHERE `logisticsOrderCode` = #{logisticsOrderCode};")
List<LogOrderItemEntity> getListByOrderCode(String logisticsOrderCode);
} }
package org.ta.pddserver.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.ta.pddserver.entity.YjtLogEntity;
@Mapper
public interface YjtLogMapper extends BaseMapper<YjtLogEntity> {
}
package org.ta.pddserver.rabbit;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import org.ta.pddserver.entity.YjtLogEntity;
import org.ta.pddserver.service.impl.YjtLogImpl;
import org.ta.pddserver.utils.YjtHttpTool;
import java.util.Date;
//@Component
@Slf4j
public class RabbitYJTSender {
private static final String SEND_TO_YJT = "SEND_TO_YJT";
private static final String SAVE_FROM_YGT = "SAVE_FROM_YGT";
@Resource
AmqpAdmin amqpAdmin;
@Resource
RabbitTemplate rabbitTemplate;
@Resource
YjtLogImpl yjtLogImpl;
@PostConstruct
public void init() {
// 声明QUEUE
amqpAdmin.declareQueue(new Queue(SEND_TO_YJT));
amqpAdmin.declareQueue(new Queue(SAVE_FROM_YGT));
}
/**
* 将拼多多发送过来的消息发送给Yjt
*
* @param msg 待转发消息信息
*/
public void mqSendToYJTFromPdd(String msg) {
rabbitTemplate.convertAndSend(SEND_TO_YJT, msg);
}
/**
* 异步保存来自Yjt的信息
*
* @param msg 待转发消息信息
*/
public void mqSaveMsgFromYjt(String msg, String ip) {
rabbitTemplate.convertAndSend(SAVE_FROM_YGT, msg + "~~" + ip);
}
/**
* 转发消息
*
* @param message 消息信息
*/
@RabbitListener(queues = SEND_TO_YJT)
public void handleSendToYJTFromPdd(Message message) {
String msg = new String(message.getBody());
YjtHttpTool.sendJsonPost(msg);
}
/**
* 异步保存来自Yjt的信息
*
* @param message 消息信息
*/
@RabbitListener(queues = SEND_TO_YJT)
public void handleSaveMsgFromYjt(Message message) {
String msg = new String(message.getBody());
String[] msgs = msg.split("~~");
YjtLogEntity yjtLogEntity = new YjtLogEntity();
yjtLogEntity.setMsg(msgs[0]);
yjtLogEntity.setIp(msgs[1]);
yjtLogEntity.setTime(new Date());
if (!yjtLogImpl.save(yjtLogEntity)) {
log.error("日志保存失败,内容为:\n" + msg);
}
}
}
package org.ta.pddserver.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.ta.pddserver.entity.YjtLogEntity;
public interface YjtLogService extends IService<YjtLogEntity> {
}
...@@ -10,4 +10,7 @@ import org.ta.pddserver.service.LogOrderBuyerDetailService; ...@@ -10,4 +10,7 @@ import org.ta.pddserver.service.LogOrderBuyerDetailService;
@Service @Service
public class LogOrderBuyerDetailImpl extends ServiceImpl<LogOrderBuyerDetailMapper, LogOrderBuyerDetailEntity> implements LogOrderBuyerDetailService { public class LogOrderBuyerDetailImpl extends ServiceImpl<LogOrderBuyerDetailMapper, LogOrderBuyerDetailEntity> implements LogOrderBuyerDetailService {
public LogOrderBuyerDetailEntity getByOrderCode(String logisticsOrderCode) {
return this.baseMapper.findByOrderCode(logisticsOrderCode);
}
} }
\ No newline at end of file
...@@ -16,4 +16,8 @@ public class LogOrderItemImpl extends ServiceImpl<LogOrderItemMapper, LogOrderIt ...@@ -16,4 +16,8 @@ public class LogOrderItemImpl extends ServiceImpl<LogOrderItemMapper, LogOrderIt
public List<LogOrderItemResponse> getListByLogisticsOrderCode(String logisticsOrderCode) { public List<LogOrderItemResponse> getListByLogisticsOrderCode(String logisticsOrderCode) {
return baseMapper.getListByLogisticsOrderCode(logisticsOrderCode); return baseMapper.getListByLogisticsOrderCode(logisticsOrderCode);
} }
public List<LogOrderItemEntity> getByCode(String logisticsOrderCode) {
return baseMapper.getListByOrderCode(logisticsOrderCode);
}
} }
\ No newline at end of file
package org.ta.pddserver.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.ta.pddserver.entity.YjtLogEntity;
import org.ta.pddserver.mapper.YjtLogMapper;
import org.ta.pddserver.service.YjtLogService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class YjtLogImpl extends ServiceImpl<YjtLogMapper, YjtLogEntity> implements YjtLogService {
}
\ No newline at end of file
...@@ -3,6 +3,7 @@ package org.ta.pddserver.serviceutil; ...@@ -3,6 +3,7 @@ package org.ta.pddserver.serviceutil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -18,7 +19,7 @@ import java.util.List; ...@@ -18,7 +19,7 @@ import java.util.List;
@Component @Component
@Slf4j @Slf4j
//@EnableScheduling @EnableScheduling
public class GDOperator { public class GDOperator {
@Resource @Resource
...@@ -26,8 +27,12 @@ public class GDOperator { ...@@ -26,8 +27,12 @@ public class GDOperator {
@Resource @Resource
private GDAttachmentImpl gDAttachmentImpl; private GDAttachmentImpl gDAttachmentImpl;
// @Scheduled(fixedRate = 1000 * 60 * 5, initialDelay = 1000) // 每5分钟执行一次 @Value("${pdd.gd}")
private Integer gd;
@Scheduled(fixedRate = 1000 * 60 * 5, initialDelay = 1000) // 每5分钟执行一次
public void getGdTickets() { public void getGdTickets() {
if (gd > 0) {
List<GDTicketRepsonse> list = PddGDUtil.getTickets(); List<GDTicketRepsonse> list = PddGDUtil.getTickets();
log.info("{} 工单数量:{}", new Date().toLocaleString(), list.size()); log.info("{} 工单数量:{}", new Date().toLocaleString(), list.size());
for (GDTicketRepsonse gdTicketRepsonse : list) { for (GDTicketRepsonse gdTicketRepsonse : list) {
...@@ -84,4 +89,5 @@ public class GDOperator { ...@@ -84,4 +89,5 @@ public class GDOperator {
} }
} }
} }
}
} }
...@@ -4,6 +4,7 @@ import jakarta.annotation.PostConstruct; ...@@ -4,6 +4,7 @@ import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.ta.pddserver.entity.WaybillSeaEntity; import org.ta.pddserver.entity.WaybillSeaEntity;
import org.ta.pddserver.service.impl.WaybillSeaImpl; import org.ta.pddserver.service.impl.WaybillSeaImpl;
...@@ -17,6 +18,9 @@ public class WaybillOperator { ...@@ -17,6 +18,9 @@ public class WaybillOperator {
WaybillSeaEntity currentWaybillSea; WaybillSeaEntity currentWaybillSea;
@Value("${pdd.lotto}")
private Integer lotto;
@PostConstruct @PostConstruct
public void init() { public void init() {
log.info("初始化 WaybillOperator,获取当前面单池状态"); log.info("初始化 WaybillOperator,获取当前面单池状态");
...@@ -36,8 +40,11 @@ public class WaybillOperator { ...@@ -36,8 +40,11 @@ public class WaybillOperator {
} }
waybillInfo.setExpressCode(currentWaybillSea.getExpressCode()); waybillInfo.setExpressCode(currentWaybillSea.getExpressCode());
waybillInfo.setMailNo("" + currentNo + verifyByte); waybillInfo.setMailNo("" + currentNo + verifyByte);
if (this.lotto > 0) {
// 测试不更新
currentWaybillSea.setCurrentNo(currentNo); currentWaybillSea.setCurrentNo(currentNo);
waybillSeaImpl.updateById(currentWaybillSea); waybillSeaImpl.updateById(currentWaybillSea);
}
return waybillInfo; return waybillInfo;
} }
......
package org.ta.pddserver.utils; package org.ta.pddserver.utils;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
@Slf4j
public class HttpRequestHandlerTool { public class HttpRequestHandlerTool {
private static String getClientIP(HttpServletRequest request) { public static String getClientIP(HttpServletRequest request) {
String xForwardedFor = request.getHeader("X-Forwarded-For"); String xForwardedFor = request.getHeader("X-Forwarded-For");
if (xForwardedFor != null && !xForwardedFor.isEmpty()) { if (xForwardedFor != null && !xForwardedFor.isEmpty()) {
...@@ -20,4 +25,24 @@ public class HttpRequestHandlerTool { ...@@ -20,4 +25,24 @@ public class HttpRequestHandlerTool {
return request.getRemoteAddr(); return request.getRemoteAddr();
} }
/**
* 获取请求消息体文本
*
* @param request 请求
* @return 消息体文本
*/
public static String getStringFromRequest(HttpServletRequest request) {
StringBuffer buffer = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} catch (IOException e) {
log.error(e.getMessage());
}
return buffer.toString();
}
} }
...@@ -55,7 +55,7 @@ public class PddHttpTool { ...@@ -55,7 +55,7 @@ public class PddHttpTool {
// } // }
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json // 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.set("X-Canary-Staging", "staging"); // headers.set("X-Canary-Staging", "staging"); // 测试联调,专用
headers.add("Content-Type", "application/json;charset=UTF-8"); headers.add("Content-Type", "application/json;charset=UTF-8");
HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers); HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers);
...@@ -77,7 +77,7 @@ public class PddHttpTool { ...@@ -77,7 +77,7 @@ public class PddHttpTool {
log.info("REQ:{}", JSONObject.toJSONString(requestObj)); log.info("REQ:{}", JSONObject.toJSONString(requestObj));
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json // 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.set("X-Canary-Staging", "staging"); // headers.set("X-Canary-Staging", "staging"); // 测试联调,专用
headers.add("Content-Type", "application/json;charset=UTF-8"); headers.add("Content-Type", "application/json;charset=UTF-8");
HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers); HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers);
...@@ -99,7 +99,7 @@ public class PddHttpTool { ...@@ -99,7 +99,7 @@ public class PddHttpTool {
// log.info("REQ:{}", JSONObject.toJSONString(requestObj)); // log.info("REQ:{}", JSONObject.toJSONString(requestObj));
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json // 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.set("X-Canary-Staging", "staging"); // headers.set("X-Canary-Staging", "staging"); // 测试联调,专用
headers.add("Content-Type", "application/json;charset=UTF-8"); headers.add("Content-Type", "application/json;charset=UTF-8");
HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers); HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers);
...@@ -120,4 +120,31 @@ public class PddHttpTool { ...@@ -120,4 +120,31 @@ public class PddHttpTool {
*/ */
return resp.getBody(); return resp.getBody();
} }
public static String sendJsonPostBase(Object requestObj) {
log.info("REQ:{}", JSONObject.toJSONString(requestObj));
// if (requestObj != null) {
// throw new RuntimeException("强制截断");
// }
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
HttpHeaders headers = new HttpHeaders();
// headers.set("X-Canary-Staging", "staging"); // 测试联调,专用
headers.add("Content-Type", "application/json;charset=UTF-8");
HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers);
// 2. 封装请求实体(参数 + 头信息)
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resp = restTemplate.postForEntity(PddAPIConfig.BASE_URL, requestEntity, String.class);
log.info("RESP:{}", resp.getBody());
if (logsPddIoImpl != null) {
LogsPddIoEntity logsPddIoEntity = new LogsPddIoEntity();
logsPddIoEntity.setAction("JY");
logsPddIoEntity.setReq(JSONObject.toJSONString(requestObj));
logsPddIoEntity.setResp(resp.getBody());
logsPddIoImpl.save(logsPddIoEntity);
}
return resp.getBody();
}
} }
package org.ta.pddserver.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.ta.pddserver.config.YJTConfig;
@Slf4j
public class YjtHttpTool {
public static String sendJsonPost(String msg) {
log.info("SEND TO YJT REQ:{}", msg);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json;charset=UTF-8");
HttpEntity<String> requestEntity = new HttpEntity<>(msg, headers);
// 2. 封装请求实体(参数 + 头信息)
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resp = restTemplate.postForEntity(YJTConfig.URL, requestEntity, String.class);
log.info("RESP:{}", resp.getBody());
return resp.getBody();
}
}
spring: spring:
rabbitmq:
password: pdd
username: pdd
host: 127.0.0.1
port: 5672
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.2.222:3306/pdd_api?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT # url: jdbc:mysql://192.168.2.222:3306/pdd_api?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
# username: root # username: root
# password: root # password: root
# url: jdbc:mysql://lyhj-mysql.mysql.rds.aliyuncs.com:3306/pdd_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT url: jdbc:mysql://lyhj-mysql.mysql.rds.aliyuncs.com:3306/pdd_prod?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
# username: pdd
# password: pdd123
url: jdbc:mysql://rm-j6cv8n7zx12x0sqreuo.mysql.rds.aliyuncs.com:3306/pdd_prod?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
username: pdd username: pdd
password: pdd123 password: pdd123
# url: jdbc:mysql://rm-j6cv8n7zx12x0sqreuo.mysql.rds.aliyuncs.com:3306/pdd_prod?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
# username: pdd
# password: pdd123
hikari: hikari:
minimum-idle: 5 # 最小空闲连接数 minimum-idle: 5 # 最小空闲连接数
maximum-pool-size: 10 # 最大活跃连接数 maximum-pool-size: 10 # 最大活跃连接数
...@@ -27,7 +32,12 @@ logging: ...@@ -27,7 +32,12 @@ logging:
level: level:
org: org:
ta: ta:
pddserver: debug pddserver: info
mybatis-plus: mybatis-plus:
configuration: configuration:
map-underscore-to-camel-case: false map-underscore-to-camel-case: false
pdd:
jyt: 0
gd: 0
lotto: 0
\ No newline at end of file
...@@ -982,4 +982,25 @@ public class CommonTest { ...@@ -982,4 +982,25 @@ public class CommonTest {
Boolean result = WorldexUtil.noticePddOrderOut("PP25111223915187411540070"); Boolean result = WorldexUtil.noticePddOrderOut("PP25111223915187411540070");
log.info("result:{}", result); log.info("result:{}", result);
} }
/**
* 获取快递公司信息
*/
@Test
public void companies() {
JYBaseRequestModel requestModel = new JYBaseRequestModel();
requestModel.setRequest("{}");
requestModel.setRequest_id("" + new Date().getTime());
requestModel.setType("pdd.logistics.companies.get");
requestModel.setTarget_client_id(PddAPIConfig.CLIENT_ID);
requestModel.setClient_id(PddAPIConfig.CLIENT_ID);
long time = new Date().getTime() / 1000;
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(requestModel));
// String resp = PddHttpTool.postRequest(requestModel);
String resp = PddHttpTool.sendJsonPostBase(requestModel);
log.info("resp = {}", resp);
}
} }
package org.ta.pddserver;
import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Test;
import org.ta.pddserver.lotto.ImagePdfGenerator;
import org.ta.pddserver.model.to.PrintOrderInfoTO;
import java.awt.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class PdfTest {
@Test
public void generatePDF() throws Exception {
PrintOrderInfoTO formData = new PrintOrderInfoTO();
formData.setExpressTag("운송장번호;");
formData.setExpressUid("317758904816");
formData.setLandingUid("123456789012");
formData.setAddressUpperLeft("B-26-평64");
formData.setAddressUpperRight("부평(대)");
formData.setAddressBottomLeft("X 부평구 부평5동");
formData.setAddressBottomRight("평64-이구용");
formData.setRecipient("받는분: REN SUPING 010-3619-****21353");
formData.setDetailedAddress("인천광역시 부평구 부평동 126-9 유진마젤란주상복합 오피스텔1205");
formData.setOrderCore("PP25111223915187411540070");
// new PdfUtil().printSaleInfo(formData, null);
//System.out.println("file:" + returnString);
}
@Test
public void test2() throws IOException {
File file = new File("E:/lotte_T.png");
FileInputStream imageInFile = new FileInputStream(file);
byte[] imageData = new byte[(int) file.length()];
imageInFile.read(imageData);
String base64Image = Base64.encodeBase64String(imageData);
System.out.println(base64Image);
}
@Test
public void test3() throws Exception {
try (FileOutputStream outputStream = new FileOutputStream("./test.pdf")) {
byte[] strToBytes = ImagePdfGenerator.generatePdfWithTextImage();
outputStream.write(strToBytes);
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
} catch (FontFormatException e) {
throw new RuntimeException(e);
}
}
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment