This commit is contained in:
2025-11-06 20:18:15 +08:00
parent b532aa1b84
commit e865220a50
6 changed files with 798 additions and 7 deletions

View File

@@ -467,6 +467,7 @@ public class TencentDocController extends BaseController {
// 1. 获取参数
thirdPartyOrderNo = (String) params.get("thirdPartyOrderNo");
String logisticsLink = (String) params.get("logisticsLink");
Boolean forceRePush = params.get("forceRePush") != null ? (Boolean) params.get("forceRePush") : false;
if (thirdPartyOrderNo == null || thirdPartyOrderNo.isEmpty()) {
return AjaxResult.error("第三方单号不能为空");
@@ -475,7 +476,24 @@ public class TencentDocController extends BaseController {
return AjaxResult.error("物流链接不能为空");
}
// 2. 获取访问令牌
// 2. 检查订单是否已推送(防止重复推送)
JDOrder order = jdOrderService.selectJDOrderByThirdPartyOrderNo(thirdPartyOrderNo);
if (order == null) {
logOperation(null, null, "WRITE_SINGLE", thirdPartyOrderNo, null, logisticsLink,
"FAILED", "订单不存在");
return AjaxResult.error("订单不存在:" + thirdPartyOrderNo);
}
// 如果已推送且不是强制重推,则拒绝
if (order.getTencentDocPushed() != null && order.getTencentDocPushed() == 1 && !forceRePush) {
String pushTimeStr = order.getTencentDocPushTime() != null ?
new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(order.getTencentDocPushTime()) : "未知";
logOperation(null, null, "WRITE_SINGLE", thirdPartyOrderNo, null, logisticsLink,
"SKIPPED", String.format("订单已推送,推送时间: %s", pushTimeStr));
return AjaxResult.error(String.format("该订单已推送到腾讯文档(推送时间:%s请勿重复操作如需重新推送请使用强制推送功能。", pushTimeStr));
}
// 3. 获取访问令牌
String accessToken;
try {
accessToken = tencentDocTokenService.getValidAccessToken();
@@ -710,11 +728,24 @@ public class TencentDocController extends BaseController {
log.info("✓ 物流链接写入成功 - 单号: {}, 行: {}, 链接: {}", thirdPartyOrderNo, targetRow, logisticsLink);
// 13. 更新订单的推送状态(标记为已推送)
try {
order.setTencentDocPushed(1);
order.setTencentDocPushTime(new java.util.Date());
jdOrderService.updateJDOrder(order);
log.info("✓ 订单推送状态已更新 - 单号: {}", thirdPartyOrderNo);
} catch (Exception e) {
log.error("更新订单推送状态失败,但写入腾讯文档已成功", e);
// 不影响主流程,继续返回成功
}
JSONObject result = new JSONObject();
result.put("thirdPartyOrderNo", thirdPartyOrderNo);
result.put("logisticsLink", logisticsLink);
result.put("row", targetRow);
result.put("column", logisticsColumn);
result.put("pushed", true);
result.put("pushTime", order.getTencentDocPushTime());
return AjaxResult.success("物流链接填充成功", result);
@@ -817,6 +848,10 @@ public class TencentDocController extends BaseController {
Boolean.valueOf(params.get("forceStart").toString()) : false;
Integer forceStartRow = params.get("forceStartRow") != null ?
Integer.valueOf(params.get("forceStartRow").toString()) : configStartRow;
// 新增参数是否跳过已推送的订单默认true防止重复推送
Boolean skipPushedOrders = params.get("skipPushedOrders") != null ?
Boolean.valueOf(params.get("skipPushedOrders").toString()) : true;
if (accessToken == null || fileId == null || sheetId == null) {
return AjaxResult.error("文档配置不完整,请先配置 fileId 和 sheetId");
@@ -1056,10 +1091,30 @@ public class TencentDocController extends BaseController {
orderNo = orderNo.trim();
// 检查物流链接列是否已有值
// 检查物流链接列是否已有值(可能是别人手动填写的)
String existingLogisticsLink = row.getString(logisticsLinkColumn);
if (existingLogisticsLink != null && !existingLogisticsLink.trim().isEmpty()) {
skippedCount++; // 已有物流链接,跳过
// 文档中已有物流链接,同步更新订单的推送状态
try {
JDOrder existingOrder = jdOrderService.selectJDOrderByThirdPartyOrderNo(orderNo);
if (existingOrder != null &&
(existingOrder.getTencentDocPushed() == null || existingOrder.getTencentDocPushed() == 0)) {
// 订单未标记为已推送,但文档中已有值,同步状态
existingOrder.setTencentDocPushed(1);
existingOrder.setTencentDocPushTime(new java.util.Date());
jdOrderService.updateJDOrder(existingOrder);
log.info("✓ 同步订单状态 - 单号: {}, 行号: {}, 原因: 文档中已有物流链接(可能手动填写)",
orderNo, excelRow);
// 记录同步日志
logOperation(fileId, sheetId, "BATCH_SYNC", orderNo, excelRow, existingLogisticsLink,
"SKIPPED", "文档中已有物流链接,已同步订单状态");
}
} catch (Exception e) {
log.error("同步订单状态失败 - 单号: {}, 行号: {}", orderNo, excelRow, e);
}
skippedCount++; // 已有物流链接,跳过写入
continue;
}
@@ -1067,22 +1122,42 @@ public class TencentDocController extends BaseController {
// 根据第三方单号查询订单
JDOrder order = jdOrderService.selectJDOrderByThirdPartyOrderNo(orderNo);
if (order != null && order.getLogisticsLink() != null && !order.getLogisticsLink().trim().isEmpty()) {
if (order == null) {
errorCount++;
log.warn("未找到订单 - 单号: {}, 行号: {}", orderNo, excelRow);
continue;
}
// 检查订单是否已推送(防止重复推送)
if (skipPushedOrders && order.getTencentDocPushed() != null && order.getTencentDocPushed() == 1) {
skippedCount++;
log.info("跳过已推送订单 - 单号: {}, 推送时间: {}, 行号: {}",
orderNo,
order.getTencentDocPushTime() != null ?
new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(order.getTencentDocPushTime()) : "未知",
excelRow);
continue;
}
if (order.getLogisticsLink() != null && !order.getLogisticsLink().trim().isEmpty()) {
String logisticsLink = order.getLogisticsLink().trim();
// 构建更新请求
// 构建更新请求,同时保存订单对象用于后续更新推送状态
JSONObject update = new JSONObject();
update.put("row", excelRow);
update.put("column", logisticsLinkColumn);
update.put("orderNo", orderNo);
update.put("logisticsLink", logisticsLink);
update.put("order", order); // 保存订单对象
updates.add(update);
filledCount++;
log.info("找到订单物流链接 - 单号: {}, 物流链接: {}, 行号: {}", orderNo, logisticsLink, excelRow);
log.info("找到订单物流链接 - 单号: {}, 物流链接: {}, 行号: {}, 已推送: {}",
orderNo, logisticsLink, excelRow,
order.getTencentDocPushed() != null && order.getTencentDocPushed() == 1 ? "" : "");
} else {
errorCount++;
log.warn("未找到订单物流链接为空 - 单号: {}, 行号: {}", orderNo, excelRow);
log.warn("订单物流链接为空 - 单号: {}, 行号: {}", orderNo, excelRow);
}
} catch (Exception e) {
errorCount++;
@@ -1179,9 +1254,33 @@ public class TencentDocController extends BaseController {
successUpdates++;
log.info("✓ 写入成功 - 行: {}, 单号: {}, 物流链接: {}", row, expectedOrderNo, logisticsLink);
// 更新订单的推送状态
try {
JDOrder orderToUpdate = (JDOrder) update.get("order");
if (orderToUpdate != null) {
orderToUpdate.setTencentDocPushed(1);
orderToUpdate.setTencentDocPushTime(new java.util.Date());
jdOrderService.updateJDOrder(orderToUpdate);
log.info("✓ 订单推送状态已更新 - 单号: {}", expectedOrderNo);
}
} catch (Exception e) {
log.error("更新订单推送状态失败(但写入腾讯文档已成功) - 单号: {}", expectedOrderNo, e);
// 不影响主流程,继续执行
}
// 记录操作日志
logOperation(fileId, sheetId, "BATCH_SYNC", expectedOrderNo, row, logisticsLink,
"SUCCESS", null);
} catch (Exception e) {
log.error("写入数据失败 - 行: {}", entry.getKey(), e);
errorCount++;
// 记录失败日志
String orderNo = entry.getValue().getString("orderNo");
String logisticsLink = entry.getValue().getString("logisticsLink");
logOperation(fileId, sheetId, "BATCH_SYNC", orderNo, entry.getKey(), logisticsLink,
"FAILED", "写入异常: " + e.getMessage());
}
// 添加延迟避免API调用频率过高
@@ -1245,16 +1344,19 @@ public class TencentDocController extends BaseController {
result.put("errorCount", errorCount);
result.put("orderNoColumn", orderNoColumn);
result.put("logisticsLinkColumn", logisticsLinkColumn);
result.put("skipPushedOrders", skipPushedOrders); // 是否跳过已推送订单
// 构建详细的提示信息
String message = String.format(
"✓ 同步完成:成功填充 %d 条,跳过 %d 条,错误 %d 条\n" +
" 本次范围:第 %d-%d 行\n" +
" 当前进度:第 %d 行\n" +
" 防重推送:%s\n" +
" %s",
filledCount, skippedCount, errorCount,
startRow, currentMaxRow,
currentMaxRow,
skipPushedOrders ? "已启用(跳过已推送订单)" : "已禁用",
nextSyncHint
);
result.put("message", message);