feat: 统一顺运宝日期同步并记录历史 (#59)

This commit is contained in:
chengma
2026-08-09 18:22:58 +08:00
parent ea7932db63
commit 05a54b044d
18 changed files with 934 additions and 144 deletions
+76
View File
@@ -191,6 +191,82 @@ func TestSybSyncState_首次为空之后可更新(t *testing.T) {
}
}
func createSybSyncTestUser(t *testing.T, db *sql.DB) model.User {
t.Helper()
user := model.User{
UserID: "USR-SYNC", Username: "buyer", PasswordHash: "test-hash",
Role: model.RolePurchaser, Status: model.UserActive,
PasswordChangedAt: "2026-08-09T00:00:00Z", CreatedAt: "2026-08-09T00:00:00Z",
UpdatedAt: "2026-08-09T00:00:00Z",
}
if err := CreateInitialAdmin(db, user); err != nil {
t.Fatalf("创建同步记录测试用户失败: %v", err)
}
return user
}
func TestSybSyncRun_创建完成并分页读取(t *testing.T) {
db := newSybTestDB(t)
user := createSybSyncTestUser(t, db)
run := model.SybSyncRun{
RunID: "SYB-RUN-1", UserID: user.UserID, DateFrom: "2026-08-07",
DateTo: "2026-08-09", StartedAt: "2026-08-09T01:00:00Z",
}
if err := CreateSybSyncRun(db, run); err != nil {
t.Fatalf("创建同步记录失败: %v", err)
}
if err := FinishSybSyncRun(db, model.SybSyncRun{
RunID: "SYB-RUN-1", Status: model.SybSyncSucceeded,
StockCount: 3, DetailCount: 4, Created: 2, Updated: 2, Skipped: 1,
CursorAdvanced: true, FinishedAt: "2026-08-09T01:02:00Z",
}); err != nil {
t.Fatalf("完成同步记录失败: %v", err)
}
rows, err := ListSybSyncRuns(db, 10, 0)
if err != nil || len(rows) != 1 {
t.Fatalf("读取同步记录失败: rows=%+v err=%v", rows, err)
}
got := rows[0]
if got.Username != "buyer" || got.Status != model.SybSyncSucceeded ||
got.DetailCount != 4 || !got.CursorAdvanced || got.FinishedAt == "" {
t.Fatalf("同步记录字段不正确: %+v", got)
}
if count, err := CountSybSyncRuns(db); err != nil || count != 1 {
t.Fatalf("同步记录总数错误: count=%d err=%v", count, err)
}
}
func TestInterruptRunningSybSyncRuns_只中断未完成记录(t *testing.T) {
db := newSybTestDB(t)
user := createSybSyncTestUser(t, db)
for _, id := range []string{"RUNNING", "DONE"} {
if err := CreateSybSyncRun(db, model.SybSyncRun{
RunID: id, UserID: user.UserID, DateFrom: "2026-08-09", DateTo: "2026-08-09",
StartedAt: "2026-08-09T01:00:00Z",
}); err != nil {
t.Fatal(err)
}
}
if err := FinishSybSyncRun(db, model.SybSyncRun{
RunID: "DONE", Status: model.SybSyncSucceeded, FinishedAt: "2026-08-09T01:01:00Z",
}); err != nil {
t.Fatal(err)
}
affected, err := InterruptRunningSybSyncRuns(db, "2026-08-09T02:00:00Z")
if err != nil || affected != 1 {
t.Fatalf("应该只中断一条 running 记录: affected=%d err=%v", affected, err)
}
rows, _ := ListSybSyncRuns(db, 10, 0)
statuses := map[string]model.SybSyncRunStatus{}
for _, row := range rows {
statuses[row.RunID] = row.Status
}
if statuses["RUNNING"] != model.SybSyncInterrupted || statuses["DONE"] != model.SybSyncSucceeded {
t.Fatalf("中断状态错误: %+v", statuses)
}
}
func TestListSybOrders_关键字筛选订单号和标题(t *testing.T) {
db := newSybTestDB(t)
mustUpsert := func(sybID, orderNo, title string) {