This commit is contained in:
2025-11-06 17:39:20 +08:00
parent bd61ef108c
commit 6768fa5061
2 changed files with 73 additions and 13 deletions

View File

@@ -96,9 +96,31 @@ public class TencentDocConfigController extends BaseController {
Integer currentProgress = redisCache.getCacheObject(syncProgressKey); Integer currentProgress = redisCache.getCacheObject(syncProgressKey);
if (currentProgress != null) { if (currentProgress != null) {
config.put("currentProgress", currentProgress); config.put("currentProgress", currentProgress);
config.put("nextStartRow", currentProgress + 1);
config.put("progressHint", String.format("已同步到第 %d 行,下次将从第 %d 行继续", // 根据回溯机制计算下次起始行
currentProgress, currentProgress + 1)); int threshold = startRow + 100;
int nextStartRow;
String progressHint;
if (currentProgress <= (startRow + 49)) {
// 进度较小,下次从配置起始行开始
nextStartRow = startRow;
progressHint = String.format("已同步到第 %d 行,下次将从第 %d 行重新开始(进度较小)",
currentProgress, nextStartRow);
} else if (currentProgress > threshold) {
// 进度较大下次回溯100行
nextStartRow = currentProgress - 100;
progressHint = String.format("已同步到第 %d 行,下次将从第 %d 行开始回溯100行防止遗漏",
currentProgress, nextStartRow);
} else {
// 进度在阈值范围内,下次从配置起始行开始
nextStartRow = startRow;
progressHint = String.format("已同步到第 %d 行,下次将从第 %d 行重新开始",
currentProgress, nextStartRow);
}
config.put("nextStartRow", nextStartRow);
config.put("progressHint", progressHint);
} else { } else {
config.put("currentProgress", null); config.put("currentProgress", null);
config.put("nextStartRow", startRow); config.put("nextStartRow", startRow);

View File

@@ -42,6 +42,9 @@ public class TencentDocController extends BaseController {
@Autowired @Autowired
private com.ruoyi.jarvis.service.ITencentDocTokenService tencentDocTokenService; private com.ruoyi.jarvis.service.ITencentDocTokenService tencentDocTokenService;
@Autowired
private com.ruoyi.jarvis.config.TencentDocConfig tencentDocConfig;
/** Redis key前缀用于存储上次处理的最大行数 */ /** Redis key前缀用于存储上次处理的最大行数 */
private static final String LAST_PROCESSED_ROW_KEY_PREFIX = "tendoc:last_row:"; private static final String LAST_PROCESSED_ROW_KEY_PREFIX = "tendoc:last_row:";
@@ -530,19 +533,38 @@ public class TencentDocController extends BaseController {
} }
} }
// 计算本次同步的起始行 // 计算本次同步的起始行(带回溯机制)
// 确保 configStartRow 不为 null
int effectiveStartRow = configStartRow != null ? configStartRow : (headerRow + 1);
int startRow; int startRow;
if (forceStartRow != null) { if (forceStartRow != null) {
// 强制指定行(手动指定) // 强制指定行(手动指定)
startRow = forceStartRow; startRow = forceStartRow;
log.info("使用强制指定的起始行: {}", startRow); log.info("使用强制指定的起始行: {}", startRow);
} else if (lastMaxRow != null && lastMaxRow >= configStartRow) { } else if (lastMaxRow != null && lastMaxRow >= effectiveStartRow) {
// 有上次进度,且大于等于配置起始行,则从上次进度+1继续增量同步 // 计算回溯阈值:配置起始行 + 100
startRow = lastMaxRow + 1; int threshold = effectiveStartRow + 100;
log.info("继续上次进度,从第 {} 行开始(上次到 {} 行)", startRow, lastMaxRow);
if (lastMaxRow <= (effectiveStartRow + 49)) {
// 进度较小(一批数据内),重新从配置起始行开始
startRow = effectiveStartRow;
log.info("上次进度 {} 较小(≤{}),重新从第 {} 行开始",
lastMaxRow, effectiveStartRow + 49, startRow);
} else if (lastMaxRow > threshold) {
// 进度较大超过阈值往回退100行防止遗漏
startRow = lastMaxRow - 100;
log.info("上次进度 {} 较大(>{}回溯100行从第 {} 行开始(防止遗漏)",
lastMaxRow, threshold, startRow);
} else {
// 进度在阈值范围内,重新从配置起始行开始
startRow = effectiveStartRow;
log.info("上次进度 {} 在阈值范围内({}-{}),重新从第 {} 行开始",
lastMaxRow, effectiveStartRow + 50, threshold, startRow);
}
} else { } else {
// 首次同步或配置被重置,使用配置的起始行 // 首次同步或配置被重置,使用配置的起始行
startRow = configStartRow != null ? configStartRow : (headerRow + 1); startRow = effectiveStartRow;
log.info("首次同步或配置已重置,从配置的起始行开始: {}", startRow); log.info("首次同步或配置已重置,从配置的起始行开始: {}", startRow);
} }
@@ -819,8 +841,24 @@ public class TencentDocController extends BaseController {
log.info("更新上次处理的最大行数 - 文件ID: {}, 工作表ID: {}, 最大行: {}", fileId, sheetId, currentMaxRow); log.info("更新上次处理的最大行数 - 文件ID: {}, 工作表ID: {}, 最大行: {}", fileId, sheetId, currentMaxRow);
} }
// 计算下次同步的起始行 // 计算下次同步的起始行(根据回溯机制)
int nextStartRow = currentMaxRow + 1; int threshold = effectiveStartRow + 100;
int nextStartRow;
String nextSyncHint;
if (currentMaxRow <= (effectiveStartRow + 49)) {
// 进度较小,下次从配置起始行开始
nextStartRow = effectiveStartRow;
nextSyncHint = String.format("下次将从第 %d 行重新开始(进度较小)", nextStartRow);
} else if (currentMaxRow > threshold) {
// 进度较大下次回溯100行
nextStartRow = currentMaxRow - 100;
nextSyncHint = String.format("下次将从第 %d 行开始回溯100行防止遗漏", nextStartRow);
} else {
// 进度在阈值范围内,下次从配置起始行开始
nextStartRow = effectiveStartRow;
nextSyncHint = String.format("下次将从第 %d 行重新开始", nextStartRow);
}
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
result.put("startRow", startRow); result.put("startRow", startRow);
@@ -839,11 +877,11 @@ public class TencentDocController extends BaseController {
"✓ 同步完成:成功填充 %d 条,跳过 %d 条,错误 %d 条\n" + "✓ 同步完成:成功填充 %d 条,跳过 %d 条,错误 %d 条\n" +
" 本次范围:第 %d-%d 行\n" + " 本次范围:第 %d-%d 行\n" +
" 当前进度:第 %d 行\n" + " 当前进度:第 %d 行\n" +
" 下次将从第 %d 行继续(增量同步)", " %s",
filledCount, skippedCount, errorCount, filledCount, skippedCount, errorCount,
startRow, currentMaxRow, startRow, currentMaxRow,
currentMaxRow, currentMaxRow,
nextStartRow nextSyncHint
); );
result.put("message", message); result.put("message", message);