fix: 修复顺运宝分页总数误判 (#60)

This commit is contained in:
chengma
2026-08-09 19:01:04 +08:00
parent 3bd9c9a2c3
commit 919522ff79
5 changed files with 56 additions and 20 deletions
+17 -4
View File
@@ -621,7 +621,7 @@ func RunSybSyncWithOptions(ctx context.Context, db *sql.DB, client *syb.Client,
orderedIDs := make([]int64, 0, plan.total)
for start := 0; start < plan.total; start += pageSize {
pageIndex := start/pageSize + 1
rows, responseTotal, listErr := client.ListPage(ctx, plan.date, plan.date, start, pageIndex, pageSize)
rows, pageCount, listErr := client.ListPage(ctx, plan.date, plan.date, start, pageIndex, pageSize)
if listErr != nil {
report.Err = fmt.Errorf("拉取 %s 货运单列表第 %d 页失败(已获取 %d/%d 张,本次同步整体作废,"+
"下次会从同一个起始日期重新拉,靠 upsert 幂等不会重复计数): %w",
@@ -629,9 +629,10 @@ func RunSybSyncWithOptions(ctx context.Context, db *sql.DB, client *syb.Client,
report.FinishedAt = time.Now().UTC()
return report
}
if responseTotal != plan.total {
report.Err = fmt.Errorf("%s 货运单总数在分页期间从 %d 变为 %d,"+
"为防止 offset 分页漏单,本次同步停止且不推进游标", plan.date, plan.total, responseTotal)
expectedPageCount := min(pageSize, plan.total-start)
if pageCount != expectedPageCount || len(rows) != expectedPageCount {
report.Err = fmt.Errorf("%s 货运单列表第 %d 页不完整:预期 %d 行,实际 %d 行,"+
"本次同步停止且不推进游标", plan.date, pageIndex, expectedPageCount, len(rows))
report.FinishedAt = time.Now().UTC()
return report
}
@@ -643,6 +644,18 @@ func RunSybSyncWithOptions(ctx context.Context, db *sql.DB, client *syb.Client,
orderedIDs = append(orderedIDs, row.ID)
}
}
afterTotal, totalErr := client.ListTotal(ctx, plan.date, plan.date, pageSize)
if totalErr != nil {
report.Err = fmt.Errorf("分页后重新查询 %s 货运单总数失败: %w", plan.date, totalErr)
report.FinishedAt = time.Now().UTC()
return report
}
if afterTotal != plan.total {
report.Err = fmt.Errorf("%s 货运单总数在分页期间从 %d 变为 %d,"+
"为防止 offset 分页漏单,本次同步停止且不推进游标", plan.date, plan.total, afterTotal)
report.FinishedAt = time.Now().UTC()
return report
}
if len(orderedIDs) != plan.total {
report.Err = fmt.Errorf("%s 货运单列表不完整:预期 %d 张,分页后只有 %d 个唯一 ID,"+
"本次同步停止且不推进游标", plan.date, plan.total, len(orderedIDs))