This commit is contained in:
2025-11-05 16:13:54 +08:00
parent 69431c9cd5
commit ed37a8f94c

View File

@@ -761,16 +761,47 @@ public class JDOrderController extends BaseController {
responseData.put("requestUrl", externalUrl);
responseData.put("responseRaw", result); // 原始返回数据
JSONObject parsedData = null;
try {
// 尝试解析为JSON
Object parsed = JSON.parse(result);
responseData.put("responseData", parsed);
if (parsed instanceof JSONObject) {
parsedData = (JSONObject) parsed;
responseData.put("responseData", parsedData);
logger.info("返回数据已解析为JSON对象");
} else {
responseData.put("responseData", parsed);
}
} catch (Exception e) {
// 如果不是JSON只保存原始字符串
logger.warn("返回数据不是有效的JSON格式将作为原始字符串返回: {}", e.getMessage());
}
// 检查waybill_no如果不为空则调用企业应用推送
if (parsedData != null) {
try {
// 检查是否有data字段
JSONObject dataObj = parsedData.getJSONObject("data");
if (dataObj != null) {
String waybillNo = dataObj.getString("waybill_no");
if (waybillNo != null && !waybillNo.trim().isEmpty()) {
logger.info("检测到waybill_no不为空: {}, 开始调用企业应用推送 - 订单ID: {}", waybillNo, orderId);
// 调用企业应用推送逻辑
sendEnterprisePushNotification(order, waybillNo, parsedData);
responseData.put("pushSent", true);
logger.info("企业应用推送已发送 - 订单ID: {}, waybill_no: {}", orderId, waybillNo);
} else {
logger.info("waybill_no为空无需推送 - 订单ID: {}", orderId);
responseData.put("pushSent", false);
}
}
} catch (Exception e) {
logger.error("检查waybill_no或推送时发生异常 - 订单ID: {}", orderId, e);
responseData.put("pushSent", false);
responseData.put("pushError", e.getMessage());
}
}
logger.info("返回响应数据给前端 - 订单ID: {}", orderId);
return AjaxResult.success(responseData);
} catch (Exception e) {
@@ -778,4 +809,142 @@ public class JDOrderController extends BaseController {
return AjaxResult.error("获取物流信息失败: " + e.getMessage());
}
}
/**
* 调用企业应用推送逻辑
* @param order 订单信息
* @param waybillNo 运单号
* @param logisticsData 物流数据
*/
private void sendEnterprisePushNotification(JDOrder order, String waybillNo, JSONObject logisticsData) {
try {
// 构建推送消息内容
StringBuilder pushContent = new StringBuilder();
pushContent.append("物流信息获取成功\n");
pushContent.append("订单号:").append(order.getOrderId() != null ? order.getOrderId() : "").append("\n");
pushContent.append("内部单号:").append(order.getRemark() != null ? order.getRemark() : "").append("\n");
pushContent.append("分销标识:").append(order.getDistributionMark() != null ? order.getDistributionMark() : "").append("\n");
pushContent.append("运单号:").append(waybillNo).append("\n");
pushContent.append("物流链接:").append(order.getLogisticsLink() != null ? order.getLogisticsLink() : "").append("\n");
// 提取物流跟踪信息
JSONObject dataObj = logisticsData.getJSONObject("data");
if (dataObj != null) {
JSONArray trackingInfo = dataObj.getJSONArray("tracking_info");
if (trackingInfo != null && trackingInfo.size() > 0) {
pushContent.append("\n物流跟踪信息\n");
// 只显示最新的几条
int maxItems = Math.min(3, trackingInfo.size());
for (int i = 0; i < maxItems; i++) {
JSONObject item = trackingInfo.getJSONObject(i);
if (item != null) {
String text = item.getString("text");
String time = item.getString("time");
if (text != null) {
// 取第一行作为主要信息
String[] lines = text.split("\n");
if (lines.length > 0) {
pushContent.append("- ").append(lines[0]);
if (time != null && !time.trim().isEmpty()) {
pushContent.append(" (").append(time).append(")");
}
pushContent.append("\n");
}
}
}
}
if (trackingInfo.size() > maxItems) {
pushContent.append("... 还有 ").append(trackingInfo.size() - maxItems).append(" 条跟踪信息\n");
}
}
}
// 调用企业微信推送接口参考WxtsUtil的实现
String pushUrl = "https://wxts.van333.cn/wx/send/jd";
String token = "super_token_b62190c26"; // 与WxtsUtil中的TOKEN保持一致
JSONObject pushParam = new JSONObject();
pushParam.put("title", "JD物流信息推送");
String content = pushContent.toString().replaceAll("\\n", "<br>");
String common = "192.168.8.88 (微信机器人), 信息 : ";
content = common + content + "<br><br>";
pushParam.put("text", content);
// 使用支持自定义header的HTTP请求
String pushResult = sendPostWithHeaders(pushUrl, pushParam.toJSONString(), token);
logger.info("企业应用推送调用结果 - 订单ID: {}, waybill_no: {}, 推送结果: {}",
order.getId(), waybillNo, pushResult);
} catch (Exception e) {
logger.error("调用企业应用推送失败 - 订单ID: {}, waybill_no: {}, 错误: {}",
order.getId(), waybillNo, e.getMessage(), e);
// 不抛出异常,避免影响主流程
}
}
/**
* 发送POST请求支持自定义header用于企业微信推送
* @param url 请求URL
* @param jsonBody JSON请求体
* @param token 认证token
* @return 响应结果
*/
private String sendPostWithHeaders(String url, String jsonBody, String token) {
java.io.BufferedReader in = null;
java.io.PrintWriter out = null;
StringBuilder result = new StringBuilder();
try {
java.net.URL realUrl = new java.net.URL(url);
java.net.URLConnection conn = realUrl.openConnection();
// 设置请求头
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("vanToken", token);
conn.setRequestProperty("source", "XZJ_UBUNTU");
conn.setDoOutput(true);
conn.setDoInput(true);
// 发送请求体
out = new java.io.PrintWriter(conn.getOutputStream());
out.print(jsonBody);
out.flush();
// 读取响应
in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(), java.nio.charset.StandardCharsets.UTF_8));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
logger.info("企业微信推送请求成功 - URL: {}, 响应: {}", url, result.toString());
} catch (java.net.ConnectException e) {
logger.error("企业微信推送连接失败 - URL: {}", url, e);
throw new RuntimeException("推送连接失败: " + e.getMessage(), e);
} catch (java.net.SocketTimeoutException e) {
logger.error("企业微信推送超时 - URL: {}", url, e);
throw new RuntimeException("推送请求超时: " + e.getMessage(), e);
} catch (java.io.IOException e) {
logger.error("企业微信推送IO异常 - URL: {}", url, e);
throw new RuntimeException("推送IO异常: " + e.getMessage(), e);
} catch (Exception e) {
logger.error("企业微信推送异常 - URL: {}", url, e);
throw new RuntimeException("推送异常: " + e.getMessage(), e);
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (java.io.IOException ex) {
logger.error("关闭流异常", ex);
}
}
return result.toString();
}
}