1
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user