From f928e778dadad36b6d0f477a456fdc306a6fb9c0 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Feb 2026 23:49:38 +0800 Subject: [PATCH] 1 --- .../jarvis/TencentDocController.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java index 536ba92..01ac52e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java @@ -61,6 +61,8 @@ public class TencentDocController extends BaseController { private static final int API_MAX_ROWS_PER_REQUEST = 200; /** 回溯行数:下次起始行 = 本次扫描终点 + 1 - 回溯,用于覆盖物流变更或延后补填 */ private static final int BACKTRACK_ROWS = 80; + /** 整批都跳过(0 写入)时使用的回溯行数,减小回溯以尽快扫到后续行(如 308) */ + private static final int BACKTRACK_ROWS_WHEN_ALL_SKIPPED = 20; /** 最小前进行数:本次至少“扫过”这么多行,下次起始行至少 = 本次起始 + 最小前进(避免空行多时原地打转) */ private static final int MIN_ADVANCE_ROWS = 50; @@ -1231,11 +1233,12 @@ public class TencentDocController extends BaseController { log.warn("sheetData内容预览: {}", sheetData.toJSONString().substring(0, Math.min(500, sheetData.toJSONString().length()))); } - // 无数据时也推进进度,避免大量空行时原地打转;下次起始 = 本批终点 + 1 - 回溯 + // 无数据时也推进进度,使用较小回溯尽快扫到后续行 int emptyCurrentMax = effectiveEndRow; + int emptyBacktrack = BACKTRACK_ROWS_WHEN_ALL_SKIPPED; int emptyNextStart = Math.max(effectiveStartRow, - Math.max(startRow + MIN_ADVANCE_ROWS, emptyCurrentMax + 1 - BACKTRACK_ROWS)); - int emptyProgressToSave = Math.max(emptyCurrentMax, startRow + MIN_ADVANCE_ROWS + BACKTRACK_ROWS - 1); + Math.max(startRow + MIN_ADVANCE_ROWS, emptyCurrentMax + 1 - emptyBacktrack)); + int emptyProgressToSave = Math.max(emptyCurrentMax, startRow + MIN_ADVANCE_ROWS + emptyBacktrack - 1); redisCache.setCacheObject(redisKey, emptyProgressToSave, 30, TimeUnit.DAYS); log.info("本批无数据,已推进进度: nextStartRow={}, Redis 进度={}", emptyNextStart, emptyProgressToSave); @@ -1732,16 +1735,17 @@ public class TencentDocController extends BaseController { // 完美推送回溯:根据本次扫描/写入结果决定下次起始行与 Redis 进度 // currentMaxRow = 本批实际涉及的最大行(有写入用最大成功行,否则用本批扫描终点) int currentMaxRow = (maxSuccessRow > 0) ? maxSuccessRow : effectiveEndRow; - // 下次起始 = 本批最大行 + 1 - 回溯行数,且不小于配置起始行;并保证至少前进行数(避免大量空行时原地打转) + // 整批都跳过时用较小回溯,尽快扫到后续行(如 308);有写入时用完整回溯覆盖物流变更 + int backtrack = (successUpdates > 0) ? BACKTRACK_ROWS : BACKTRACK_ROWS_WHEN_ALL_SKIPPED; int nextStartRow = Math.max(effectiveStartRow, - Math.max(startRow + MIN_ADVANCE_ROWS, currentMaxRow + 1 - BACKTRACK_ROWS)); + Math.max(startRow + MIN_ADVANCE_ROWS, currentMaxRow + 1 - backtrack)); // 进度写入 Redis:至少推进到 (startRow + 最小前进 + 回溯 - 1),保证下次不会重复扫同一段 - int progressToSave = Math.max(currentMaxRow, startRow + MIN_ADVANCE_ROWS + BACKTRACK_ROWS - 1); + int progressToSave = Math.max(currentMaxRow, startRow + MIN_ADVANCE_ROWS + backtrack - 1); redisCache.setCacheObject(redisKey, progressToSave, 30, TimeUnit.DAYS); String nextSyncHint = String.format( "下次将从第 %d 行开始(本批最大行: %d,回溯 %d 行;已写入 %d 条,跳过 %d 条)", - nextStartRow, currentMaxRow, BACKTRACK_ROWS, successUpdates, skippedCount); + nextStartRow, currentMaxRow, backtrack, successUpdates, skippedCount); log.info("========== 更新Redis进度 =========="); log.info("本批范围: {}~{},实际最大行: {},下次起始: {},Redis 进度: {}", startRow, effectiveEndRow, currentMaxRow, nextStartRow, progressToSave); log.info("Redis Key: {}", redisKey); @@ -1768,7 +1772,7 @@ public class TencentDocController extends BaseController { " %s", filledCount, skippedCount, errorCount, startRow, effectiveEndRow, - currentMaxRow, nextStartRow, BACKTRACK_ROWS, + currentMaxRow, nextStartRow, backtrack, skipPushedOrders ? "已启用(跳过已推送订单)" : "已禁用", nextSyncHint );