fix: 修复顺运宝采购完成状态与重复采购 (#169)

This commit is contained in:
chengma
2026-08-11 18:05:27 +08:00
parent c61a028d9c
commit 5528b4b874
9 changed files with 160 additions and 26 deletions
+58
View File
@@ -341,6 +341,64 @@ func TestCreatePurchaseTasks_安全字段和重复保护(t *testing.T) {
}
}
func TestCreatePurchaseTasks_成功或待核对任务禁止重复采购(t *testing.T) {
cases := []struct {
status model.TaskStatus
wantStage string
wantReason string
wantAttention bool
}{
{model.TaskSucceeded, SybStagePurchaseCompleted, "已有成功采购任务", false},
{model.TaskManualReview, SybStagePurchaseReview, "待人工核对", true},
}
for _, tc := range cases {
t.Run(string(tc.status), func(t *testing.T) {
db := newTestDB(t)
key := seedPurchasableWorkflow(t, db, "SYB-LOCKED")
if err := SaveSybMapping(db, "SYB-LOCKED", key, "USR-1"); err != nil {
t.Fatal(err)
}
admin, _, _ := prepareClientAssignmentUsers(t, db)
if err := RegisterClient(db, model.Client{ClientID: "CLIENT-1", Name: "采购机"}, true); err != nil {
t.Fatal(err)
}
created, err := CreatePurchaseTasks(db, admin,
[]PurchaseTaskRequest{{SybID: "SYB-LOCKED", MaxPriceCent: 4200}}, "CLIENT-1")
if err != nil || created.Created != 1 {
t.Fatalf("准备采购任务失败: result=%+v err=%v", created, err)
}
if _, err := db.Exec(`UPDATE tasks SET status=? WHERE task_type='purchase' AND syb_id=?`, tc.status, "SYB-LOCKED"); err != nil {
t.Fatal(err)
}
before := countPurchaseTasksForSyb(t, db, "SYB-LOCKED")
result, err := CreatePurchaseTasks(db, admin,
[]PurchaseTaskRequest{{SybID: "SYB-LOCKED", MaxPriceCent: 4300}}, "CLIENT-1")
if err != nil || result.Created != 0 || len(result.Failures) != 1 ||
!strings.Contains(result.Failures[0].Reason, tc.wantReason) {
t.Fatalf("%s 任务必须阻止重复采购: result=%+v err=%v", tc.status, result, err)
}
if after := countPurchaseTasksForSyb(t, db, "SYB-LOCKED"); after != before {
t.Fatalf("拒绝后任务数量从 %d 变为 %d", before, after)
}
list, err := ListSybOrdersView(db, "", "", tc.wantStage, 1)
if err != nil || list.Total != 1 || len(list.Rows) != 1 ||
list.Rows[0].Stage != tc.wantStage || list.Rows[0].NeedsAttention != tc.wantAttention {
t.Fatalf("%s 阶段筛选错误: result=%+v err=%v", tc.status, list, err)
}
})
}
}
func countPurchaseTasksForSyb(t *testing.T, db *sql.DB, sybID string) int {
t.Helper()
var count int
if err := db.QueryRow(`SELECT COUNT(*) FROM tasks WHERE task_type='purchase' AND syb_id=?`, sybID).Scan(&count); err != nil {
t.Fatal(err)
}
return count
}
func TestCreatePurchaseTasks_客户端权限和逐条失败(t *testing.T) {
db := newTestDB(t)
key := seedPurchasableWorkflow(t, db, "SYB-1")