来源:2026-09-16 本地验证 #290 时发现其验收项未达成。
#290 的验收写的是「商品首次准备好后,其全部颜色尺码写入档案并完成匹配」。实测:
matchSpecsAfterImageSearch 把本次明细的 id 传给 BatchSpecMatch:
matchSpecsAfterImageSearch
BatchSpecMatch
service.syncShopeeSpecs(ctx, linked.ShopeeProductID, linked.PDDProductID) purchase.NewService(service.DB).BatchSpecMatch(ctx, purchase.BatchSpecMatchRequest{ SYBProductIDs: linked.SYBProductIDs, })
BatchSpecMatch 遍历的是 SYB 明细,只匹配当前明细需要的值。同步补进档案的值没有对应明细,因此不会被匹配。
等这些颜色的订单真来了,仍然是 color_mapping,还得人工点一次匹配——正是 #290 想消除的动作。其中 黑色 → 黑色-冰块猫 是唯一对应、完全可以自动匹上的,白白错过。
color_mapping
黑色 → 黑色-冰块猫
本地任务 157 的实测:同步后档案 16 色 6 码,但只有 1 色 1 码有映射(因为只传了 1 条明细)。
规格同步成功后,对该虾皮商品档案中所有未映射的规格值跑一轮匹配,而不是只跑本次明细涉及的值。
[必须]
依赖 #291(图搜入口可勾选)才能在界面上验证。
go test ./app/goauto/task/... ./app/goauto/purchase/...;本地以虾皮 1528 复验。
go test ./app/goauto/task/... ./app/goauto/purchase/...
规格同步后的匹配范围变化,需更新对应 Wiki 业务规则页面。
提交 1274161,新增 app/goauto/purchase/archive_spec_match.go。
1274161
app/goauto/purchase/archive_spec_match.go
MatchArchiveSpecs(ctx, shopeeProductID) 对档案里每个未确认映射的值逐个匹配,确定性优先、AI 兜底,由 matchSpecsAfterImageSearch 在 BatchSpecMatch 之后调用。
MatchArchiveSpecs(ctx, shopeeProductID)
[必须] 只写映射,不创建采购——人工检查点不变。
逐值匹配没有另一半规格,无法校验完整可售组合,因此加了 archiveValueIsSellable:至少要求该值出现在某个在售 SKU 里。完整组合仍由采购预检把关。没有 SKU 证据时放行,与 aiMatchQualificationForDataset 的既有口径一致。
archiveValueIsSellable
aiMatchQualificationForDataset
TestArchiveValueMustAppearInASellableSKU(5 个子用例,含「颜色值不能拿去顶尺码」)、TestArchiveValuePassesWhenThereIsNoSKUEvidence 通过。task / purchase / shopeeproduct / sybspec / shopeespec 全绿;sybimport 仍为 12 条失败,与 #285 基线一致。
TestArchiveValueMustAppearInASellableSKU
TestArchiveValuePassesWhenThereIsNoSKUEvidence
task
purchase
shopeeproduct
sybspec
shopeespec
sybimport
未在本地环境跑通一次真实的图搜 → 同步 → 全档案匹配。验收点是虾皮 1528 同步补进的 墨綠色 / 橘色 / 湖藍色 / 薑黃色 / 黑色 中,黑色 → 黑色-冰块猫(唯一对应)应当自动匹上。
墨綠色
橘色
湖藍色
薑黃色
黑色
待验收。
No dependencies set.
The note is not visible to the blocked user.
问题
#290 的验收写的是「商品首次准备好后,其全部颜色尺码写入档案并完成匹配」。实测:
根因
matchSpecsAfterImageSearch把本次明细的 id 传给BatchSpecMatch:BatchSpecMatch遍历的是 SYB 明细,只匹配当前明细需要的值。同步补进档案的值没有对应明细,因此不会被匹配。后果
等这些颜色的订单真来了,仍然是
color_mapping,还得人工点一次匹配——正是 #290 想消除的动作。其中黑色 → 黑色-冰块猫是唯一对应、完全可以自动匹上的,白白错过。本地任务 157 的实测:同步后档案 16 色 6 码,但只有 1 色 1 码有映射(因为只传了 1 条明细)。
方案
规格同步成功后,对该虾皮商品档案中所有未映射的规格值跑一轮匹配,而不是只跑本次明细涉及的值。
非目标
[必须]不自动创建采购。匹配只把明细推到「采购就绪」,创建采购仍由人点击——那是整条链上唯一的人工检查点。BatchSpecMatch现有入口的语义(SYB 商品页的批量按钮行为不变)。依赖
依赖 #291(图搜入口可勾选)才能在界面上验证。
验收
黑色 → 黑色-冰块猫)自动匹上。验证
go test ./app/goauto/task/... ./app/goauto/purchase/...;本地以虾皮 1528 复验。文档影响
规格同步后的匹配范围变化,需更新对应 Wiki 业务规则页面。
实施
提交
1274161,新增app/goauto/purchase/archive_spec_match.go。MatchArchiveSpecs(ctx, shopeeProductID)对档案里每个未确认映射的值逐个匹配,确定性优先、AI 兜底,由matchSpecsAfterImageSearch在BatchSpecMatch之后调用。[必须]只写映射,不创建采购——人工检查点不变。逐值匹配没有另一半规格,无法校验完整可售组合,因此加了
archiveValueIsSellable:至少要求该值出现在某个在售 SKU 里。完整组合仍由采购预检把关。没有 SKU 证据时放行,与aiMatchQualificationForDataset的既有口径一致。已验证
TestArchiveValueMustAppearInASellableSKU(5 个子用例,含「颜色值不能拿去顶尺码」)、TestArchiveValuePassesWhenThereIsNoSKUEvidence通过。task/purchase/shopeeproduct/sybspec/shopeespec全绿;sybimport仍为 12 条失败,与 #285 基线一致。未验证
未在本地环境跑通一次真实的图搜 → 同步 → 全档案匹配。验收点是虾皮 1528 同步补进的
墨綠色/橘色/湖藍色/薑黃色/黑色中,黑色 → 黑色-冰块猫(唯一对应)应当自动匹上。状态
待验收。