feat: 增加规格匹配建议与决策审计 (#90)

This commit is contained in:
chengma
2026-08-10 12:41:17 +08:00
parent 5abe81e128
commit 5a77bde534
15 changed files with 680 additions and 46 deletions
+76
View File
@@ -130,6 +130,82 @@ func TestSybMapping_换品和选项消失都会失效(t *testing.T) {
})
}
func TestSybMapping_建议审计追加陈旧保护与事务回滚(t *testing.T) {
db := newTestDB(t)
order := seedWorkflowOrder(t, db, "SYB-AUDIT", "SP-AUDIT", "灰色,L建議53-57公斤")
if _, err := AssociateShopeePdd(db, "SP-AUDIT", pddURLA, false); err != nil {
t.Fatal(err)
}
raw := `{"goods_id":"737116531267","dimensions":[{"key":"color","name":"颜色分类"},{"key":"size","name":"尺码"}],"skus":[{"options":{"color":"灰色中长款","size":"L(80-115斤)"},"price_cent":3990,"available":true},{"options":{"color":"黑色","size":"L(80-115斤)"},"price_cent":3990,"available":true}]}`
if err := repository.SetCollectResult(db, "737116531267", "PDD", "", raw); err != nil {
t.Fatal(err)
}
detail, err := GetSybProcessingDetail(db, order.SybID)
if err != nil {
t.Fatal(err)
}
var suggested, other string
for _, c := range detail.PddChoices {
if c.Recommended {
suggested = c.Key
} else {
other = c.Key
}
}
if suggested == "" || detail.ContextVersion == "" {
t.Fatalf("无建议: %+v", detail)
}
var unopenedMappings, unopenedDecisions int
db.QueryRow(`SELECT COUNT(*) FROM spec_mappings WHERE shopee_goods_id='SP-AUDIT'`).Scan(&unopenedMappings)
db.QueryRow(`SELECT COUNT(*) FROM spec_mapping_decisions WHERE shopee_goods_id='SP-AUDIT'`).Scan(&unopenedDecisions)
if unopenedMappings != 0 || unopenedDecisions != 0 {
t.Fatal("只打开或关闭弹窗不得写库")
}
if err := SaveSybMapping(db, order.SybID, other, "USR", detail.ContextVersion); err != nil {
t.Fatal(err)
}
if err := SaveSybMapping(db, order.SybID, suggested, "USR", mappingContextVersionMust(t, db, order.SybID)); err != nil {
t.Fatal(err)
}
var total, accepted int
db.QueryRow(`SELECT COUNT(*),SUM(accepted) FROM spec_mapping_decisions WHERE shopee_goods_id='SP-AUDIT'`).Scan(&total, &accepted)
if total != 2 || accepted != 1 {
t.Fatalf("审计 total=%d accepted=%d", total, accepted)
}
old := mappingContextVersionMust(t, db, order.SybID)
if err := repository.SetCollectResult(db, "737116531267", "PDD2", "", raw+" "); err != nil {
t.Fatal(err)
}
if err := SaveSybMapping(db, order.SybID, suggested, "USR", old); err == nil {
t.Fatal("陈旧弹窗必须拒绝")
}
before := suggested
mustExecService(t, db, `DROP TABLE spec_mapping_decisions`)
if err := SaveSybMapping(db, order.SybID, other, "USR", mappingContextVersionMust(t, db, order.SybID)); err == nil {
t.Fatal("审计失败必须回滚")
}
var current string
db.QueryRow(`SELECT pdd_option_key FROM spec_mappings WHERE shopee_goods_id='SP-AUDIT'`).Scan(&current)
if current != before {
t.Fatal("映射未回滚")
}
}
func mappingContextVersionMust(t *testing.T, db *sql.DB, id string) string {
t.Helper()
c, e := repository.GetSybOrderContext(db, id)
if e != nil {
t.Fatal(e)
}
return mappingContextVersion(*c)
}
func mustExecService(t *testing.T, db *sql.DB, q string) {
t.Helper()
if _, e := db.Exec(q); e != nil {
t.Fatal(e)
}
}
func stringsReplaceGoodsID(raw string) string {
return `{"goods_id":"937122477375","price_granularity":"sku","dimensions":[{"key":"color","name":"颜色"},{"key":"size","name":"尺码"},{"key":"style","name":"款式"}],"skus":[{"options":{"style":"常规","size":"M码","color":"黑色"},"price_cent":3990,"available":true}]}`
}