This commit is contained in:
Leo
2026-02-04 23:49:38 +08:00
parent 7e7250bc9c
commit f928e778da

View File

@@ -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
);