SYB 被规格过滤的商品入库并标记无需 PDD 采购,参与退货匹配 #340

Open
opened 2026-09-24 16:45:43 +08:00 by ila · 1 comment
Owner

来源与原始需求摘要

  • 来源:用户 2026-09-24 grill 讨论(#338 退货匹配本地试用后)。
  • 目标原话:「过滤掉的是不需要pdd采购的syb商品.但是现在要把退货商品利用起来,只要是syb订单商品都可以和退货商品匹配.」「指定店铺的全部syb商品数据全部要同步过来.可以这样吗:syb商品页加载后默认是pdd采购的,可以条件选择全部.」
  • 已确认决定(逐条 grill):
    1. 被规格过滤规则命中的明细 = 不需要 PDD 采购,但要参与退货匹配。
    2. 采用方案 A:写入 syb_product 并打「无需 PDD 采购」标记(不另建表)。
    3. 店铺过滤不变:只同步启用店铺;启用店铺内的全部明细都入库。
    4. 过滤规则变更时选 B:标记在同步写入时确定、之后不随规则自动变化;另提供管理员「按当前规则重算」(预览 → 确认 → 执行 + 日志;已有采购任务或有效退货匹配的商品不改)。
    5. 处理阶段选「退货待确认」「已用退货」「无需采购」时,「采购类型」自动切为「全部」(可手动改回);其他阶段不自动切换。原话:「接受你的建议.历史商品不要补同步.建工单」
    6. 历史商品不补同步:只从上线后的同步开始导入被过滤的明细。

前置依赖

  • #338(退货匹配,feat/338-return-match,未合并)、#339(SYB 列表 200/500 条,feat/339-syb-page-size,基于 #338,未合并)。本单修改同一页面与处理阶段、退货匹配逻辑,基于 feat/339-syb-page-size 开分支,合并顺序 #338 → #339 → 本单。不可与二者并行改 syb-products/index.vue。

当前事实(代码与本地数据核对,基于 27d9560)

  • 过滤发生在 SYB 同步导入:sybimport/sync.go applyStockDetail 对每条明细 variationSku 执行 sybproductfilter.RuleSet.Match,命中即 continue,不写入本地,仅累计 char_filter_skipped / keyword_filter_skipped 与每条规则命中数(#269)。店铺过滤在其前,整单跳过。
  • 当前启用规则:结构规则 -#(char),关键词规则 7 条。
  • 数据量:最近成功同步(2 天窗口)明细 239 条入库,同时过滤 305(结构)+ 90(关键词)条。上线后 syb_product 增速约为现在的 2.5 倍以上。
  • 处理阶段为实时推导(purchase/process_stage.go,#338 已加退货两阶段),未持久化。
  • 采购创建入口 purchase.Service.create(已含 #338 退货拦截);创建采集 task/admin_service.go BatchCreate;AI 匹配、图搜采集各有入口。

目标

  1. 同步:启用店铺内命中过滤规则的明细不再跳过,写入 syb_product,记录「无需 PDD 采购」标记与命中规则(规则 id、类型、关键词快照)。同步报告的两类计数语义改为「标记数」。
  2. 处理阶段:新增「无需采购」(优先级:有效退货匹配 → 退货待确认/已用退货;否则带标记 → 无需采购;否则按现有流程)。
  3. 硬性隔离 PDD 流程:带标记商品不得进入 PDD 采集、AI 规格匹配、图搜采集、采购创建(单条/批量)、采购预检可采购结果;服务端各入口统一校验并拒绝(错误码明确),与 #338 退货拦截同层。
  4. 退货匹配:「无需采购」加入参与匹配的阶段;匹配/确认/取消后阶段按上述优先级变化。
  5. 规则重算(管理员):预览两个方向的变更数与因「已有采购任务 / 有效退货匹配」而跳过的数量 → 确认后在事务中执行 → 写操作日志与结果。
  6. 列表查询:新增「采购类型」参数(需 PDD 采购 / 无需 PDD 采购 / 全部),默认需 PDD 采购。

页面(需先出低保真原型并经用户确认后才能写生产代码)

  1. SYB 订单商品页:新增「采购类型」筛选(默认「需 PDD 采购」,重置同);处理阶段选项与列增加「无需采购」(小字显示命中规则);选「退货待确认/已用退货/无需采购」时采购类型自动切「全部」;无需采购行可勾选但只计入「匹配退货」,不计入创建采集/创建采购/AI 匹配/图搜采集,且不显示单条「采购」;详情显示采购类型与命中规则;匹配列/对比页沿用 #338。
  2. SYB 过滤规则页:文案由「跳过导入」改为「标记为无需 PDD 采购」(含「停用或删除只影响后续同步」等说明、「上次同步命中」含义);新增管理员「按当前规则重算」按钮与预览/确认/结果对话框(正常、空变更、加载、失败、无权限)。
  3. SYB 同步记录页:「结构过滤命中/关键词过滤命中」改为「结构过滤标记/关键词过滤标记」。
  4. yeeke 退货页、采购/采集任务页:无需改动(阶段标签复用)。

非目标

  • 不补同步历史被过滤的明细。
  • 不改店铺过滤。
  • 不改过滤规则的匹配算法本身。
  • 规则变更不自动重算。

数据设计(初步,实施前确认)

  • syb_product 增加:pdd_purchase_excluded(bool,索引)、excluded_rule_id、excluded_rule_kind、excluded_rule_keyword(快照)、excluded_at。
  • 规则重算日志:新表或复用现有审计(实施时确认)。
  • 迁移只新增列/表,默认值使存量行全部为「需 PDD 采购」(与现状一致)。

验收

  1. 同步后命中规则的明细入库并带标记与命中规则;非命中明细行为不变;同步报告计数正确。
  2. 带标记商品:处理阶段「无需采购」;创建采集、AI 匹配、图搜采集、采购创建(单条、批量)、采购预检均被服务端拒绝或判为不可用——逐入口回归测试。
  3. 带标记商品可参与退货匹配,匹配后「退货待确认」,取消后回到「无需采购」;确认后「已用退货」。
  4. SYB 页默认视图(需 PDD 采购)与改动前一致;「全部」「无需 PDD 采购」筛选正确;自动切换规则按决定 5。
  5. 规则重算:预览数与执行数一致;跳过有采购任务/有效匹配的商品;有日志;非管理员无入口且接口拒绝。
  6. 零回归:不含标记的商品,采集、采购、处理阶段、#338 匹配、#339 分页行为与改动前一致。
  7. 迁移只新增;服务端测试、pnpm run build:prod 通过;本地真实同步验证入库条数与同步报告一致。

风险

  • 高风险:涉及是否创建 PDD 订单的门禁(漏掉任一入口,无需采购的商品可能被下单)、数据库迁移、同步写入行为变化。实施与本地迁移前须人工确认。
  • 数据量增长约 2.5 倍:列表、处理阶段按页计算、退货匹配可用池均需关注性能(#339 已支持大页,需复测)。
  • 规则重算为批量改数据,须预览 + 确认 + 事务 + 日志。

设计证据

  • QuantUX 低保真原型(草稿,待用户审核):http://192.168.0.224:8082/#/apps/6ab4e510191a826306a80024
  • App ID:6ab4e510191a826306a80024
  • 状态:草稿(待用户审核)
  • 日期:2026-09-24
  • 覆盖范围(6 屏):
    1. SYB 订单商品页默认视图(采购类型=需 PDD 采购,处理阶段含「无需采购」新选项)
    2. SYB 订单商品页采购类型=全部(无需采购行混排、勾选与工具栏计数规则、无单条采购入口、自动切换标注)
    3. SYB 过滤规则页(「标记为无需 PDD 采购」文案、停用/删除说明、管理员「按当前规则重算」入口)
    4. 重算预览确认对话框(两方向变更数、两类跳过原因、取消/确认执行)
    5. 重算状态一览:空变更、加载中、失败、非管理员只读、执行结果(成功)五种状态示意
    6. SYB 同步记录详情(「结构过滤标记/关键词过滤标记」文案变更)
  • 已导出离线快照:prototypes/340/v1/index.html(未提交 Git)

文档影响

  • 需更新 Wiki:业务规则(SYB 导入过滤语义由「跳过」改为「标记无需采购」、处理阶段新增、PDD 流程隔离)、架构/数据(syb_product 新字段)、API(列表采购类型参数、规则重算接口)。并入 #338 的 Wiki 同步轮次处理。
## 来源与原始需求摘要 - 来源:用户 2026-09-24 grill 讨论(#338 退货匹配本地试用后)。 - 目标原话:「过滤掉的是不需要pdd采购的syb商品.但是现在要把退货商品利用起来,只要是syb订单商品都可以和退货商品匹配.」「指定店铺的全部syb商品数据全部要同步过来.可以这样吗:syb商品页加载后默认是pdd采购的,可以条件选择全部.」 - 已确认决定(逐条 grill): 1. 被规格过滤规则命中的明细 = 不需要 PDD 采购,但要参与退货匹配。 2. 采用方案 A:写入 `syb_product` 并打「无需 PDD 采购」标记(不另建表)。 3. **店铺过滤不变**:只同步启用店铺;启用店铺内的全部明细都入库。 4. 过滤规则变更时选 **B**:标记在同步写入时确定、之后不随规则自动变化;另提供管理员「按当前规则重算」(预览 → 确认 → 执行 + 日志;已有采购任务或有效退货匹配的商品不改)。 5. 处理阶段选「退货待确认」「已用退货」「无需采购」时,「采购类型」自动切为「全部」(可手动改回);其他阶段不自动切换。原话:「接受你的建议.历史商品不要补同步.建工单」 6. **历史商品不补同步**:只从上线后的同步开始导入被过滤的明细。 ## 前置依赖 - #338(退货匹配,`feat/338-return-match`,未合并)、#339(SYB 列表 200/500 条,`feat/339-syb-page-size`,基于 #338,未合并)。本单修改同一页面与处理阶段、退货匹配逻辑,**基于 `feat/339-syb-page-size` 开分支**,合并顺序 #338 → #339 → 本单。不可与二者并行改 `syb-products/index.vue`。 ## 当前事实(代码与本地数据核对,基于 `27d9560`) - 过滤发生在 SYB 同步导入:`sybimport/sync.go applyStockDetail` 对每条明细 `variationSku` 执行 `sybproductfilter.RuleSet.Match`,命中即 `continue`,**不写入本地**,仅累计 `char_filter_skipped` / `keyword_filter_skipped` 与每条规则命中数(#269)。店铺过滤在其前,整单跳过。 - 当前启用规则:结构规则 `-#`(char),关键词规则 7 条。 - 数据量:最近成功同步(2 天窗口)明细 239 条入库,同时过滤 305(结构)+ 90(关键词)条。**上线后 `syb_product` 增速约为现在的 2.5 倍以上。** - 处理阶段为实时推导(`purchase/process_stage.go`,#338 已加退货两阶段),未持久化。 - 采购创建入口 `purchase.Service.create`(已含 #338 退货拦截);创建采集 `task/admin_service.go BatchCreate`;AI 匹配、图搜采集各有入口。 ## 目标 1. 同步:启用店铺内命中过滤规则的明细不再跳过,写入 `syb_product`,记录「无需 PDD 采购」标记与命中规则(规则 id、类型、关键词快照)。同步报告的两类计数语义改为「标记数」。 2. 处理阶段:新增「无需采购」(优先级:有效退货匹配 → 退货待确认/已用退货;否则带标记 → 无需采购;否则按现有流程)。 3. **硬性隔离 PDD 流程**:带标记商品不得进入 PDD 采集、AI 规格匹配、图搜采集、采购创建(单条/批量)、采购预检可采购结果;服务端各入口统一校验并拒绝(错误码明确),与 #338 退货拦截同层。 4. 退货匹配:「无需采购」加入参与匹配的阶段;匹配/确认/取消后阶段按上述优先级变化。 5. 规则重算(管理员):预览两个方向的变更数与因「已有采购任务 / 有效退货匹配」而跳过的数量 → 确认后在事务中执行 → 写操作日志与结果。 6. 列表查询:新增「采购类型」参数(需 PDD 采购 / 无需 PDD 采购 / 全部),默认需 PDD 采购。 ## 页面(需先出低保真原型并经用户确认后才能写生产代码) 1. **SYB 订单商品页**:新增「采购类型」筛选(默认「需 PDD 采购」,重置同);处理阶段选项与列增加「无需采购」(小字显示命中规则);选「退货待确认/已用退货/无需采购」时采购类型自动切「全部」;无需采购行可勾选但只计入「匹配退货」,不计入创建采集/创建采购/AI 匹配/图搜采集,且不显示单条「采购」;详情显示采购类型与命中规则;匹配列/对比页沿用 #338。 2. **SYB 过滤规则页**:文案由「跳过导入」改为「标记为无需 PDD 采购」(含「停用或删除只影响后续同步」等说明、「上次同步命中」含义);新增管理员「按当前规则重算」按钮与预览/确认/结果对话框(正常、空变更、加载、失败、无权限)。 3. **SYB 同步记录页**:「结构过滤命中/关键词过滤命中」改为「结构过滤标记/关键词过滤标记」。 4. yeeke 退货页、采购/采集任务页:无需改动(阶段标签复用)。 ## 非目标 - 不补同步历史被过滤的明细。 - 不改店铺过滤。 - 不改过滤规则的匹配算法本身。 - 规则变更不自动重算。 ## 数据设计(初步,实施前确认) - `syb_product` 增加:`pdd_purchase_excluded`(bool,索引)、`excluded_rule_id`、`excluded_rule_kind`、`excluded_rule_keyword`(快照)、`excluded_at`。 - 规则重算日志:新表或复用现有审计(实施时确认)。 - 迁移只新增列/表,默认值使存量行全部为「需 PDD 采购」(与现状一致)。 ## 验收 1. 同步后命中规则的明细入库并带标记与命中规则;非命中明细行为不变;同步报告计数正确。 2. 带标记商品:处理阶段「无需采购」;创建采集、AI 匹配、图搜采集、采购创建(单条、批量)、采购预检均被服务端拒绝或判为不可用——逐入口回归测试。 3. 带标记商品可参与退货匹配,匹配后「退货待确认」,取消后回到「无需采购」;确认后「已用退货」。 4. SYB 页默认视图(需 PDD 采购)与改动前一致;「全部」「无需 PDD 采购」筛选正确;自动切换规则按决定 5。 5. 规则重算:预览数与执行数一致;跳过有采购任务/有效匹配的商品;有日志;非管理员无入口且接口拒绝。 6. **零回归**:不含标记的商品,采集、采购、处理阶段、#338 匹配、#339 分页行为与改动前一致。 7. 迁移只新增;服务端测试、`pnpm run build:prod` 通过;本地真实同步验证入库条数与同步报告一致。 ## 风险 - **高风险**:涉及是否创建 PDD 订单的门禁(漏掉任一入口,无需采购的商品可能被下单)、数据库迁移、同步写入行为变化。实施与本地迁移前须人工确认。 - 数据量增长约 2.5 倍:列表、处理阶段按页计算、退货匹配可用池均需关注性能(#339 已支持大页,需复测)。 - 规则重算为批量改数据,须预览 + 确认 + 事务 + 日志。 ## 设计证据 - QuantUX 低保真原型(草稿,待用户审核):http://192.168.0.224:8082/#/apps/6ab4e510191a826306a80024 - App ID:6ab4e510191a826306a80024 - 状态:草稿(待用户审核) - 日期:2026-09-24 - 覆盖范围(6 屏): 1. SYB 订单商品页默认视图(采购类型=需 PDD 采购,处理阶段含「无需采购」新选项) 2. SYB 订单商品页采购类型=全部(无需采购行混排、勾选与工具栏计数规则、无单条采购入口、自动切换标注) 3. SYB 过滤规则页(「标记为无需 PDD 采购」文案、停用/删除说明、管理员「按当前规则重算」入口) 4. 重算预览确认对话框(两方向变更数、两类跳过原因、取消/确认执行) 5. 重算状态一览:空变更、加载中、失败、非管理员只读、执行结果(成功)五种状态示意 6. SYB 同步记录详情(「结构过滤标记/关键词过滤标记」文案变更) - 已导出离线快照:`prototypes/340/v1/index.html`(未提交 Git) ## 文档影响 - 需更新 Wiki:业务规则(SYB 导入过滤语义由「跳过」改为「标记无需采购」、处理阶段新增、PDD 流程隔离)、架构/数据(`syb_product` 新字段)、API(列表采购类型参数、规则重算接口)。并入 #338 的 Wiki 同步轮次处理。
Author
Owner

开始实施(服务端)。已确认设计并落地 #340 的服务端改动,将要建立/已建立的硬隔离入口点:

  • purchase.Service.create(单条创建,rejectIfPDDExcluded,紧邻 #338 的 rejectIfActiveReturnMatch)
  • purchase.Service.BatchCreate(逐行调用 create,同一检查点覆盖)
  • purchase.BatchPreview / previewFromDataset(Eligible=false,ReasonCode=PURCHASE_PDD_EXCLUDED)
  • purchase collection_eligibility.go(applyCollectionEligibility,CollectionEligible=false)
  • purchase ai_match_eligibility.go(aiMatchQualificationForDataset,AIMatchEligible=false,覆盖 BatchSpecMatch 单/批)
  • purchase quick_replace.go(ValidateQuickReplacement,通过新 pdd_excluded 阶段的 NextAction 自动拒绝)
  • task.Service.BatchCreateImageSearch(图搜采集,按 sybProductIds 直接拒绝,PURCHASE_PDD_EXCLUDED)

同时完成:

  • sybimport 同步不再跳过命中过滤规则的行,改为存储并标记 pdd_purchase_excluded + 规则快照,已有行重新同步不改变标记(仅管理员重新计算可改)
  • purchase.process_stage 新增 pdd_excluded 阶段(「无需采购」),优先级:退货匹配 > 无需采购 > 现有流水线
  • returnmatch 允许 pdd_excluded 阶段参与匹配
  • sybimport List 新增 purchaseType 过滤(pdd/excluded/all)
  • sybproductfilter 新增管理员专用「按当前规则重新计算」预览/执行接口,写审计日志

Web 端不在本次范围内(待原型确认)。

开始实施(服务端)。已确认设计并落地 #340 的服务端改动,将要建立/已建立的硬隔离入口点: - purchase.Service.create(单条创建,rejectIfPDDExcluded,紧邻 #338 的 rejectIfActiveReturnMatch) - purchase.Service.BatchCreate(逐行调用 create,同一检查点覆盖) - purchase.BatchPreview / previewFromDataset(Eligible=false,ReasonCode=PURCHASE_PDD_EXCLUDED) - purchase collection_eligibility.go(applyCollectionEligibility,CollectionEligible=false) - purchase ai_match_eligibility.go(aiMatchQualificationForDataset,AIMatchEligible=false,覆盖 BatchSpecMatch 单/批) - purchase quick_replace.go(ValidateQuickReplacement,通过新 pdd_excluded 阶段的 NextAction 自动拒绝) - task.Service.BatchCreateImageSearch(图搜采集,按 sybProductIds 直接拒绝,PURCHASE_PDD_EXCLUDED) 同时完成: - sybimport 同步不再跳过命中过滤规则的行,改为存储并标记 pdd_purchase_excluded + 规则快照,已有行重新同步不改变标记(仅管理员重新计算可改) - purchase.process_stage 新增 pdd_excluded 阶段(「无需采购」),优先级:退货匹配 > 无需采购 > 现有流水线 - returnmatch 允许 pdd_excluded 阶段参与匹配 - sybimport List 新增 purchaseType 过滤(pdd/excluded/all) - sybproductfilter 新增管理员专用「按当前规则重新计算」预览/执行接口,写审计日志 Web 端不在本次范围内(待原型确认)。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#340