feat(wms): 添加物流预览和快递问题相关功能

- 新增物流预览和快递问题相关的实体类、Mapper、Service和Controller
- 实现物流预览列表查询、导出、详情获取、新增、修改和删除功能
- 实现快递问题列表查询、详情获取、新增、修改和删除功能
- 添加百世、顺丰、申通快递的路由查询工具类
- 更新pom.xml,添加fastjson2等依赖
- 修改application-stage.yml,禁用xxl-job
This commit is contained in:
2025-08-11 18:06:37 +08:00
parent 542b481155
commit 1cd1699bf3
40 changed files with 3321 additions and 2 deletions

View File

@@ -0,0 +1,117 @@
package com.klp.utils;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.klp.domain.vo.WmsExpressVo;
import com.zto.zop.ZopClient;
import com.zto.zop.ZopPublicRequest;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import static com.zto.zop.EncryptionType.MD5;
public class ZtoTrackQueryUtil {
// 替换为你的appKey和appSecret
private static final String APP_KEY = "1ebf01ae01cc81d78ba9a";
private static final String APP_SECRET = "4bded7f302da7f7913b01810e3421b80";
// 测试环境
// private static final String API_URL = "https://japi-test.zto.com/zto.merchant.waybill.track.query";
// 正式环境
private static final String API_URL = "https://japi.zto.com/zto.merchant.waybill.track.query";
/**
* 查询中通物流轨迹
*
* @param billCode 运单号
* @return 查询结果JSON
*/
public static WmsExpressVo queryTrack(String billCode,String phoneNumber) throws IOException {
ZopClient client = new ZopClient(APP_KEY, APP_SECRET);
ZopPublicRequest request = new ZopPublicRequest();
request.setBody("{\"billCode\":\""+billCode+"\",\"mobilePhone\":\""+ StringUtils.right(phoneNumber, 4)+"\"}");
request.setUrl(API_URL);
request.setBase64(true);
request.setEncryptionType(MD5);
request.setTimestamp(null);
String execute = client.execute(request);
System.out.println(execute);
return parseData(execute);
}
/**
* 解析中通返回数据封装为WmsExpressVo
*/
public static WmsExpressVo parseData(String result) {
if (StringUtils.isBlank(result)) {
return null;
}
try {
JSONObject json = JSON.parseObject(result);
if (json == null || !"true".equalsIgnoreCase(String.valueOf(json.get("status")))) {
return null;
}
// 取result数组
if (!json.containsKey("result")) {
return null;
}
// 只取第一个轨迹(如有多条)
Object resultArr = json.get("result");
if (!(resultArr instanceof java.util.List)) {
return null;
}
JSONArray arr = json.getJSONArray("result");
if (arr == null || arr.isEmpty()) {
return null;
}
JSONObject first = arr.getJSONObject(arr.size() - 1); // 取最后一条为最新
if (first == null) {
return null;
}
String scanDate = first.getString("scanDate");
String desc = first.getString("desc");
WmsExpressVo vo = new WmsExpressVo();
// scanDate为时间戳字符串
if (StringUtils.isNotBlank(scanDate)) {
try {
long time = Long.parseLong(scanDate);
vo.setAcceptTime(new java.util.Date(time));
} catch (Exception e) {
vo.setAcceptTime(null);
}
}
vo.setFirstStatusName(desc);
return vo;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String getPublicIp() {
String ip = "";
try {
URL url = new URL("http://ifconfig.me/ip");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
ip = in.readLine();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return ip;
}
// main方法测试
public static void main(String[] args) throws IOException {
System.out.println("本机公网IP为: " + getPublicIp());
String billCode = "78925013374727";
WmsExpressVo result = queryTrack(billCode,"2410");
System.out.println(result);
}
}