fix(web): SYB 商品页未关联 PDD 的明细无法勾选,图搜采集入口不可达 #291

Open
opened 2026-09-16 10:58:56 +08:00 by ila · 1 comment
Owner

来源:2026-09-16 本地验证 #290 时发现。用户原话:「syb商品搜索260818PAXYEV7V,不能勾选蝦皮44109310287的紫色来采集」。

问题

SYB 商品页里,未关联 PDD 商品的明细无法勾选,因此永远进不了「图搜采集」。而图搜采集的用途恰恰就是给未关联 PDD 的虾皮商品找到 PDD 商品——入口条件与功能目的互相矛盾。

根因

勾选框的开关只有一个判据(web/src/views/goauto/syb-products/index.vue:356):

isSelectableCandidate(row) {
  return this.isPurchaseCandidate(row)   // processStage === 'purchase_ready'
      || this.isCollectionCandidate(row) // collectionEligible && pddProductId > 0
      || this.isAIMatchCandidate(row)    // aiMatchEligible
}

三个判据里没有图搜,且三个全都要求虾皮商品已关联 PDD:

// server/app/goauto/purchase/collection_eligibility.go:21
if shopee.PDDProductID == nil {
    item.CollectionDisabledReason = "尚未关联 PDD 商品"
    return   // CollectionEligible = false
}

按钮自身的条件其实是对的,不要求 PDD:

imageSearchRows() { return this.selectedProducts.filter(row => row.shopeeProductId && row.imageUrl) }

但它作用在 selectedProducts 上,而未关联的行根本选不中,所以计数恒为 0。两处条件从未对齐。

证据

shopee_product 1528(虾皮 44109310287)pdd_product_id 为 NULL,其 23 条明细(含紫色 S/L/XL/2XL,订单 260818PAXYEV7V 等)三个判据全为 false,勾选框禁用。55550934512(14 色 35 条)同样。

此前线上唯一一次图搜跑通,用的是已关联 PDD 的商品,走的是「图搜结果覆盖已有关联」那条路径。主场景(给未关联商品找货)从未被走通。

方案

isSelectableCandidate 增加第四个判据:

isImageSearchCandidate(row) { return Boolean(row.shopeeProductId && row.imageUrl) }

只读前端已有字段,无服务端改动。

[必须] 不放宽任何采购门禁。可勾选不等于可采购:purchaseCandidates 仍由 isPurchaseCandidate 单独把关,collectionCandidates 仍由 isCollectionCandidate 把关。本次只让行可被勾选。

非目标

  • 不改服务端 collection_eligibility.go 的任何判据。
  • 不改「图搜结果覆盖已有关联」的二次确认。
  • 不调整采购、采集、AI 匹配三个按钮的候选集合。

验收

  • 未关联 PDD、但有虾皮商品与参考图的明细可以勾选。
  • 勾选后「图搜采集」计数正确,可创建任务。
  • 无参考图或未关联虾皮商品的行仍不可勾选。
  • 「创建采购」「创建采集」「AI 匹配」三个按钮的候选数量完全不变(回归)。
  • 勾选未关联行后,「创建采购」不会把它算进候选。

验证

Web 构建;本地以 260818PAXYEV7V 紫色明细人工核对上述五项。

文档影响

仅前端可勾选条件,属于恢复既有设计意图的缺陷修复,无长期文档影响。

> 来源:2026-09-16 本地验证 #290 时发现。用户原话:「syb商品搜索260818PAXYEV7V,不能勾选蝦皮44109310287的紫色来采集」。 ## 问题 SYB 商品页里,**未关联 PDD 商品的明细无法勾选**,因此永远进不了「图搜采集」。而图搜采集的用途恰恰就是给未关联 PDD 的虾皮商品找到 PDD 商品——入口条件与功能目的互相矛盾。 ## 根因 勾选框的开关只有一个判据(`web/src/views/goauto/syb-products/index.vue:356`): ```js isSelectableCandidate(row) { return this.isPurchaseCandidate(row) // processStage === 'purchase_ready' || this.isCollectionCandidate(row) // collectionEligible && pddProductId > 0 || this.isAIMatchCandidate(row) // aiMatchEligible } ``` 三个判据里没有图搜,且三个**全都要求虾皮商品已关联 PDD**: ```go // server/app/goauto/purchase/collection_eligibility.go:21 if shopee.PDDProductID == nil { item.CollectionDisabledReason = "尚未关联 PDD 商品" return // CollectionEligible = false } ``` 按钮自身的条件其实是对的,不要求 PDD: ```js imageSearchRows() { return this.selectedProducts.filter(row => row.shopeeProductId && row.imageUrl) } ``` 但它作用在 `selectedProducts` 上,而未关联的行根本选不中,所以计数恒为 0。两处条件从未对齐。 ## 证据 `shopee_product` 1528(虾皮 `44109310287`)`pdd_product_id` 为 NULL,其 23 条明细(含紫色 S/L/XL/2XL,订单 `260818PAXYEV7V` 等)三个判据全为 false,勾选框禁用。`55550934512`(14 色 35 条)同样。 此前线上唯一一次图搜跑通,用的是已关联 PDD 的商品,走的是「图搜结果覆盖已有关联」那条路径。主场景(给未关联商品找货)从未被走通。 ## 方案 `isSelectableCandidate` 增加第四个判据: ```js isImageSearchCandidate(row) { return Boolean(row.shopeeProductId && row.imageUrl) } ``` 只读前端已有字段,无服务端改动。 `[必须]` 不放宽任何采购门禁。可勾选不等于可采购:`purchaseCandidates` 仍由 `isPurchaseCandidate` 单独把关,`collectionCandidates` 仍由 `isCollectionCandidate` 把关。本次只让行可被勾选。 ## 非目标 - 不改服务端 `collection_eligibility.go` 的任何判据。 - 不改「图搜结果覆盖已有关联」的二次确认。 - 不调整采购、采集、AI 匹配三个按钮的候选集合。 ## 验收 - [ ] 未关联 PDD、但有虾皮商品与参考图的明细可以勾选。 - [ ] 勾选后「图搜采集」计数正确,可创建任务。 - [ ] 无参考图或未关联虾皮商品的行仍不可勾选。 - [ ] 「创建采购」「创建采集」「AI 匹配」三个按钮的候选数量完全不变(回归)。 - [ ] 勾选未关联行后,「创建采购」不会把它算进候选。 ## 验证 Web 构建;本地以 `260818PAXYEV7V` 紫色明细人工核对上述五项。 ## 文档影响 仅前端可勾选条件,属于恢复既有设计意图的缺陷修复,无长期文档影响。
Author
Owner

实施

提交 2f1e88e,单文件改动 web/src/views/goauto/syb-products/index.vue(+7 −1)。

新增 isImageSearchCandidate(row) { return Boolean(row.shopeeProductId && row.imageUrl) },
接入 isSelectableCandidate 作为第四个判据。与 imageSearchRows 的过滤条件逐字一致。

未改服务端,collection_eligibility.go 未触碰。

已验证

  • Web 构建通过(npm run build:prod,产出 web/dist/index.html)。
  • purchaseCandidates / collectionCandidates / aiMatchCandidates 三个 computed 未改动,各自仍用 isPurchaseCandidate / isCollectionCandidate / isAIMatchCandidate 过滤;三个按钮的 :disabled 绑定未改动。
  • loadPurchaseReadiness 在刷新后用 isSelectableCandidate 复选行,新判据对它是一致的。

未验证

浏览器人工核对(可勾选、计数、三个按钮候选数不变)尚未执行,需本地重启 Web 后进行。

状态

待验收。

## 实施 提交 `2f1e88e`,单文件改动 `web/src/views/goauto/syb-products/index.vue`(+7 −1)。 新增 `isImageSearchCandidate(row) { return Boolean(row.shopeeProductId && row.imageUrl) }`, 接入 `isSelectableCandidate` 作为第四个判据。与 `imageSearchRows` 的过滤条件逐字一致。 未改服务端,`collection_eligibility.go` 未触碰。 ## 已验证 - Web 构建通过(`npm run build:prod`,产出 `web/dist/index.html`)。 - `purchaseCandidates` / `collectionCandidates` / `aiMatchCandidates` 三个 computed 未改动,各自仍用 `isPurchaseCandidate` / `isCollectionCandidate` / `isAIMatchCandidate` 过滤;三个按钮的 `:disabled` 绑定未改动。 - `loadPurchaseReadiness` 在刷新后用 `isSelectableCandidate` 复选行,新判据对它是一致的。 ## 未验证 浏览器人工核对(可勾选、计数、三个按钮候选数不变)尚未执行,需本地重启 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#291