fix(server): 检出 SYB 规格塌缩并明确失败,不再静默共用同一映射 #289

Open
opened 2026-09-16 10:08:49 +08:00 by ila · 0 comments
Owner

依据 #288 的评估。用户于 2026-09-16 确认先做本工单,再做规格同步,键定义改动(A″)延后。

目标

同一虾皮商品下,两个不同的虾皮规格因 【...】 剥离而塌缩成同一个 target_color 时,明确失败,不再静默按同一个映射采购。

背景

sybimport.Parse 剥离 【...】,而括号里经常是真正的规格标识(款号、色号、颜色组合),不是备注。target_color 是采购查映射的键:

mappedColor, mappedSize, source := confirmedMappings(shopee.SpecsJSON, syb.TargetColor, syb.TargetSize)

同键即同映射,Agent 会为不同的虾皮规格点击同一个 PDD 规格值。

线上实测(2026-09-16):

颜色塌缩键   78 个,涉及 61 个商品,190 个原始规格
尺码塌缩键   24 个
颜色含括号明细 2062 条;尺码含括号明细 6106 条
落在塌缩键上的采购任务 3 笔,order_created 0 笔

[必须] 至今 0 次错误采购的原因是每个塌缩键目前只有一条规格真正下过单,不是设计上有保证。最高危的 6 个键(1355 的 白色/黑色 各 6 条、2038 黑色 6 条、1946 6 条、16996 5 条、1298 物理防曬 4 条)全部「尚未采购」,风险已装好,只是未触发。

方案

不改解析契约,不迁移数据。在两处加判定:

  1. 写映射时拒绝:为某个 target_color 写入映射前,若该虾皮商品下该键对应多个不同的原始规格,拒绝写入并返回可读错误,不自动选一个。
  2. 采购预览标记:命中塌缩键的明细不得显示为「采购就绪」,给出明确原因与下一步动作,与 CodeMappingRequired 同类处理。

原始规格取自 syb_product.raw_json 的 productSpec,按最后一个逗号拆分为颜色与尺码两段。

非目标

  • 不改 stripBrackets,不改 target_color 的取值(那是 #288 的 A″,已确认延后)。
  • 不迁移既有数据,不重建既有映射。
  • 不回溯已完成的采购任务。
  • 尺码塌缩(24 个键)本次一并检测,但不为其改规则。

预期影响

61 个商品的相关明细将无法自动匹配与采购,需人工处理。上述 6 个最高危键全部尚未采购,实际业务损失很小;这是用「明确失败」换「静默买错」。

验收

  • 同一虾皮商品下两个不同原始规格塌缩同键时,映射写入被拒绝且错误可读。
  • 该键对应的明细在采购预览中不显示为采购就绪,原因明确。
  • 未塌缩的键行为完全不变(回归测试)。
  • 尺码塌缩同样被检出。
  • 检出次数可从日志或数据观察,作为 #288 A″ 是否值得实施的依据。

验证

go build ./...;go test ./app/goauto/purchase/... ./app/goauto/sybimport/... ./app/goauto/shopeeproduct/...。

[必须] app/goauto/sybimport 存在 12 个先于本工单的失败用例(#285),前后失败集合必须一致。

文档影响

采购就绪判据变化,需更新对应 Wiki 业务规则页面。

> 依据 #288 的评估。用户于 2026-09-16 确认先做本工单,再做规格同步,键定义改动(A″)延后。 ## 目标 同一虾皮商品下,两个不同的虾皮规格因 `【...】` 剥离而塌缩成同一个 `target_color` 时,**明确失败**,不再静默按同一个映射采购。 ## 背景 `sybimport.Parse` 剥离 `【...】`,而括号里经常是真正的规格标识(款号、色号、颜色组合),不是备注。`target_color` 是采购查映射的键: ```go mappedColor, mappedSize, source := confirmedMappings(shopee.SpecsJSON, syb.TargetColor, syb.TargetSize) ``` 同键即同映射,Agent 会为不同的虾皮规格点击**同一个** PDD 规格值。 线上实测(2026-09-16): ``` 颜色塌缩键 78 个,涉及 61 个商品,190 个原始规格 尺码塌缩键 24 个 颜色含括号明细 2062 条;尺码含括号明细 6106 条 落在塌缩键上的采购任务 3 笔,order_created 0 笔 ``` `[必须]` 至今 0 次错误采购的原因是**每个塌缩键目前只有一条规格真正下过单**,不是设计上有保证。最高危的 6 个键(1355 的 `白色`/`黑色` 各 6 条、2038 `黑色` 6 条、1946 6 条、16996 5 条、1298 `物理防曬` 4 条)全部「尚未采购」,风险已装好,只是未触发。 ## 方案 不改解析契约,不迁移数据。在两处加判定: 1. **写映射时拒绝**:为某个 `target_color` 写入映射前,若该虾皮商品下该键对应多个不同的原始规格,拒绝写入并返回可读错误,不自动选一个。 2. **采购预览标记**:命中塌缩键的明细不得显示为「采购就绪」,给出明确原因与下一步动作,与 `CodeMappingRequired` 同类处理。 原始规格取自 `syb_product.raw_json` 的 `productSpec`,按最后一个逗号拆分为颜色与尺码两段。 ## 非目标 - 不改 `stripBrackets`,不改 `target_color` 的取值(那是 #288 的 A″,已确认延后)。 - 不迁移既有数据,不重建既有映射。 - 不回溯已完成的采购任务。 - 尺码塌缩(24 个键)本次一并检测,但不为其改规则。 ## 预期影响 61 个商品的相关明细将无法自动匹配与采购,需人工处理。上述 6 个最高危键全部尚未采购,实际业务损失很小;这是用「明确失败」换「静默买错」。 ## 验收 - [ ] 同一虾皮商品下两个不同原始规格塌缩同键时,映射写入被拒绝且错误可读。 - [ ] 该键对应的明细在采购预览中不显示为采购就绪,原因明确。 - [ ] 未塌缩的键行为完全不变(回归测试)。 - [ ] 尺码塌缩同样被检出。 - [ ] 检出次数可从日志或数据观察,作为 #288 A″ 是否值得实施的依据。 ## 验证 `go build ./...`;`go test ./app/goauto/purchase/... ./app/goauto/sybimport/... ./app/goauto/shopeeproduct/...`。 `[必须]` `app/goauto/sybimport` 存在 12 个先于本工单的失败用例(#285),前后失败集合必须一致。 ## 文档影响 采购就绪判据变化,需更新对应 Wiki 业务规则页面。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#289