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.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.ta.pddserver.cos.Uploader;
import org.ta.pddserver.model.to.PrintOrderInfoTO;
import org.ta.pddserver.utils.TimeTool;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static org.ta.pddserver.PDFTemplate.BarCodeUtils.getBarCode;
import static org.ta.pddserver.PDFTemplate.BarCodeUtils.insertWords;
@Slf4j
public class PdfUtil {
private static final String SALE_SAMPLE_PDF = "./pdfs/FormSale-sample.pdf";
private static final String LOTTE_LOGO = "lotte_logo.png";
private static final String LOTTE_T = "lotte_T.png";
public String printSaleInfo(PrintOrderInfoTO formData, HttpServletResponse response) throws Exception{
String returnString="";
try {
//文件路径
Map<String, Object> data = new HashMap<>();//要插入的数据
data.put("pageNo", "1/1");
data.put("feeTag", "배송비고:");
data.put("goodNameTag", "상품명:");
data.put("goodName", "E-commerce consuming goods");
data.put("printTime", new TimeTool().getNowDateString());
data.put("recipient", "받는분: " + formData.getRecipient());
data.put("detailedAddress", "상품명: " + formData.getDetailedAddress());
data.put("expressTag", formData.getExpressTag());
data.put("expressUid", formData.getExpressUid());
data.put("addressUpperLeft", formData.getAddressUpperLeft());
data.put("addressUpperRight", formData.getAddressUpperRight());
data.put("addressBottomLeft", formData.getAddressBottomLeft());
data.put("addressBottomRight", formData.getAddressBottomRight());
data.put("expressUidDown", formData.getExpressUid());
data.put("orderCore", formData.getOrderCore());
//生成图片
log.info("formData.getExpressUid() = " + formData.getExpressUid());
//BufferedImage image = insertWords(getBarCode(formData.getExpressUid(), 600, 100), formData.getExpressUid(), 600, 140, 100);
BufferedImage image =getBarCode(formData.getExpressUid(), 600, 100);
//初始化itext
// 设置编码 todo 此处处理编码问题
// 之前的BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 创建韩文字体
// BaseFont baseFont = BaseFont.createFont("Gothic.ttf",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/Malgun Gothic.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/Malgun Gothic.ttf", "UniKSC-UCS2-H", BaseFont.NOT_EMBEDDED);
PdfReader pdfReader = new PdfReader(SALE_SAMPLE_PDF);//获取地址
ByteArrayOutputStream output = new ByteArrayOutputStream();
PdfStamper pdfStamper = new PdfStamper(pdfReader, output);
AcroFields form = pdfStamper.getAcroFields();
form.addSubstitutionFont(baseFont);
//写入数据
for (String key : data.keySet()) {
String value = data.get(key).toString();
//key对应模板数据域的名称
form.setField(key, new String(value.getBytes("UTF-8"), "UTF-8"));
}
//添加图片
int pageNo = form.getFieldPositions("expressCodeUp").get(0).page;
Rectangle signRect = form.getFieldPositions("expressCodeUp").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
if (!ImageIO.write(image, "jpeg", stream)) {
return returnString;
}
byte[] imageBytes = stream.toByteArray();
Image imagePath = Image.getInstance(imageBytes);
PdfContentByte under = pdfStamper.getOverContent(pageNo);
// 设置图片大小
imagePath.scaleToFit(signRect.getWidth(), signRect.getHeight());
//设置图片位置
imagePath.setAbsolutePosition(x, y);
under.addImage(imagePath);
//添加图片
int pageNoMiddle = form.getFieldPositions("expressCodeMiddle").get(0).page;
Rectangle signRectMiddle = form.getFieldPositions("expressCodeMiddle").get(0).position;
float xMiddle = signRectMiddle.getLeft();
float yMiddle = signRectMiddle.getBottom();
ByteArrayOutputStream streamMiddle = new ByteArrayOutputStream();
if (!ImageIO.write(image, "jpeg", streamMiddle)) {
return returnString;
}
byte[] imageBytesMiddle = streamMiddle.toByteArray();
Image imagePathMiddle = Image.getInstance(imageBytesMiddle);
PdfContentByte undeMiddle = pdfStamper.getOverContent(pageNoMiddle);
// 设置图片大小
imagePathMiddle.scaleToFit(signRectMiddle.getWidth(), signRectMiddle.getHeight());
//设置图片位置
imagePathMiddle.setAbsolutePosition(xMiddle, yMiddle);
undeMiddle.addImage(imagePathMiddle);
//添加图片
int pageNoDown = form.getFieldPositions("expressCodeDown").get(0).page;
Rectangle signRectDown = form.getFieldPositions("expressCodeDown").get(0).position;
float xDown = signRectDown.getLeft();
float yDown = signRectDown.getBottom();
ByteArrayOutputStream streamDown = new ByteArrayOutputStream();
if (!ImageIO.write(image, "jpeg", streamDown)) {
return returnString;
}
byte[] imageBytesDown = streamDown.toByteArray();
Image imagePathDown = Image.getInstance(imageBytesDown);
PdfContentByte undeDown = pdfStamper.getOverContent(pageNoDown);
// 设置图片大小
imagePathDown.scaleToFit(signRectDown.getWidth(), signRectDown.getHeight());
//设置图片位置
imagePathDown.setAbsolutePosition(xDown, yDown);
undeDown.addImage(imagePathDown);
//生成图片
log.info("formData.getLandingUid() = " + formData.getLandingUid());
// BufferedImage imageLanding = insertWords(getBarCode(formData.getLandingUid(), 600, 100), formData.getLandingUid(), 600, 140, 100);
BufferedImage imageLanding = getBarCode(formData.getLandingUid(), 610, 220);
//初始化itext
// 设置编码
//BaseFont baseFontLanding = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
PdfReader pdfReaderLanding = new PdfReader(SALE_SAMPLE_PDF);//获取地址
ByteArrayOutputStream outputLanding = new ByteArrayOutputStream();
PdfStamper pdfStamperLanding = new PdfStamper(pdfReaderLanding, outputLanding);
AcroFields formLanding = pdfStamperLanding.getAcroFields();
formLanding.addSubstitutionFont(baseFont);
//写入数据
for (String key : data.keySet()) {
String value = data.get(key).toString();
//key对应模板数据域的名称
formLanding.setField(key, new String(value.getBytes("UTF-8"), "UTF-8"));
}
//添加图片
int pageNoLandingCode = formLanding.getFieldPositions("landingCode").get(0).page;
Rectangle signRectLandingCode = formLanding.getFieldPositions("landingCode").get(0).position;
float xLandingCode = signRectLandingCode.getLeft();
float yLandingCode = signRectLandingCode.getBottom();
ByteArrayOutputStream streamLandingCode = new ByteArrayOutputStream();
if (!ImageIO.write(imageLanding, "jpeg", streamLandingCode)) {
return returnString;
}
byte[] imageBytesLandingCode = streamLandingCode.toByteArray();
Image imagePathLandingCode = Image.getInstance(imageBytesLandingCode);
PdfContentByte underLandingCode = pdfStamper.getOverContent(pageNoLandingCode);
// 设置图片大小
imagePathLandingCode.scaleToFit(signRectLandingCode.getWidth(), signRectLandingCode.getHeight());
//设置图片位置
imagePathLandingCode.setAbsolutePosition(xLandingCode, yLandingCode);
underLandingCode.addImage(imagePathLandingCode);
//添加图片
int pageNoLogo = form.getFieldPositions("expressLogo").get(0).page;
Rectangle signRectLogo = form.getFieldPositions("expressLogo").get(0).position;
float xLogo = signRectLogo.getLeft();
float yLogo = signRectLogo.getBottom();
Image imagePathLogo = Image.getInstance(LOTTE_LOGO);//获取地址
PdfContentByte underLogo = pdfStamper.getOverContent(pageNoLogo);
// 设置图片大小
imagePathLogo.scaleToFit(signRectLogo.getWidth(), signRectLogo.getHeight());
// image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
//设置图片位置
imagePathLogo.setAbsolutePosition(xLogo, yLogo);
underLogo.addImage(imagePathLogo);
//添加图片
int pageNoHere = form.getFieldPositions("pasteHere").get(0).page;
Rectangle signRectHere = form.getFieldPositions("pasteHere").get(0).position;
float xHere = signRectHere.getLeft();
float yHere = signRectHere.getBottom();
Image imagePathHere = Image.getInstance(LOTTE_T);//获取地址
PdfContentByte underHere = pdfStamper.getOverContent(pageNoHere);
// 设置图片大小
imagePathHere.scaleToFit(signRectHere.getWidth(), signRectHere.getHeight());
// image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
//设置图片位置
imagePathHere.setAbsolutePosition(xHere, yHere);
underHere.addImage(imagePathHere);
//设置不可编辑
pdfStamper.setFormFlattening(true);
pdfStamper.close();
// returnString= Uploader.uploadOssStream(output,System.currentTimeMillis()+"-"+ formData.getOrderCore()+ ".pdf");
this.writeSinglePdf("Order",output,System.currentTimeMillis()+"-"+ formData.getOrderCore(), response);
} catch (Exception e) {
e.printStackTrace();
}finally {
return returnString;
}
}
private boolean writeSinglePdf(String name,ByteArrayOutputStream stream, String code, HttpServletResponse response) throws IOException {
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("fileName", name+"-" + code + ".pdf");
ServletOutputStream stream1 = response.getOutputStream();
try {
byte[] buf = new byte[1024];
byte[] data = stream.toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(data);
int len;
while ((len = in.read(buf)) != -1) {
stream1.write(buf, 0, len);
}
in.close();
response.flushBuffer();
} catch (Exception e) {
e.printStackTrace();
} finally {
stream1.close();
}
return false;
}
/* public static void main1(String[] args) throws Exception {
HttpServletResponse response = null;
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");
printSaleInfo(formData,response);
}*/
}
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.setOutboundMailNo(outPackage.getMailNo());
// packageInfo.setExpressCode(outPackage.getExpressCode()); packageInfo.setExpressCode(outPackage.getExpressCode());
WaybillOperator.WaybillInfo waybillInfo = waybillOperator.generateWaybillInfo(); } else {
packageInfo.setOutboundMailNo(waybillInfo.getMailNo()); // ---- 开始 修改为不认同前端输入,改为系统自动生成
packageInfo.setExpressCode(waybillInfo.getExpressCode()); WaybillOperator.WaybillInfo waybillInfo = waybillOperator.generateWaybillInfo();
outPackage.setExpressCode(waybillInfo.getExpressCode()); packageInfo.setOutboundMailNo(waybillInfo.getMailNo());
outPackage.setMailNo(waybillInfo.getMailNo()); packageInfo.setExpressCode(waybillInfo.getExpressCode());
// 结束 ---- outPackage.setExpressCode(waybillInfo.getExpressCode());
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
package org.ta.pddserver.lotto;
import com.google.zxing.WriterException;
import com.itextpdf.commons.utils.Base64;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
public class TextToImageUtils {
/**
* 将文字转换为图片(PNG格式)
* @param text 待转换的文字(支持中文、韩文等)
* @param code1 条形码
* @param fontSize 字体大小
* @param width 图片宽度
* @param height 图片高度
* @return 图片字节数组(PNG格式)
*/
/**
* 生成面单
* @param mailCode 快递面单
* @param receiverName 收件人姓名
* @param phone 电话
* @param postCode 邮编
* @param address 地址
* @param orderCode 出库单号
* @param area1 区域信息1
* @param area2 区域信息2
* @param area3 区域信息3
* @param area4 区域信息4
* @return 面单byte
* @throws Exception 异常
*/
public static byte[] textToImage( String mailCode,
String portCode,
String receiverName,
String phone,
String postCode,
String address,
String orderCode,
String area1,
String area2,
String area3,
String area4) throws Exception {
int width = 2268;
int height = 1512;
int startX = 20;
int startY = 0;
// 1. 创建 BufferedImage 作为画布
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
System.out.println("width = " + width + ", height = " + height);
Graphics2D g2d = image.createGraphics();
// 设置绘图属性(抗锯齿、渲染质量等)
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 文字抗锯齿
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); // 文字平滑
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // 渲染质量
// 2. 设置背景为白色
g2d.setColor(Color.white);
g2d.fillRect(0, 0, width, height);
// 3、默认字体
Font font0 = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("./HYGothic.ttf")).deriveFont((float) 86);
Font font01 = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("./HYGothic.ttf")).deriveFont((float) 70);
Font font1 = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("./HYGothic.ttf")).deriveFont((float) 56);
g2d.setColor(Color.BLACK); // 文字颜色
Font font2 = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("./HYGothic.ttf")).deriveFont((float) 46);
// logo1
String logo1String = "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";
byte[] logo1Byte = Base64.decode(logo1String);
ByteArrayInputStream logo1ByteIs = new ByteArrayInputStream(logo1Byte);
BufferedImage logo1Img = ImageIO.read(logo1ByteIs);
g2d.drawImage(logo1Img, startX + 0, startY + 0, 616, 76, null);
// logo2
// String logo2String = "iVBORw0KGgoAAAANSUhEUgAAAJwAAAB4CAYAAAAHbZvZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEQzRkU2MjU3RjJCMTFGMDkwNzFDQzQwMUFFNEE3REMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEQzRkU2MjY3RjJCMTFGMDkwNzFDQzQwMUFFNEE3REMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0RDNGRTYyMzdGMkIxMUYwOTA3MUNDNDAxQUU0QTdEQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0RDNGRTYyNDdGMkIxMUYwOTA3MUNDNDAxQUU0QTdEQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Poa5e5EAAAETSURBVHja7NwxDkBQEEVRT+zVmqz20fxWI0Q4p/r15GaoJm0neMpsBAiOz1rGI8lmHNzl+HVbbTh8UhEcCA7BgeAQHIIDwSE4EByCA8EhOAQHgkNwIDgEB4JDcAgOBIfgQHAIDgSH4BAcCA7Bwan86eTqW2/gjdtpNhwIDsGB4BAcgjMCBIfgQHAIDgSH4BAcCA7BgeAQHAgOwSE4EByCA8EhOBAcgkNwIDgEB4JDcAgOBIfgQHAIDgSH4BAcCA7BgeAQHAgOwSE4EByCA8EhOBAcgkNwIDgEB4JDcAgOBIfgQHAIDgSH4BAcCA7BgeAQHAgOwSE4EByCA8EhOAQHgkNwIDgEByfS1hSw4RAcXLYLMADPTBHnat0YcgAAAABJRU5ErkJggg==";
// byte[] logo2Byte = Base64.decode(logo2String);
// ByteArrayInputStream logo2ByteIs = new ByteArrayInputStream(logo2Byte);
// BufferedImage logo2Img = ImageIO.read(logo2ByteIs);
// g2d.drawImage(logo2Img, 1540, 540, 610, 466, null);
// 运单号
g2d.setFont(font1);
g2d.drawString("운송장번호 " + generateSplitMailCode(mailCode), startX + 690, startY + 76);
// 打印时间
g2d.setFont(font2);
g2d.drawString("2025.11.13", startX + 1600, startY + 76);
// 打印次数
g2d.drawString("1/1", startX + 2080, startY + 76);
// 条形码1
byte[] code1Bytes = BarcodeUtils.generate39Barcode(portCode, 650, 250);
ByteArrayInputStream code1BytesIs = new ByteArrayInputStream(code1Bytes);
BufferedImage code1Img = ImageIO.read(code1BytesIs);
g2d.drawImage(code1Img, startX + 0, startY + 100, 650, 250, null);
// 地区码1
g2d.setFont(font0);
g2d.drawString(area1, startX + 710, startY + 220);
// 地区信息1
g2d.setFont(font01);
g2d.drawString(area2, startX + 680, startY + 345);
// 地区信息2
g2d.setFont(font01);
g2d.drawString(area3, startX + 1466, startY + 220);
// 地区信息3
g2d.setFont(font01);
g2d.drawString(area4, startX + 1466, startY + 330);
// 收件人 电话
g2d.setFont(font1);
g2d.drawString("받는분:" + receiverName + " " + phone, startX + 0, startY + 440);
// 邮编
g2d.setFont(font1);
g2d.drawString(postCode, startX + 0, startY + 510);
// 详细地址
g2d.setFont(font1);
g2d.drawString(address, startX + 0, startY + 580);
// 商品信息
g2d.setFont(font1);
g2d.drawString("상품명: E-commerce consuming goods", startX + 0, startY + 700);
// 条形码2
byte[] code2Bytes = BarcodeUtils.generate39Barcode(mailCode, 686, 120);
ByteArrayInputStream code2BytesIs = new ByteArrayInputStream(code2Bytes);
BufferedImage code2Img = ImageIO.read(code2BytesIs);
g2d.drawImage(code2Img, startX + 1500, startY + 376, 686, 120, null);
// 条形码3
byte[] code3Bytes = BarcodeUtils.generate128Barcode(mailCode, 870, 270);
ByteArrayInputStream code3BytesIs = new ByteArrayInputStream(code3Bytes);
BufferedImage code3Img = ImageIO.read(code3BytesIs);
g2d.drawImage(code3Img, startX + 350, startY + 870, 870, 270, null);
// 条形码4
byte[] code4Bytes = BarcodeUtils.generate128Barcode(mailCode, 720, 190);
ByteArrayInputStream code4BytesIs = new ByteArrayInputStream(code4Bytes);
BufferedImage code4Img = ImageIO.read(code4BytesIs);
g2d.drawImage(code4Img, startX + 1420, startY + 1060, 720, 190, null);
// 快递单号
g2d.setFont(font2);
g2d.drawString(mailCode, startX + 1550, startY + 1310);
// 辅助文字
g2d.setFont(font1);
g2d.drawString("배송비고:", startX + 0, startY + 1220);
// 集运单号
g2d.setFont(font1);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
FontMetrics metrics = g2d.getFontMetrics();
int x = (width - metrics.stringWidth(orderCode)) / 2; // 水平居中
g2d.drawString(orderCode, startX + x, startY + 1370);
g2d.dispose();
// 6. 将图片转为字节数组(PNG格式)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
return baos.toByteArray();
}
public static String generateSplitMailCode(String mailCode) {
return mailCode.substring(0, 4) + "-" + mailCode.substring(4, 8) + "-" + mailCode.substring(8, 12);
}
}
...@@ -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,60 +27,65 @@ public class GDOperator { ...@@ -26,60 +27,65 @@ 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() {
List<GDTicketRepsonse> list = PddGDUtil.getTickets(); if (gd > 0) {
log.info("{} 工单数量:{}", new Date().toLocaleString(), list.size()); List<GDTicketRepsonse> list = PddGDUtil.getTickets();
for (GDTicketRepsonse gdTicketRepsonse : list) { log.info("{} 工单数量:{}", new Date().toLocaleString(), list.size());
GDTicketEntity gdTicketEntity = gdTicketImpl.getByTicketId(gdTicketRepsonse.getTicket_id()); for (GDTicketRepsonse gdTicketRepsonse : list) {
if (gdTicketEntity == null) { GDTicketEntity gdTicketEntity = gdTicketImpl.getByTicketId(gdTicketRepsonse.getTicket_id());
// todo 保存 if (gdTicketEntity == null) {
// 主体、绑定两个表 // todo 保存
gdTicketEntity = new GDTicketEntity(); // 主体、绑定两个表
gdTicketEntity.setTicket_id(gdTicketRepsonse.getTicket_id()); gdTicketEntity = new GDTicketEntity();
gdTicketEntity.setCreate_type(gdTicketRepsonse.getCreate_type()); gdTicketEntity.setTicket_id(gdTicketRepsonse.getTicket_id());
gdTicketEntity.setReceive_address(gdTicketRepsonse.getReceive_address()); gdTicketEntity.setCreate_type(gdTicketRepsonse.getCreate_type());
gdTicketEntity.setSend_address(gdTicketRepsonse.getSend_address()); gdTicketEntity.setReceive_address(gdTicketRepsonse.getReceive_address());
gdTicketEntity.setPre_delivery_id(gdTicketRepsonse.getPre_delivery_id()); gdTicketEntity.setSend_address(gdTicketRepsonse.getSend_address());
gdTicketEntity.setHandle_result(gdTicketRepsonse.getHandle_result()); gdTicketEntity.setPre_delivery_id(gdTicketRepsonse.getPre_delivery_id());
gdTicketEntity.setExpress_company_id((long)gdTicketRepsonse.getExpress_company_id()); gdTicketEntity.setHandle_result(gdTicketRepsonse.getHandle_result());
gdTicketEntity.setCompensate_state((int)gdTicketRepsonse.getCompensate_state()); gdTicketEntity.setExpress_company_id((long)gdTicketRepsonse.getExpress_company_id());
gdTicketEntity.setCompensate_amount(gdTicketRepsonse.getCompensate_amount().intValue()); gdTicketEntity.setCompensate_state((int)gdTicketRepsonse.getCompensate_state());
gdTicketEntity.setSign_state((int)gdTicketRepsonse.getSign_state()); gdTicketEntity.setCompensate_amount(gdTicketRepsonse.getCompensate_amount().intValue());
gdTicketEntity.setExpress_dealer(gdTicketRepsonse.getExpress_dealer()); gdTicketEntity.setSign_state((int)gdTicketRepsonse.getSign_state());
gdTicketEntity.setExpress_dealer_contact(gdTicketRepsonse.getExpress_dealer_contact()); gdTicketEntity.setExpress_dealer(gdTicketRepsonse.getExpress_dealer());
gdTicketEntity.setRetreat_count(gdTicketRepsonse.getRetreat_count()); gdTicketEntity.setExpress_dealer_contact(gdTicketRepsonse.getExpress_dealer_contact());
gdTicketEntity.setReceive_name(gdTicketRepsonse.getReceive_name()); gdTicketEntity.setRetreat_count(gdTicketRepsonse.getRetreat_count());
gdTicketEntity.setReceive_contact(gdTicketRepsonse.getReceive_contact()); gdTicketEntity.setReceive_name(gdTicketRepsonse.getReceive_name());
gdTicketEntity.setReceive_contact(gdTicketRepsonse.getReceive_contact());
gdTicketEntity.setCreate_at(gdTicketRepsonse.getCreated_at()); gdTicketEntity.setCreate_at(gdTicketRepsonse.getCreated_at());
gdTicketEntity.setUpdate_at(gdTicketRepsonse.getUpdated_at()); gdTicketEntity.setUpdate_at(gdTicketRepsonse.getUpdated_at());
gdTicketEntity.setTitle(gdTicketRepsonse.getTitle()); gdTicketEntity.setTitle(gdTicketRepsonse.getTitle());
gdTicketEntity.setDescription(gdTicketRepsonse.getDescription()); gdTicketEntity.setDescription(gdTicketRepsonse.getDescription());
gdTicketEntity.setSource(gdTicketRepsonse.getSource()); gdTicketEntity.setSource(gdTicketRepsonse.getSource());
gdTicketEntity.setWaybill_no(gdTicketRepsonse.getWaybill_no()); gdTicketEntity.setWaybill_no(gdTicketRepsonse.getWaybill_no());
gdTicketEntity.setUrgent_type(gdTicketRepsonse.getUrgent_type()); gdTicketEntity.setUrgent_type(gdTicketRepsonse.getUrgent_type());
gdTicketEntity.setType_id(gdTicketRepsonse.getType_id()); gdTicketEntity.setType_id(gdTicketRepsonse.getType_id());
gdTicketEntity.setStatus(gdTicketRepsonse.getStatus()); gdTicketEntity.setStatus(gdTicketRepsonse.getStatus());
gdTicketEntity.setCabinet_code(gdTicketRepsonse.getCabinet_code()); gdTicketEntity.setCabinet_code(gdTicketRepsonse.getCabinet_code());
gdTicketEntity.setMail_order_sn(gdTicketRepsonse.getMail_order_sn()); gdTicketEntity.setMail_order_sn(gdTicketRepsonse.getMail_order_sn());
gdTicketEntity.setPay_amount(gdTicketRepsonse.getPay_amount()); gdTicketEntity.setPay_amount(gdTicketRepsonse.getPay_amount());
gdTicketEntity.setArea_name(gdTicketRepsonse.getArea_name()); gdTicketEntity.setArea_name(gdTicketRepsonse.getArea_name());
gdTicketImpl.save(gdTicketEntity); gdTicketImpl.save(gdTicketEntity);
// //
List<GDTicketRepsonse.ExpressAttachment> expressAttachmentList = gdTicketRepsonse.getExpress_attachment(); List<GDTicketRepsonse.ExpressAttachment> expressAttachmentList = gdTicketRepsonse.getExpress_attachment();
if (expressAttachmentList == null) { if (expressAttachmentList == null) {
return; return;
} }
for(GDTicketRepsonse.ExpressAttachment expressAttachmentLists: expressAttachmentList){ for(GDTicketRepsonse.ExpressAttachment expressAttachmentLists: expressAttachmentList){
GDAttachmentEntity gdAttachmentEntity = new GDAttachmentEntity(); GDAttachmentEntity gdAttachmentEntity = new GDAttachmentEntity();
gdAttachmentEntity.setTickId(gdTicketEntity.getTicket_id()); gdAttachmentEntity.setTickId(gdTicketEntity.getTicket_id());
gdAttachmentEntity.setUrl(expressAttachmentLists.getUrl()); gdAttachmentEntity.setUrl(expressAttachmentLists.getUrl());
gdAttachmentEntity.setWaybill_no(gdTicketEntity.getWaybill_no()); gdAttachmentEntity.setWaybill_no(gdTicketEntity.getWaybill_no());
gDAttachmentImpl.save(gdAttachmentEntity); gDAttachmentImpl.save(gdAttachmentEntity);
}
} }
} }
} }
......
...@@ -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);
currentWaybillSea.setCurrentNo(currentNo); if (this.lotto > 0) {
waybillSeaImpl.updateById(currentWaybillSea); // 测试不更新
currentWaybillSea.setCurrentNo(currentNo);
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
\ No newline at end of file
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);
}
}
}
{
"logistics_companies_get_response": {
"logistics_companies": [
{
"code": "STO",
"available": 1,
"logistics_company": "申通快递",
"id": 1
},
{
"code": "SHHT",
"available": 0,
"logistics_company": "上海汇通",
"id": 2
},
{
"code": "HT",
"available": 1,
"logistics_company": "百世快递",
"id": 3
},
{
"code": "SF",
"available": 1,
"logistics_company": "顺丰快递",
"id": 44
},
{
"code": "YTO",
"available": 1,
"logistics_company": "圆通快递",
"id": 85
},
{
"code": "NBYGZT",
"available": 0,
"logistics_company": "内部员工自提",
"id": 86
},
{
"code": "BBSD",
"available": 0,
"logistics_company": "奔奔速达",
"id": 88
},
{
"code": "SAD",
"available": 0,
"logistics_company": "赛澳递",
"id": 89
},
{
"code": "CHENGBANG",
"available": 0,
"logistics_company": "晟邦物流",
"id": 90
},
{
"code": "ZTO",
"available": 1,
"logistics_company": "中通快递",
"id": 115
},
{
"code": "QF",
"available": 0,
"logistics_company": "全峰快递",
"id": 116
},
{
"code": "YS",
"available": 1,
"logistics_company": "优速",
"id": 117
},
{
"code": "EMS",
"available": 1,
"logistics_company": "邮政EMS",
"id": 118
},
{
"code": "TT",
"available": 1,
"logistics_company": "天天快递",
"id": 119
},
{
"code": "JD",
"available": 1,
"logistics_company": "京东配送",
"id": 120
},
{
"code": "YUNDA",
"available": 1,
"logistics_company": "韵达快递",
"id": 121
},
{
"code": "KJ",
"available": 0,
"logistics_company": "快捷快递",
"id": 122
},
{
"code": "GTO",
"available": 0,
"logistics_company": "国通快递",
"id": 124
},
{
"code": "DDCBPS",
"available": 0,
"logistics_company": "当当出版配送",
"id": 128
},
{
"code": "ZJS",
"available": 1,
"logistics_company": "宅急送快递",
"id": 129
},
{
"code": "RFD",
"available": 0,
"logistics_company": "如风达",
"id": 130
},
{
"code": "DB",
"available": 1,
"logistics_company": "德邦快递",
"id": 131
},
{
"code": "YZXB",
"available": 1,
"logistics_company": "邮政快递包裹",
"id": 132
},
{
"code": "LBEX",
"available": 0,
"logistics_company": "龙邦快递",
"id": 133
},
{
"code": "FEDEX",
"available": 1,
"logistics_company": "联邦快递",
"id": 135
},
{
"code": "JIUYE",
"available": 1,
"logistics_company": "九曳供应链",
"id": 136
},
{
"code": "BCDRD",
"available": 0,
"logistics_company": "百城当日达快递",
"id": 137
},
{
"code": "DDKD",
"available": 0,
"logistics_company": "达达快递",
"id": 138
},
{
"code": "DDJWL",
"available": 0,
"logistics_company": "冻到家物流",
"id": 139
},
{
"code": "NJCHENGBANG",
"available": 0,
"logistics_company": "南京晟邦",
"id": 140
},
{
"code": "SXHONGMAJIA",
"available": 0,
"logistics_company": "山西红马甲",
"id": 141
},
{
"code": "WXWL",
"available": 0,
"logistics_company": "万象物流",
"id": 142
},
{
"code": "LIJISONG",
"available": 0,
"logistics_company": "立即送",
"id": 143
},
{
"code": "MENDUIMEN",
"available": 0,
"logistics_company": "门对门",
"id": 144
},
{
"code": "SAD2",
"available": 0,
"logistics_company": "赛澳递",
"id": 145
},
{
"code": "FENGCHENG",
"available": 0,
"logistics_company": "丰程",
"id": 147
},
{
"code": "ADX",
"available": 0,
"logistics_company": "安达信",
"id": 148
},
{
"code": "HWKD",
"available": 0,
"logistics_company": "海外快递",
"id": 149
},
{
"code": "GZLT",
"available": 0,
"logistics_company": "飞远物流",
"id": 150
},
{
"code": "NDKD1",
"available": 0,
"logistics_company": "南都快递1",
"id": 151
},
{
"code": "HUIWEN",
"available": 0,
"logistics_company": "汇文快递",
"id": 152
},
{
"code": "NDKD",
"available": 0,
"logistics_company": "南都快递",
"id": 153
},
{
"code": "HUANGMAJIA",
"available": 0,
"logistics_company": "黄马甲",
"id": 154
},
{
"code": "SURE",
"available": 1,
"logistics_company": "速尔快递",
"id": 155
},
{
"code": "YAMAXUNWULIU",
"available": 1,
"logistics_company": "亚马逊物流",
"id": 156
},
{
"code": "YCT",
"available": 1,
"logistics_company": "黑猫宅急便",
"id": 157
},
{
"code": "SFHY",
"available": 0,
"logistics_company": "顺丰航运",
"id": 158
},
{
"code": "YTHY",
"available": 0,
"logistics_company": "圆通航运",
"id": 159
},
{
"code": "PINHAOHUO",
"available": 0,
"logistics_company": "拼好货",
"id": 160
},
{
"code": "SHSAD",
"available": 0,
"logistics_company": "上海赛澳递",
"id": 161
},
{
"code": "BJCS",
"available": 0,
"logistics_company": "城市100",
"id": 162
},
{
"code": "ZMKM",
"available": 0,
"logistics_company": "芝麻开门",
"id": 163
},
{
"code": "SHUNJIEFENGDA",
"available": 0,
"logistics_company": "顺捷丰达",
"id": 164
},
{
"code": "HTXMJ",
"available": 0,
"logistics_company": "汇通小红马",
"id": 165
},
{
"code": "LNXHM",
"available": 0,
"logistics_company": "辽宁小红马",
"id": 166
},
{
"code": "LNHUANGMAJIA",
"available": 0,
"logistics_company": "辽宁黄马甲",
"id": 167
},
{
"code": "JSSAD",
"available": 0,
"logistics_company": "江苏赛澳递",
"id": 168
},
{
"code": "SANRENXING",
"available": 0,
"logistics_company": "三人行",
"id": 169
},
{
"code": "THJD",
"available": 0,
"logistics_company": "通和佳递",
"id": 170
},
{
"code": "SUJIEVIP",
"available": 0,
"logistics_company": "速捷",
"id": 171
},
{
"code": "XNXD",
"available": 0,
"logistics_company": "信诺迅达",
"id": 172
},
{
"code": "FXIANSHENG",
"available": 0,
"logistics_company": "风先生",
"id": 173
},
{
"code": "KUANRONG",
"available": 0,
"logistics_company": "宽容",
"id": 174
},
{
"code": "GZTK",
"available": 0,
"logistics_company": "广州途客",
"id": 175
},
{
"code": "XIAOHONGMAO",
"available": 0,
"logistics_company": "小红帽",
"id": 176
},
{
"code": "PENGDA",
"available": 0,
"logistics_company": "鹏达",
"id": 177
},
{
"code": "FJGZLT",
"available": 0,
"logistics_company": "福建飞远",
"id": 178
},
{
"code": "ETEKUAI",
"available": 0,
"logistics_company": "E特快",
"id": 179
},
{
"code": "SELF",
"available": 1,
"logistics_company": "其他",
"id": 180
},
{
"code": "YUNNIAO",
"available": 0,
"logistics_company": "云鸟",
"id": 181
},
{
"code": "BAODA",
"available": 0,
"logistics_company": "保达",
"id": 182
},
{
"code": "KYE",
"available": 1,
"logistics_company": "跨越速运",
"id": 183
},
{
"code": "JLHMJ",
"available": 0,
"logistics_company": "吉林黄马甲",
"id": 184
},
{
"code": "CHENGJI",
"available": 0,
"logistics_company": "城际速递",
"id": 185
},
{
"code": "USPS",
"available": 1,
"logistics_company": "usps",
"id": 186
},
{
"code": "ANJELEX",
"available": 0,
"logistics_company": "青岛安捷",
"id": 187
},
{
"code": "DHTY",
"available": 0,
"logistics_company": "大韩通运",
"id": 188
},
{
"code": "BANGBANGTANG",
"available": 0,
"logistics_company": "棒棒糖",
"id": 189
},
{
"code": "TUXIAN",
"available": 0,
"logistics_company": "途鲜",
"id": 190
},
{
"code": "CNKD",
"available": 0,
"logistics_company": "菜鸟快递",
"id": 191
},
{
"code": "EMSKD",
"available": 0,
"logistics_company": "EMS经济快递",
"id": 192
},
{
"code": "HZZX",
"available": 0,
"logistics_company": "汇站众享",
"id": 193
},
{
"code": "PAIKE",
"available": 0,
"logistics_company": "派客",
"id": 194
},
{
"code": "XLOBO",
"available": 1,
"logistics_company": "贝海国际速递",
"id": 195
},
{
"code": "TFGJKD",
"available": 0,
"logistics_company": "丰泰国际快递",
"id": 196
},
{
"code": "HUANQIU",
"available": 1,
"logistics_company": "环球速运",
"id": 197
},
{
"code": "SHUNFASUDI",
"available": 0,
"logistics_company": "168顺发速递",
"id": 198
},
{
"code": "QQSD",
"available": 0,
"logistics_company": "全球快递",
"id": 199
},
{
"code": "CG",
"available": 1,
"logistics_company": "程光物流",
"id": 200
},
{
"code": "UAPEX",
"available": 0,
"logistics_company": "全一快递",
"id": 201
},
{
"code": "HQSY",
"available": 0,
"logistics_company": "环球速运",
"id": 202
},
{
"code": "DJKJ",
"available": 0,
"logistics_company": "东骏快捷",
"id": 203
},
{
"code": "BSKD",
"available": 0,
"logistics_company": "百世快递",
"id": 204
},
{
"code": "YCGWL",
"available": 1,
"logistics_company": "远成快运",
"id": 205
},
{
"code": "FTGJSD",
"available": 0,
"logistics_company": "风腾国际速递",
"id": 206
},
{
"code": "BNZY",
"available": 0,
"logistics_company": "笨鸟转运",
"id": 207
},
{
"code": "ANNENG",
"available": 0,
"logistics_company": "安能快递",
"id": 208
},
{
"code": "EPS",
"available": 0,
"logistics_company": "联众国际快运",
"id": 209
},
{
"code": "HOAU",
"available": 1,
"logistics_company": "天地华宇",
"id": 210
},
{
"code": "ZHONGYOUWULIU",
"available": 1,
"logistics_company": "中邮速递",
"id": 211
},
{
"code": "HITAOYI",
"available": 0,
"logistics_company": "hi淘易",
"id": 212
},
{
"code": "INTEREMS",
"available": 1,
"logistics_company": "EMS-国际件",
"id": 213
},
{
"code": "ZTKY",
"available": 1,
"logistics_company": "中铁物流",
"id": 214
},
{
"code": "CYWL",
"available": 0,
"logistics_company": "楚源物流",
"id": 215
},
{
"code": "XBWL",
"available": 1,
"logistics_company": "新邦物流",
"id": 216
},
{
"code": "FLASH",
"available": 0,
"logistics_company": "Flash Express",
"id": 217
},
{
"code": "NSF",
"available": 1,
"logistics_company": "新顺丰NSF",
"id": 218
},
{
"code": "RLKD",
"available": 0,
"logistics_company": "锐朗快递",
"id": 219
},
{
"code": "WDGJWL",
"available": 0,
"logistics_company": "王道国际物流",
"id": 220
},
{
"code": "DCS",
"available": 0,
"logistics_company": "DCS GLOBAL",
"id": 221
},
{
"code": "XSKD",
"available": 0,
"logistics_company": "迅速快递",
"id": 222
},
{
"code": "FTD",
"available": 1,
"logistics_company": "富腾达",
"id": 223
},
{
"code": "QFWL",
"available": 0,
"logistics_company": "琦峰物流",
"id": 224
},
{
"code": "JYTWL",
"available": 0,
"logistics_company": "金运通物流",
"id": 225
},
{
"code": "EWE",
"available": 1,
"logistics_company": "EWE全球快递",
"id": 226
},
{
"code": "RRS",
"available": 1,
"logistics_company": "日日顺物流",
"id": 227
},
{
"code": "SNWL",
"available": 1,
"logistics_company": "苏宁快递",
"id": 228
},
{
"code": "BESTQJT",
"available": 1,
"logistics_company": "百世快运",
"id": 229
},
{
"code": "DEBANGWULIU",
"available": 1,
"logistics_company": "德邦物流",
"id": 230
},
{
"code": "WEITEPAI",
"available": 0,
"logistics_company": "微特派",
"id": 231
},
{
"code": "MYAAE",
"available": 1,
"logistics_company": "AAE全球专递",
"id": 232
},
{
"code": "ARAMEX",
"available": 1,
"logistics_company": "Aramex",
"id": 233
},
{
"code": "ASENDIA",
"available": 0,
"logistics_company": "Asendia USA",
"id": 234
},
{
"code": "CITYLINK",
"available": 0,
"logistics_company": "City-Link",
"id": 235
},
{
"code": "COE",
"available": 1,
"logistics_company": "COE东方快递",
"id": 236
},
{
"code": "DHLDE",
"available": 0,
"logistics_company": "DHL德国",
"id": 237
},
{
"code": "DHL",
"available": 0,
"logistics_company": "DHL全球",
"id": 238
},
{
"code": "DHLCN",
"available": 1,
"logistics_company": "DHL中国",
"id": 239
},
{
"code": "EMSGJ",
"available": 0,
"logistics_company": "EMS国际",
"id": 240
},
{
"code": "FEDEXUS",
"available": 0,
"logistics_company": "FedEx美国",
"id": 241
},
{
"code": "FEDEXCN",
"available": 0,
"logistics_company": "FedEx中国",
"id": 242
},
{
"code": "OCS",
"available": 0,
"logistics_company": "OCS",
"id": 243
},
{
"code": "ONTRAC",
"available": 0,
"logistics_company": "OnTrac",
"id": 244
},
{
"code": "TNT",
"available": 0,
"logistics_company": "TNT",
"id": 245
},
{
"code": "UPS",
"available": 1,
"logistics_company": "UPS",
"id": 246
},
{
"code": "POSTAL",
"available": 0,
"logistics_company": "阿尔巴尼亚邮政",
"id": 247
},
{
"code": "POSTAR",
"available": 0,
"logistics_company": "阿根廷邮政",
"id": 248
},
{
"code": "POSTAE",
"available": 0,
"logistics_company": "阿联酋邮政",
"id": 249
},
{
"code": "POSTEE",
"available": 0,
"logistics_company": "爱沙尼亚邮政",
"id": 250
},
{
"code": "POSTAT",
"available": 0,
"logistics_company": "奥地利邮政",
"id": 252
},
{
"code": "POSTAU",
"available": 0,
"logistics_company": "澳大利亚邮政",
"id": 253
},
{
"code": "POSTPK",
"available": 0,
"logistics_company": "巴基斯坦邮政",
"id": 254
},
{
"code": "POSTBR",
"available": 0,
"logistics_company": "巴西邮政",
"id": 255
},
{
"code": "POSTBY",
"available": 0,
"logistics_company": "白俄罗斯邮政",
"id": 256
},
{
"code": "EES",
"available": 0,
"logistics_company": "百福东方",
"id": 257
},
{
"code": "POSTB",
"available": 0,
"logistics_company": "包裹信件",
"id": 258
},
{
"code": "POSTBG",
"available": 0,
"logistics_company": "保加利亚邮政",
"id": 259
},
{
"code": "BLSYZ",
"available": 0,
"logistics_company": "比利时邮政",
"id": 260
},
{
"code": "BLYZ",
"available": 0,
"logistics_company": "波兰邮政",
"id": 261
},
{
"code": "CXCOD",
"available": 1,
"logistics_company": "传喜物流",
"id": 262
},
{
"code": "DTW",
"available": 1,
"logistics_company": "大田物流",
"id": 263
},
{
"code": "4PX",
"available": 1,
"logistics_company": "递四方",
"id": 264
},
{
"code": "RUSTON",
"available": 0,
"logistics_company": "俄速通",
"id": 265
},
{
"code": "FGYZ",
"available": 0,
"logistics_company": "法国邮政",
"id": 266
},
{
"code": "GZFY",
"available": 0,
"logistics_company": "凡宇快递",
"id": 267
},
{
"code": "ZTKY1",
"available": 1,
"logistics_company": "飞豹快递",
"id": 268
},
{
"code": "HZABC",
"available": 0,
"logistics_company": "飞远(爱彼西)配送",
"id": 269
},
{
"code": "POSTFI",
"available": 0,
"logistics_company": "芬兰邮政",
"id": 270
},
{
"code": "POSTCO",
"available": 0,
"logistics_company": "哥伦比亚邮政",
"id": 271
},
{
"code": "EPOST",
"available": 0,
"logistics_company": "韩国邮政",
"id": 272
},
{
"code": "HLWL",
"available": 1,
"logistics_company": "恒路物流",
"id": 273
},
{
"code": "HQKY",
"available": 0,
"logistics_company": "华企快运",
"id": 274
},
{
"code": "TMS56",
"available": 1,
"logistics_company": "加运美",
"id": 275
},
{
"code": "CNEX",
"available": 1,
"logistics_company": "佳吉快运",
"id": 276
},
{
"code": "JIAYI",
"available": 1,
"logistics_company": "佳怡物流",
"id": 277
},
{
"code": "KERRYEAS",
"available": 0,
"logistics_company": "嘉里大通",
"id": 278
},
{
"code": "JKYZ",
"available": 0,
"logistics_company": "捷克邮政",
"id": 279
},
{
"code": "JDYWL",
"available": 0,
"logistics_company": "筋斗云物流",
"id": 280
},
{
"code": "SZKKE",
"available": 1,
"logistics_company": "京广速递",
"id": 281
},
{
"code": "POSTHR",
"available": 0,
"logistics_company": "克罗地亚邮政",
"id": 282
},
{
"code": "POSTLV",
"available": 0,
"logistics_company": "拉脱维亚邮政",
"id": 283
},
{
"code": "POSTLB",
"available": 0,
"logistics_company": "黎巴嫩邮政",
"id": 284
},
{
"code": "LTS",
"available": 1,
"logistics_company": "联昊通",
"id": 285
},
{
"code": "POSTMT",
"available": 0,
"logistics_company": "马耳他邮政",
"id": 286
},
{
"code": "POSTMK",
"available": 0,
"logistics_company": "马其顿邮政",
"id": 287
},
{
"code": "POSTMU",
"available": 0,
"logistics_company": "毛里求斯邮政",
"id": 288
},
{
"code": "SERPOST",
"available": 0,
"logistics_company": "秘鲁邮政",
"id": 289
},
{
"code": "MBEX",
"available": 0,
"logistics_company": "民邦快递",
"id": 290
},
{
"code": "CAE",
"available": 1,
"logistics_company": "民航快递",
"id": 291
},
{
"code": "SZML56",
"available": 0,
"logistics_company": "明亮物流",
"id": 292
},
{
"code": "POSTMD",
"available": 0,
"logistics_company": "摩尔多瓦邮政",
"id": 293
},
{
"code": "POSTZA",
"available": 0,
"logistics_company": "南非邮政",
"id": 294
},
{
"code": "POSTNO",
"available": 0,
"logistics_company": "挪威邮政",
"id": 295
},
{
"code": "POSTPT",
"available": 0,
"logistics_company": "葡萄牙邮政",
"id": 296
},
{
"code": "QRT",
"available": 0,
"logistics_company": "全日通",
"id": 297
},
{
"code": "RBYZEMS",
"available": 0,
"logistics_company": "日本邮政",
"id": 298
},
{
"code": "POSTSE",
"available": 0,
"logistics_company": "瑞典邮政",
"id": 299
},
{
"code": "POSTCH",
"available": 0,
"logistics_company": "瑞士邮政",
"id": 300
},
{
"code": "POSTSRB",
"available": 0,
"logistics_company": "塞尔维亚邮政",
"id": 301
},
{
"code": "SANTAI",
"available": 0,
"logistics_company": "三态速递",
"id": 302
},
{
"code": "POSTSA",
"available": 0,
"logistics_company": "沙特邮政",
"id": 303
},
{
"code": "SZSA56",
"available": 0,
"logistics_company": "圣安物流",
"id": 304
},
{
"code": "FJSFWLJTYXGS",
"available": 1,
"logistics_company": "盛丰物流",
"id": 305
},
{
"code": "SHENGHUI",
"available": 1,
"logistics_company": "盛辉物流",
"id": 306
},
{
"code": "POSTSK",
"available": 0,
"logistics_company": "斯洛伐克邮政",
"id": 307
},
{
"code": "POSTSI",
"available": 0,
"logistics_company": "斯洛文尼亚邮政",
"id": 308
},
{
"code": "SUIJIAWL",
"available": 0,
"logistics_company": "穗佳物流",
"id": 309
},
{
"code": "POSTTH",
"available": 0,
"logistics_company": "泰国邮政",
"id": 310
},
{
"code": "POSTTR",
"available": 0,
"logistics_company": "土耳其邮政",
"id": 311
},
{
"code": "MANCOWL",
"available": 1,
"logistics_company": "万家物流",
"id": 312
},
{
"code": "POSTUA",
"available": 0,
"logistics_company": "乌克兰邮政",
"id": 313
},
{
"code": "POSTES",
"available": 0,
"logistics_company": "西班牙邮政",
"id": 314
},
{
"code": "XFWL",
"available": 1,
"logistics_company": "信丰物流",
"id": 315
},
{
"code": "POSTHU",
"available": 0,
"logistics_company": "匈牙利邮政",
"id": 316
},
{
"code": "AIR",
"available": 1,
"logistics_company": "亚风速递",
"id": 317
},
{
"code": "POSTAM",
"available": 0,
"logistics_company": "亚美尼亚邮政",
"id": 318
},
{
"code": "YWWL",
"available": 1,
"logistics_company": "燕文物流",
"id": 319
},
{
"code": "POSTIT",
"available": 0,
"logistics_company": "意大利邮政",
"id": 320
},
{
"code": "FEC",
"available": 0,
"logistics_company": "银捷速递",
"id": 321
},
{
"code": "POSTIN",
"available": 0,
"logistics_company": "印度邮政",
"id": 322
},
{
"code": "ROYALMAIL",
"available": 0,
"logistics_company": "英国皇家邮政",
"id": 323
},
{
"code": "POSTBBZ",
"available": 1,
"logistics_company": "邮政标准快递",
"id": 324
},
{
"code": "CNPOSTGJ",
"available": 1,
"logistics_company": "邮政国际包裹",
"id": 325
},
{
"code": "YFEXPRESS",
"available": 0,
"logistics_company": "越丰物流",
"id": 326
},
{
"code": "YTZG",
"available": 0,
"logistics_company": "运通中港快递",
"id": 327
},
{
"code": "ZENY",
"available": 0,
"logistics_company": "增益速递",
"id": 328
},
{
"code": "POSTCL",
"available": 0,
"logistics_company": "智利邮政",
"id": 329
},
{
"code": "SPSR",
"available": 0,
"logistics_company": "中俄快递",
"id": 330
},
{
"code": "CRE",
"available": 1,
"logistics_company": "中铁快运",
"id": 332
},
{
"code": "KFW",
"available": 0,
"logistics_company": "快服务快递",
"id": 333
},
{
"code": "KDN",
"available": 0,
"logistics_company": "快递鸟",
"id": 334
},
{
"code": "YOUBANG",
"available": 1,
"logistics_company": "优邦国际速运",
"id": 335
},
{
"code": "TJ",
"available": 1,
"logistics_company": "天际快递",
"id": 336
},
{
"code": "FY",
"available": 1,
"logistics_company": "飞洋快递",
"id": 337
},
{
"code": "BM",
"available": 1,
"logistics_company": "斑马物联网",
"id": 338
},
{
"code": "EKM",
"available": 1,
"logistics_company": "易客满",
"id": 339
},
{
"code": "JDKD",
"available": 1,
"logistics_company": "京东大件物流",
"id": 340
},
{
"code": "SUBIDA",
"available": 1,
"logistics_company": "速必达",
"id": 341
},
{
"code": "DJKJWL",
"available": 0,
"logistics_company": "东骏快捷",
"id": 342
},
{
"code": "ZTOKY",
"available": 1,
"logistics_company": "中通快运",
"id": 343
},
{
"code": "YDKY",
"available": 1,
"logistics_company": "韵达快运",
"id": 344
},
{
"code": "ANKY",
"available": 1,
"logistics_company": "安能快运",
"id": 345
},
{
"code": "ANDE",
"available": 1,
"logistics_company": "安得物流",
"id": 346
},
{
"code": "WM",
"available": 1,
"logistics_company": "中粮我买网",
"id": 347
},
{
"code": "YMDD",
"available": 1,
"logistics_company": "壹米滴答",
"id": 348
},
{
"code": "DD",
"available": 1,
"logistics_company": "当当网",
"id": 349
},
{
"code": "PJ",
"available": 0,
"logistics_company": "品骏",
"id": 350
},
{
"code": "OTP",
"available": 0,
"logistics_company": "承诺达特快",
"id": 351
},
{
"code": "AXWL",
"available": 1,
"logistics_company": "安迅物流",
"id": 352
},
{
"code": "YJ",
"available": 0,
"logistics_company": "友家速递",
"id": 353
},
{
"code": "SDSD",
"available": 1,
"logistics_company": "D速物流",
"id": 354
},
{
"code": "STOINTER",
"available": 1,
"logistics_company": "申通国际",
"id": 355
},
{
"code": "YZT",
"available": 1,
"logistics_company": "一智通",
"id": 356
},
{
"code": "JGSD",
"available": 0,
"logistics_company": "京广速递",
"id": 357
},
{
"code": "SXJD",
"available": 1,
"logistics_company": "顺心捷达",
"id": 358
},
{
"code": "QH",
"available": 1,
"logistics_company": "群航国际货运",
"id": 359
},
{
"code": "ZWYSD",
"available": 1,
"logistics_company": "中外运速递",
"id": 360
},
{
"code": "ZZSY",
"available": 1,
"logistics_company": "卓志速运",
"id": 361
},
{
"code": "JZMSD",
"available": 1,
"logistics_company": "加州猫速递",
"id": 362
},
{
"code": "GJ",
"available": 1,
"logistics_company": "高捷物流",
"id": 363
},
{
"code": "SQWL",
"available": 1,
"logistics_company": "商桥物流",
"id": 364
},
{
"code": "FR",
"available": 1,
"logistics_company": "复融供应链",
"id": 365
},
{
"code": "ZY",
"available": 1,
"logistics_company": "中远e环球",
"id": 366
},
{
"code": "YDGJ",
"available": 1,
"logistics_company": "韵达国际",
"id": 367
},
{
"code": "MKGJ",
"available": 1,
"logistics_company": "美快国际",
"id": 368
},
{
"code": "NFCM",
"available": 0,
"logistics_company": "南方传媒",
"id": 369
},
{
"code": "WSPY",
"available": 1,
"logistics_company": "威时沛运",
"id": 370
},
{
"code": "ZTOINTER",
"available": 1,
"logistics_company": "中通国际",
"id": 371
},
{
"code": "SFKY",
"available": 1,
"logistics_company": "顺丰快运",
"id": 372
},
{
"code": "MGWL",
"available": 1,
"logistics_company": "亚马逊综合物流",
"id": 373
},
{
"code": "HKE",
"available": 1,
"logistics_company": "HKE国际速递",
"id": 374
},
{
"code": "EFSPOST",
"available": 1,
"logistics_company": "新西兰平安物流",
"id": 375
},
{
"code": "HTINTER",
"available": 1,
"logistics_company": "百世国际",
"id": 376
},
{
"code": "BSE",
"available": 0,
"logistics_company": "蓝天国际快递",
"id": 377
},
{
"code": "YLJY",
"available": 0,
"logistics_company": "优联吉运",
"id": 378
},
{
"code": "ZYSFWL",
"available": 1,
"logistics_company": "转运四方物流",
"id": 379
},
{
"code": "WSKD",
"available": 1,
"logistics_company": "威盛快递",
"id": 380
},
{
"code": "YTGJ",
"available": 1,
"logistics_company": "圆通国际",
"id": 381
},
{
"code": "HXWL",
"available": 1,
"logistics_company": "海信物流",
"id": 382
},
{
"code": "HYWL",
"available": 1,
"logistics_company": "空港宏远电商物流",
"id": 383
},
{
"code": "JTSD",
"available": 1,
"logistics_company": "极兔速递",
"id": 384
},
{
"code": "UCS",
"available": 1,
"logistics_company": "合众速递",
"id": 385
},
{
"code": "SYNSHIP",
"available": 1,
"logistics_company": "SYNSHIP快递",
"id": 386
},
{
"code": "21CAKE",
"available": 1,
"logistics_company": "21cake物流",
"id": 387
},
{
"code": "WHHDJ",
"available": 1,
"logistics_company": "娃哈哈到家配送",
"id": 388
},
{
"code": "FZGJ",
"available": 1,
"logistics_company": "方舟国际速递",
"id": 389
},
{
"code": "STZNWL",
"available": 1,
"logistics_company": "圣塔智能物流",
"id": 390
},
{
"code": "SFGJ",
"available": 1,
"logistics_company": "顺丰国际",
"id": 391
},
{
"code": "TJWL",
"available": 1,
"logistics_company": "泰进物流",
"id": 392
},
{
"code": "QJW",
"available": 1,
"logistics_company": "千机网1小时达",
"id": 393
},
{
"code": "AuExpress",
"available": 1,
"logistics_company": "澳邮中国快运",
"id": 394
},
{
"code": "HSSY",
"available": 1,
"logistics_company": "汇森速运",
"id": 395
},
{
"code": "XFXBWL",
"available": 1,
"logistics_company": "幸福西饼物流",
"id": 396
},
{
"code": "DDKS",
"available": 1,
"logistics_company": "叮当快送",
"id": 397
},
{
"code": "QYT",
"available": 1,
"logistics_company": "泉源堂",
"id": 398
},
{
"code": "YFDYF",
"available": 1,
"logistics_company": "益丰大药房",
"id": 399
},
{
"code": "YTDKD",
"available": 0,
"logistics_company": "易达通快递",
"id": 400
},
{
"code": "ZJWL",
"available": 1,
"logistics_company": "中汲物流",
"id": 401
},
{
"code": "SHUANGHUI",
"available": 0,
"logistics_company": "双汇",
"id": 402
},
{
"code": "FENGWANG",
"available": 1,
"logistics_company": "丰网速运",
"id": 403
},
{
"code": "WUXINYAOFANG",
"available": 0,
"logistics_company": "五心药房",
"id": 404
},
{
"code": "LAOBAIXING",
"available": 1,
"logistics_company": "老百姓大药房",
"id": 405
},
{
"code": "YUELUWULIU",
"available": 1,
"logistics_company": "跃陆物流",
"id": 406
},
{
"code": "NFSQ",
"available": 1,
"logistics_company": "农夫山泉",
"id": 407
},
{
"code": "YIJIUYIJIU",
"available": 1,
"logistics_company": "1919酒类直供",
"id": 408
},
{
"code": "QUANYOUJIAJU",
"available": 1,
"logistics_company": "莫仕供应链物流",
"id": 409
},
{
"code": "GUJIAJIAJU",
"available": 1,
"logistics_company": "顾家家居",
"id": 410
},
{
"code": "ZHIHUASHI",
"available": 1,
"logistics_company": "芝华仕",
"id": 411
},
{
"code": "TIANMAWULIU",
"available": 0,
"logistics_company": "天马物流",
"id": 412
},
{
"code": "HALUO",
"available": 1,
"logistics_company": "哈啰出行",
"id": 413
},
{
"code": "LINSHIMUYE",
"available": 1,
"logistics_company": "林氏物流",
"id": 414
},
{
"code": "SIJIAPP",
"available": 1,
"logistics_company": "商家自行配送",
"id": 415
},
{
"code": "SFTC",
"available": 1,
"logistics_company": "顺丰同城",
"id": 416
},
{
"code": "SHANSONG",
"available": 1,
"logistics_company": "闪送",
"id": 417
},
{
"code": "SFINTL",
"available": 1,
"logistics_company": "顺丰集运",
"id": 418
},
{
"code": "SZJY",
"available": 1,
"logistics_company": "神州集运",
"id": 419
},
{
"code": "DSDCD",
"available": 1,
"logistics_company": "代收点仓端",
"id": 420
},
{
"code": "PADTF",
"available": 1,
"logistics_company": "平安达腾飞",
"id": 421
},
{
"code": "SUTENG",
"available": 1,
"logistics_company": "速腾快递",
"id": 422
},
{
"code": "YXWL",
"available": 1,
"logistics_company": "宇鑫物流",
"id": 423
},
{
"code": "SUTWL",
"available": 1,
"logistics_company": "速通物流",
"id": 424
},
{
"code": "JUYUWL",
"available": 1,
"logistics_company": "具语平台物流",
"id": 425
},
{
"code": "AJJPWL",
"available": 1,
"logistics_company": "安居佳配物流",
"id": 426
},
{
"code": "SANZHIWL",
"available": 1,
"logistics_company": "三志物流",
"id": 427
},
{
"code": "FUHUWL",
"available": 1,
"logistics_company": "福虎物流",
"id": 428
},
{
"code": "YADSY",
"available": 1,
"logistics_company": "源安达速运",
"id": 429
},
{
"code": "LIANYUNHUI",
"available": 1,
"logistics_company": "联运汇",
"id": 430
},
{
"code": "YONGCHANGWL",
"available": 1,
"logistics_company": "永昌物流",
"id": 431
},
{
"code": "HMJT",
"available": 1,
"logistics_company": "澳全球",
"id": 432
},
{
"code": "NKHXWL",
"available": 1,
"logistics_company": "南康洪鑫物流",
"id": 433
},
{
"code": "JGWL",
"available": 1,
"logistics_company": "景光物流",
"id": 434
},
{
"code": "YUNJUWL",
"available": 1,
"logistics_company": "云聚物流",
"id": 435
},
{
"code": "YIXINSUYUN",
"available": 1,
"logistics_company": "益鑫速运",
"id": 436
},
{
"code": "KJKWL",
"available": 1,
"logistics_company": "快捷快物流",
"id": 437
},
{
"code": "LHTSD",
"available": 0,
"logistics_company": "联昊通速递",
"id": 438
},
{
"code": "GZLXWL",
"available": 1,
"logistics_company": "赣州龙鑫物流",
"id": 439
},
{
"code": "HNHTWL",
"available": 1,
"logistics_company": "河南鸿泰物流",
"id": 440
},
{
"code": "YANGBAOGUO",
"available": 1,
"logistics_company": "洋包裹",
"id": 441
},
{
"code": "SDXDWL",
"available": 1,
"logistics_company": "山东湘达物流",
"id": 442
},
{
"code": "GZCBWL",
"available": 1,
"logistics_company": "赣州楚邦物流",
"id": 443
},
{
"code": "YITUWULIU",
"available": 1,
"logistics_company": "易途物流",
"id": 444
},
{
"code": "YOUYUANWL",
"available": 1,
"logistics_company": "友源物流",
"id": 445
},
{
"code": "JITUJIYUN",
"available": 1,
"logistics_company": "極兔速遞HK",
"id": 446
},
{
"code": "YLBDT",
"available": 1,
"logistics_company": "永利八达通",
"id": 447
},
{
"code": "ZTOCC",
"available": 1,
"logistics_company": "中通冷链",
"id": 448
},
{
"code": "CHINAUNICOM",
"available": 1,
"logistics_company": "联通自有物流",
"id": 449
},
{
"code": "YANWENJIYUN",
"available": 1,
"logistics_company": "燕文集运",
"id": 450
},
{
"code": "XLHJY",
"available": 1,
"logistics_company": "鑫隆华集运",
"id": 451
},
{
"code": "AMLJY",
"available": 1,
"logistics_company": "艾姆勒集运",
"id": 452
},
{
"code": "GUYIWULIU",
"available": 1,
"logistics_company": "古宜物流",
"id": 453
},
{
"code": "LUOTUOWULIU",
"available": 1,
"logistics_company": "骆驼物流",
"id": 454
},
{
"code": "XIAOMIWULIU",
"available": 1,
"logistics_company": "小米物流",
"id": 455
},
{
"code": "YSJE",
"available": 1,
"logistics_company": "139 express",
"id": 456
},
{
"code": "YBGJ",
"available": 1,
"logistics_company": "Jańa Post",
"id": 457
},
{
"code": "YZDSBK",
"available": 1,
"logistics_company": "邮政电商标快",
"id": 458
},
{
"code": "JIEZHOU",
"available": 1,
"logistics_company": "芥舟物流",
"id": 459
},
{
"code": "JE",
"available": 1,
"logistics_company": "Jingle Express",
"id": 460
},
{
"code": "WJXSD",
"available": 1,
"logistics_company": "微集新世代",
"id": 461
},
{
"code": "JYSJ",
"available": 1,
"logistics_company": "集运世家",
"id": 462
},
{
"code": "BUYUP",
"available": 1,
"logistics_company": "BUYUP",
"id": 463
},
{
"code": "AMICI",
"available": 1,
"logistics_company": "欧米奇速递",
"id": 464
},
{
"code": "ZYWL",
"available": 1,
"logistics_company": "中邮物流",
"id": 465
},
{
"code": "ECMS",
"available": 1,
"logistics_company": "易客满物流",
"id": 466
},
{
"code": "TST",
"available": 1,
"logistics_company": "TST速运通",
"id": 467
},
{
"code": "JPRSJY",
"available": 1,
"logistics_company": "日森集运",
"id": 468
},
{
"code": "NDJY",
"available": 1,
"logistics_company": "诺达集运",
"id": 469
},
{
"code": "DSJY",
"available": 1,
"logistics_company": "东澍集运",
"id": 470
},
{
"code": "CTJY",
"available": 1,
"logistics_company": "赤兔集运",
"id": 471
},
{
"code": "TDQQJY",
"available": 1,
"logistics_company": "通达集运",
"id": 472
},
{
"code": "DFJY",
"available": 0,
"logistics_company": "大发集运",
"id": 473
},
{
"code": "LTJY",
"available": 1,
"logistics_company": "龙通集运",
"id": 474
},
{
"code": "FRJY",
"available": 1,
"logistics_company": "FR集运",
"id": 475
},
{
"code": "TMJY",
"available": 1,
"logistics_company": "天马集运",
"id": 476
},
{
"code": "DHSHJY",
"available": 1,
"logistics_company": "盛合集運",
"id": 477
},
{
"code": "FSJY",
"available": 1,
"logistics_company": "flash集运",
"id": 478
},
{
"code": "MTJY",
"available": 1,
"logistics_company": "易淘集运",
"id": 479
},
{
"code": "XLJY",
"available": 0,
"logistics_company": "西里物流",
"id": 480
},
{
"code": "ZTGJJY",
"available": 1,
"logistics_company": "中通国际集运",
"id": 481
},
{
"code": "786EXPRESS",
"available": 1,
"logistics_company": "786 Express",
"id": 482
},
{
"code": "YMTRANS",
"available": 1,
"logistics_company": "YM TRANS",
"id": 483
},
{
"code": "BEEPOST",
"available": 1,
"logistics_company": "Bee Post",
"id": 484
},
{
"code": "HUOLALA",
"available": 1,
"logistics_company": "货拉拉",
"id": 485
},
{
"code": "WPJY",
"available": 1,
"logistics_company": "WePost集运",
"id": 486
},
{
"code": "JLJY",
"available": 1,
"logistics_company": "KEC-嘉里集运",
"id": 487
},
{
"code": "SHIBJY",
"available": 1,
"logistics_company": "十邦集运",
"id": 488
},
{
"code": "JIEJINGJY",
"available": 1,
"logistics_company": "捷竞集运",
"id": 489
},
{
"code": "SLHT",
"available": 1,
"logistics_company": "SMARTEX",
"id": 490
},
{
"code": "PSBYEX",
"available": 1,
"logistics_company": "顺捷速递",
"id": 491
},
{
"code": "AFL",
"available": 1,
"logistics_company": "AFL集运",
"id": 492
},
{
"code": "ZHONGYOUJY",
"available": 1,
"logistics_company": "中邮集运",
"id": 493
},
{
"code": "878EXPRESS",
"available": 1,
"logistics_company": "878 Express",
"id": 494
},
{
"code": "YUNDAJY",
"available": 0,
"logistics_company": "uda Express",
"id": 495
},
{
"code": "FBKY",
"available": 1,
"logistics_company": "飞豹快运",
"id": 496
},
{
"code": "EBUY",
"available": 1,
"logistics_company": "eBuy",
"id": 497
},
{
"code": "YIYUAN",
"available": 1,
"logistics_company": "壹圆国际",
"id": 498
},
{
"code": "GHT",
"available": 1,
"logistics_company": "GHT EXPRESS",
"id": 499
},
{
"code": "SLGJ",
"available": 0,
"logistics_company": "首领国际",
"id": 500
},
{
"code": "CCCP",
"available": 1,
"logistics_company": "CCCPexpress",
"id": 501
},
{
"code": "ONEX",
"available": 1,
"logistics_company": "ONEX",
"id": 502
},
{
"code": "GLOBBING",
"available": 1,
"logistics_company": "Globbing",
"id": 503
},
{
"code": "INEX",
"available": 1,
"logistics_company": "INEX",
"id": 504
},
{
"code": "FLYPOST",
"available": 1,
"logistics_company": "FLY POST",
"id": 505
},
{
"code": "QTSD",
"available": 1,
"logistics_company": "全通速递",
"id": 506
},
{
"code": "SJTJY",
"available": 1,
"logistics_company": "速集通集运",
"id": 507
},
{
"code": "LBJY",
"available": 1,
"logistics_company": "立邦集运",
"id": 508
},
{
"code": "CNPOSTJY",
"available": 1,
"logistics_company": "中邮集运-广东",
"id": 509
},
{
"code": "JKEXPRESS",
"available": 0,
"logistics_company": "JKexpress",
"id": 510
},
{
"code": "KITAYBOX",
"available": 1,
"logistics_company": "KitayBox",
"id": 511
},
{
"code": "GONGZHUJY",
"available": 1,
"logistics_company": "公主集运",
"id": 512
},
{
"code": "OCSJY",
"available": 1,
"logistics_company": "OCS集运",
"id": 513
},
{
"code": "WOFENGJY",
"available": 1,
"logistics_company": "窩蜂聯盟",
"id": 514
},
{
"code": "YILIJY",
"available": 1,
"logistics_company": "易里集运",
"id": 515
},
{
"code": "TDHJY",
"available": 1,
"logistics_company": "天地會",
"id": 516
},
{
"code": "XGJY",
"available": 1,
"logistics_company": "香港集運",
"id": 517
},
{
"code": "XHJY",
"available": 1,
"logistics_company": "鑫航集運",
"id": 518
},
{
"code": "YGAJY",
"available": 1,
"logistics_company": "粵港澳集運",
"id": 519
},
{
"code": "YJDJY",
"available": 1,
"logistics_company": "易集达集运",
"id": 520
},
{
"code": "LXGJSY",
"available": 1,
"logistics_company": "聯迅國際速運",
"id": 521
},
{
"code": "GUANDANBAO",
"available": 1,
"logistics_company": "管单宝物流",
"id": 522
},
{
"code": "JKDWL",
"available": 1,
"logistics_company": "吉客道物流",
"id": 523
},
{
"code": "CHUANYOUJY",
"available": 1,
"logistics_company": "中郵快遞",
"id": 524
},
{
"code": "DDXGJY",
"available": 1,
"logistics_company": "永達茂盛",
"id": 525
},
{
"code": "MOTO",
"available": 1,
"logistics_company": "Moto Express",
"id": 526
},
{
"code": "SCCSEXPRESS",
"available": 1,
"logistics_company": "SCCS物流",
"id": 527
},
{
"code": "GOODKUAIDI",
"available": 1,
"logistics_company": "GOOD快递",
"id": 528
},
{
"code": "JGJY",
"available": 1,
"logistics_company": "婕果集运",
"id": 529
},
{
"code": "SOD",
"available": 1,
"logistics_company": "Sod Cargo",
"id": 530
},
{
"code": "QSJY",
"available": 1,
"logistics_company": "勤胜集运",
"id": 531
},
{
"code": "DDMOJY",
"available": 1,
"logistics_company": "澳門集運",
"id": 532
},
{
"code": "YTGJJY",
"available": 1,
"logistics_company": "圆通国际集运",
"id": 533
},
{
"code": "XYCJY",
"available": 1,
"logistics_company": "耀成集运",
"id": 534
},
{
"code": "TAIJY",
"available": 1,
"logistics_company": "台集运",
"id": 535
},
{
"code": "HKYC",
"available": 0,
"logistics_company": "上海晧库",
"id": 536
},
{
"code": "SSLH",
"available": 0,
"logistics_company": "盛世领航",
"id": 537
},
{
"code": "NZGJ",
"available": 0,
"logistics_company": "能者国际",
"id": 538
},
{
"code": "XMJJY",
"available": 1,
"logistics_company": "熊麻集運",
"id": 539
},
{
"code": "ZGWY",
"available": 1,
"logistics_company": "中国外运",
"id": 540
},
{
"code": "RTHXJY",
"available": 1,
"logistics_company": "榕台海峽集運",
"id": 541
},
{
"code": "CFJY",
"available": 1,
"logistics_company": "超峰集運",
"id": 542
},
{
"code": "QQLJY",
"available": 1,
"logistics_company": "巧巧郎集運",
"id": 543
},
{
"code": "DBGJJY",
"available": 1,
"logistics_company": "德邦國際集運",
"id": 544
},
{
"code": "SHUIQU",
"available": 1,
"logistics_company": "水趣到家",
"id": 545
},
{
"code": "HEUTE",
"available": 1,
"logistics_company": "货易达物流",
"id": 546
},
{
"code": "SHUILIDUO",
"available": 1,
"logistics_company": "水立多",
"id": 547
},
{
"code": "LSJY",
"available": 1,
"logistics_company": "龍順集運",
"id": 548
},
{
"code": "BENNIAO",
"available": 1,
"logistics_company": "笨鸟速运",
"id": 549
},
{
"code": "TJY",
"available": 0,
"logistics_company": "淘集運",
"id": 550
},
{
"code": "PUSHENG",
"available": 1,
"logistics_company": "璞笙物流",
"id": 551
},
{
"code": "DTS",
"available": 1,
"logistics_company": "洞庭山送水",
"id": 552
},
{
"code": "MXMJY",
"available": 1,
"logistics_company": "麦西盟集运",
"id": 553
},
{
"code": "ZXJY",
"available": 1,
"logistics_company": "志翔集运",
"id": 554
},
{
"code": "SHENGZHONG",
"available": 1,
"logistics_company": "胜中物流",
"id": 555
},
{
"code": "QIANTUTONG",
"available": 1,
"logistics_company": "千途通",
"id": 556
},
{
"code": "RUXIJY",
"available": 1,
"logistics_company": "如熙集运",
"id": 557
},
{
"code": "ZHANCHENG",
"available": 1,
"logistics_company": "展程物流",
"id": 558
},
{
"code": "ZHUOYUAN",
"available": 1,
"logistics_company": "卓远物流",
"id": 559
},
{
"code": "LUCHANG",
"available": 1,
"logistics_company": "禄昌物流",
"id": 560
},
{
"code": "BGJJY",
"available": 1,
"logistics_company": "BeeGoPLUS集运",
"id": 561
},
{
"code": "WENHUI",
"available": 1,
"logistics_company": "文辉物流",
"id": 562
},
{
"code": "JHJY",
"available": 1,
"logistics_company": "傑航集運",
"id": 563
},
{
"code": "WGWL",
"available": 1,
"logistics_company": "沃格物流",
"id": 564
},
{
"code": "XJMWL",
"available": 1,
"logistics_company": "馨家梦物流",
"id": 565
},
{
"code": "QTJY",
"available": 1,
"logistics_company": "去淘集运",
"id": 566
},
{
"code": "HJJY",
"available": 1,
"logistics_company": "海际集运",
"id": 567
},
{
"code": "JMWL",
"available": 1,
"logistics_company": "晋蒙物流",
"id": 568
},
{
"code": "QDWL",
"available": 1,
"logistics_company": "秦鼎物流",
"id": 569
},
{
"code": "HSJY",
"available": 1,
"logistics_company": "華颯集運",
"id": 570
},
{
"code": "HCWL",
"available": 0,
"logistics_company": "翰昌物流",
"id": 571
}
],
"request_id": "17631173841755006"
}
}
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