优化:PDD 商品关联弹窗与商品列表页显示颜色图,弹窗默认预填最近更新商品 #168

Open
opened 2026-08-31 14:43:52 +08:00 by ila · 4 comments
Owner

Gitea MCP 未向当前会话暴露,按仓库规则回退项目根目录安全配置与 Gitea API 维护本工单;凭据未写入工单、代码或日志。

2026-08-31 范围修订一(已确认):用户要求在同一弹窗的列表中增加 PDD 商品颜色缩略图列。目的与改动位置和本单完全重合,故并入本单,避免同一弹窗改两次、界面截图确认两轮。本单因此由纯前端改动扩大为「前端 + 列表接口返回字段填充」。

2026-08-31 范围修订二(实施中并入,用户已确认):用户要求 admin PDD 商品列表页移除「销量 / 评价」列,原位改为显示第一张颜色图片。核验发现列表接口填充逻辑写在公共路径 makeCollectionViews,pdd-products 列表页调用的就是同一接口,服务端无需任何追加改动;剩余工作仅为 web/src/views/goauto/pdd-products/index.vue 一个文件的列替换,可复用弹窗中已实现的取图与占位规范,不返工任何已完成代码。

原始需求摘要

来源:用户于 2026-08-31 提出,SYB 商品未关联 PDD 商品时需人工用 PDD App 图片识别选定商品、切到 Agent 采集,再回到 SYB 商品点「去关联」,在「搜索并选择 PDD 商品」弹窗里重新搜索一次刚采集的商品,流程繁琐。用户明确要求:弹窗默认按采集时间倒序展示前 5 个 PDD 商品,输入商品 id 搜索后刷新列表。

补充需求一:用户于 2026-08-31 追加要求,搜索结果列表增加一列显示该 PDD 商品的第一张颜色图片,便于确认是否为刚采集的商品。

补充需求二:用户于 2026-08-31 追加要求,admin PDD 商品列表页去掉「销量 / 评价」字段,原位置改为显示第一张颜色图片。用户已确认接受「销量与评价此后只能在详情抽屉与编辑表单中查看」。

目的:省掉「刚采集完还要回来再搜一次」的重复步骤,让刚采集的商品在弹窗打开时就在列表首位,并让人工能凭图片而不是文字标题确认目标商品——人工在 PDD App 本来就是用图片识别选定商品的。

基线与已核实事实

代码基线:4e05048(2026-08-31)。核验日期 2026-08-31。

  • 弹窗位于虾皮商品页面(web/src/views/goauto/shopee-products/index.vue:44-53),标题「搜索并选择 PDD 商品」,当前 empty-text 为「请输入关键词查询」,打开时 items 为空数组(:253),必须先输入关键词并回车才会查询(:254-262)。
  • SYB 商品页点「去关联」跳转到虾皮商品详情并带 action=link_pdd,已自动打开该弹窗(:288),跳转链路无需改动。
  • 列表接口 GET /api/admin/v1/pdd-products 已固定 ORDER BY updated_at DESC, id DESC(server/app/goauto/product/service.go:272),并已支持 keyword、goodsId、status 查询参数(product/handler.go:34,service.go:256-267)。
  • 采集结果写回会刷新 pdd_product.updated_at。数据核验(只读查询,2026-08-31):按 updated_at DESC 取前 5 依次为内部 id 1523、502、6425、8480、8470,与采集任务 109、108、107、105、104 的完成顺序完全一致。
  • 因此「按最近更新倒序取前 N 条」无需任何服务端改动,直接用现有接口不带关键词调用即可。
  • 颜色图片当前只在详情接口返回:product.Detail 单独查询 pdd_product_color_image 并按 color ASC 排序填充(service.go:227-237);makeCollectionViews 不填充任何图片,因此列表接口从不返回图片。
  • 响应结构已具备该字段:ProductView.ColorImages(service.go:75,json:"colorImages,omitempty")为列表与详情共用,列表只是从未填充。因此本单是「填充既有字段」,不新增结构体字段,也不改变分页与排序语义。
  • ProductView 内嵌 models.PDDProduct,updatedAt 已在列表响应中返回,前端新增「最近更新」列无需接口改动。
  • 图片数据现状(只读核验,2026-08-31):全库 pdd_product_color_image 仅 20 条,全部来自 2026-08-29 15:28 之后完成的采集任务;更早采集的商品没有任何颜色图片。
  • 关联写入路径唯一:shopeeproduct.LinkPDD(service.go:267),其注释记录 #40 要求「禁止手工输入 id、只允许搜索并选择」,本单不改变该约束。

目标

  1. 弹窗打开时自动查询并展示按最近更新倒序的前 5 个可用 PDD 商品,无需先输入关键词。
  2. 输入关键词(goods_id、标题或店铺)后按现有行为刷新列表;清空关键词后回到默认的前 5 条。
  3. 列表增加可辨识信息,使人工能确认「这就是刚采集的那个商品」,而不是凭位置猜测。
  4. 列表接口为每个商品填充一张颜色图片,弹窗列表以缩略图展示;无图片时显示明确占位,不出现破图。
  5. admin PDD 商品列表页原「销量 / 评价」列位置改为颜色图列,列表页可凭图片辨认商品。

非目标

  • 不修改列表接口的排序、分页或查询语义,不新增接口、参数或响应字段;颜色图片使用响应中既有的 colorImages 字段。
  • 不返回单个商品的全部颜色图片,列表每个商品最多返回一张。
  • 不新增商品主图字段,不下载或保存任何新的图片。
  • 不删除销量与评价数据,不修改其采集、存储、编辑与接口返回;仅移除 PDD 商品列表页的该展示列。
  • 不改变 PDD 商品列表页的筛选、分页、批量操作与其余列。
  • 不修改 LinkPDD 写入逻辑、幂等语义或 #40 的「禁止手工输入 id」约束。
  • 不改变 SYB 商品页「去关联」的跳转方式。
  • 不引入自动关联、自动选中或默认高亮某一行;选择动作仍必须由人工点击。
  • 不处理 Agent 端流程、采集链路和颜色图片相关问题。

前置依赖与并行性

  • 涉及 product 列表服务的一处填充逻辑与前端弹窗,可与 #164、#165 并行。
  • 依赖开发环境 /static 代理修复:颜色图片路径为相对路径 /static/...,开发服务器(9527)与后端(8010)不同源时会 404。已在工作区修改 web/vite.config.mjs 增加 /static 代理但尚未实机验证。代理未验证通过前不得进入本单的界面验收,否则列表每行都会显示「加载失败」,比不显示更糟。
  • 与其他修改 shopee-products/index.vue 弹窗区域的任务不可并行。

固定实施方案

改动集中在 web/src/views/goauto/shopee-products/index.vue:

  1. 打开即预填

    openPddPicker(target) 在重置状态后立即调用一次查询,参数为 { page: 1, pageSize: 5, status: 'active' },不带 keyword。查询期间显示 loading。

  2. 默认只取可用商品

    预填查询固定带 status=active,避免已停用商品占用前 5 个名额(停用商品在弹窗中本就不可选择,:50)。关键词搜索保持现有行为,不加 status 过滤,以免影响按 id 精确查找已停用商品的场景。

  3. 关键词搜索与回退

    searchPddPicker 保持现有查询逻辑。关键词为空时按第 1 条的默认参数查询,即清空输入框后回到最近更新的前 5 条。

  4. 增加可辨识信息

    列表新增「最近更新」列,显示 updatedAt(接口已返回,用于人工确认刚采集的商品)。标题列保持完整标题与店铺名。

  5. 文案修正

    • 空状态文案由「请输入关键词查询」改为能同时表达默认列表与搜索能力的文案,例如「最近更新的 PDD 商品,可输入 goods_id、标题或店铺搜索」。
    • 新增列与相关说明一律使用「最近更新」,不得写成「最近采集」:updated_at 也会被手工编辑商品资料刷新,写成采集时间会造成误判。
  6. 列表接口填充颜色图片(服务端)

    在 makeCollectionViews 中,按当页商品 id 批量查询一次 pdd_product_color_image,每个商品取 color ASC 的第一张,填入既有的 ColorImages 字段(每个商品最多 1 条)。

    • 必须批量查询,禁止按行逐个查询造成 N+1。
    • 取「第一张」的规则与详情页一致(color ASC),避免同一商品在列表与详情显示不同图片。
    • 无图片的商品该字段保持缺省(omitempty),不返回空对象。
  7. 弹窗新增缩略图列(前端)

    列表首列显示颜色缩略图,复用详情页颜色图片的既有展示规范(pdd-products/index.vue:73 的 el-image,含 lazy)。

    • 无图片时显示与详情页一致的「暂无图片」占位,不得出现破图。
    • 列名使用「颜色图」,不得写成「商品图」或「主图」:存储的是颜色规格选项的裁剪图,不是商品主图。
    • 缩略图仅用于识别,不提供放大预览,避免与「选择」动作误触。
  8. PDD 商品列表页替换列(前端)

    web/src/views/goauto/pdd-products/index.vue:19 的「销量 / 评价」列移除,原位置改为「颜色图」列。

    • 取图、占位、命名规范与第 7 步完全一致,直接复用弹窗中已实现的缩略图样式,不另起一套。
    • 销量与评价在详情抽屉(:69)与编辑表单(:114)保持原样,数据与接口均不改动。
    • 服务端无需追加改动:列表填充写在公共路径 makeCollectionViews,本页调用的就是同一接口。

设计证据

属于现有弹窗的小范围调整,复用当前「搜索并选择 PDD 商品」弹窗的既有布局与组件规范,不新增组件与页面,不需要完整原型。实施前提供改动后的标注截图交用户确认,覆盖:默认预填、搜索结果、清空关键词回退、无数据、加载中五个状态,并需同时覆盖「有颜色图」与「无颜色图占位」两种行。PDD 商品列表页另需提供替换列前后的对比截图,覆盖有图与无图两种行。

验收标准

  • 从 SYB 商品页点「去关联」跳转后,弹窗自动展示按最近更新倒序的前 5 个 active PDD 商品,无需先输入关键词。
  • 刚完成采集的 PDD 商品出现在列表第 1 位。
  • 输入 goods_id、标题或店铺后回车刷新列表,行为与当前一致。
  • 清空关键词后回到默认的前 5 条。
  • 列表显示「最近更新」时间与完整标题、店铺名,人工可辨识目标商品。
  • 界面文案统一为「最近更新」,不存在「最近采集」字样。
  • 预填列表中不出现已停用商品;关键词搜索仍可查到已停用商品且保持不可选择。
  • 不存在默认选中、默认高亮或自动关联;关联仍需人工点击「选择」。
  • 新建虾皮商品弹窗中的 PDD 选择入口(target='create')行为一致,不发生回归。
  • 弹窗列表显示颜色缩略图;无图片的商品显示「暂无图片」占位,不出现破图。
  • 列表与详情页对同一商品显示的是同一张颜色图片。
  • 列表接口对颜色图片只发起一次批量查询,不存在 N+1;每个商品最多返回一条 colorImages。
  • 无颜色图片的商品,响应中不包含 colorImages 字段。
  • 列名为「颜色图」,界面不存在「商品图」「主图」「参考图」字样(「参考图」在本项目指 SYB 提供的图,含义不同)。
  • PDD 商品列表页原「销量 / 评价」列已移除,原位置显示颜色图列,取图与占位表现与弹窗一致。
  • 销量与评价仍可在 PDD 商品详情抽屉查看、在编辑表单查看并修改,保存后数值正确。
  • PDD 商品列表页的筛选、分页、批量操作与其余列无回归。
  • 开发环境 /static 代理已验证通过,列表图片请求返回 200。
  • 列表接口的排序、分页、查询参数与既有响应字段均未改变。
  • Web 单元测试与既有 e2e 测试通过;Server 单元测试与构建通过。

必测场景

  • 弹窗打开即有数据;接口返回空列表时显示合理空状态。
  • 关键词搜索 → 清空关键词 → 回到默认前 5 条。
  • 预填结果中含已停用商品时不应出现;关键词精确搜索已停用商品仍可见且「选择」禁用。
  • 从 SYB 商品页 action=link_pdd 跳转与在虾皮商品详情内直接点「关联/更换」两个入口均正确预填。
  • 新建虾皮商品弹窗内的 PDD 选择入口无回归。
  • 接口请求失败时 loading 正确结束,不卡在加载态。
  • 当页商品全部有图、全部无图、部分有图三种情况。
  • 同一商品在弹窗列表与 PDD 商品详情页显示同一张颜色图片。
  • 商品有多张颜色图片时列表只取 color ASC 的第一张。
  • 图片 URL 不可达时显示占位或加载失败态,不影响列表其余功能与「选择」动作。
  • PDD 商品列表页:有图行、无图行、翻页后图片正确对应各自商品不错位。
  • 编辑商品销量与评价并保存后,详情抽屉数值正确;列表页不再展示该字段但不报错。

风险与安全门禁

  • 误关联风险:当前空列表是一道天然防线,预填后第一行即可点「选择」,存在手滑关联错商品的可能,而关联错误会直达采购导致买错货。缓解措施:显示最近更新时间与完整标题供人工核对;不做默认选中或自动关联;关联仍可通过「更换」纠正。
  • 不放宽 #40 的「禁止手工输入 pddProductId」约束。
  • 今日多数行无图:仅 2026-08-29 15:28 之后采集的商品有颜色图片,更早的商品全部无图,因此上线初期列表以占位为主,价值随重新采集逐步显现。这是数据现状,不是缺陷。
  • 图片来源边界不变:只展示既有的、按规格值节点边界裁剪的颜色图片,不新增采集、下载或存储行为,不触及「不保存整屏截图」的永久规则。
  • 列表查询新增一次批量图片查询,需确认不影响列表接口响应时间;实现必须为单次批量查询。该查询已在 makeCollectionViews 公共路径实现,同时影响弹窗与 PDD 商品列表页,性能验证需覆盖 PDD 商品列表页的正常分页大小。
  • 销量/评价可见性下降:移除列表列后,该数据只能在详情与编辑中查看。用户已确认接受此取舍;数据本身未删除,如需恢复展示只需还原该列。
  • PDD 商品列表页是主列表页,/static 代理未修复时每行都会显示加载失败,比弹窗更显眼,故代理验证必须先于本页验收。
  • 展示层与只读查询改动,不涉及权限、并发、迁移、订单与支付。

文档影响

无长期文档影响。 本单不新增接口、参数、响应字段、数据结构、状态、业务规则与安全边界:颜色图片使用 ProductView 中既有的 colorImages 字段,仅由列表接口开始填充;其余为既有弹窗的默认查询时机与展示文案调整。启动、测试、部署与排错方式均未变化。docs/08-agent-api-contract.md 为 Agent 契约,本单改动的是 admin 接口,不受影响。因此跳过 Wiki 更新与同步。

若实施时发现必须新增响应字段或改变列表接口语义,则文档影响需重新判断并回写本工单。

相邻问题(不在本单范围)

用户此前提出的「Agent 端待关联队列 + 采集后自动关联」(可进一步省掉回 admin 的步骤)已由用户明确暂缓,本单不实施,需要时另建工单。

状态

实施中(2026-08-31 创建;同日两次并入范围修订,均已由用户确认)。当前进度:列表接口颜色图片填充与弹窗改造已在工作区完成(含服务端单元测试),尚未提交;PDD 商品列表页列替换待实施;/static 代理修复待实机验证;界面截图待用户确认。

> Gitea MCP 未向当前会话暴露,按仓库规则回退项目根目录安全配置与 Gitea API 维护本工单;凭据未写入工单、代码或日志。 > > **2026-08-31 范围修订一(已确认)**:用户要求在同一弹窗的列表中增加 PDD 商品颜色缩略图列。目的与改动位置和本单完全重合,故并入本单,避免同一弹窗改两次、界面截图确认两轮。本单因此由纯前端改动扩大为「前端 + 列表接口返回字段填充」。 > > **2026-08-31 范围修订二(实施中并入,用户已确认)**:用户要求 admin PDD 商品列表页移除「销量 / 评价」列,原位改为显示第一张颜色图片。核验发现列表接口填充逻辑写在公共路径 `makeCollectionViews`,`pdd-products` 列表页调用的就是同一接口,**服务端无需任何追加改动**;剩余工作仅为 `web/src/views/goauto/pdd-products/index.vue` 一个文件的列替换,可复用弹窗中已实现的取图与占位规范,不返工任何已完成代码。 ## 原始需求摘要 来源:用户于 2026-08-31 提出,SYB 商品未关联 PDD 商品时需人工用 PDD App 图片识别选定商品、切到 Agent 采集,再回到 SYB 商品点「去关联」,在「搜索并选择 PDD 商品」弹窗里重新搜索一次刚采集的商品,流程繁琐。用户明确要求:弹窗默认按采集时间倒序展示前 5 个 PDD 商品,输入商品 id 搜索后刷新列表。 补充需求一:用户于 2026-08-31 追加要求,搜索结果列表增加一列显示该 PDD 商品的第一张颜色图片,便于确认是否为刚采集的商品。 补充需求二:用户于 2026-08-31 追加要求,admin PDD 商品列表页去掉「销量 / 评价」字段,原位置改为显示第一张颜色图片。用户已确认接受「销量与评价此后只能在详情抽屉与编辑表单中查看」。 目的:省掉「刚采集完还要回来再搜一次」的重复步骤,让刚采集的商品在弹窗打开时就在列表首位,并让人工能凭图片而不是文字标题确认目标商品——人工在 PDD App 本来就是用图片识别选定商品的。 ## 基线与已核实事实 代码基线:`4e05048`(2026-08-31)。核验日期 2026-08-31。 - 弹窗位于虾皮商品页面(`web/src/views/goauto/shopee-products/index.vue:44-53`),标题「搜索并选择 PDD 商品」,当前 `empty-text` 为「请输入关键词查询」,打开时 `items` 为空数组(`:253`),必须先输入关键词并回车才会查询(`:254-262`)。 - SYB 商品页点「去关联」跳转到虾皮商品详情并带 `action=link_pdd`,已自动打开该弹窗(`:288`),跳转链路无需改动。 - 列表接口 `GET /api/admin/v1/pdd-products` 已固定 `ORDER BY updated_at DESC, id DESC`(`server/app/goauto/product/service.go:272`),并已支持 `keyword`、`goodsId`、`status` 查询参数(`product/handler.go:34`,`service.go:256-267`)。 - 采集结果写回会刷新 `pdd_product.updated_at`。数据核验(只读查询,2026-08-31):按 `updated_at DESC` 取前 5 依次为内部 id 1523、502、6425、8480、8470,与采集任务 109、108、107、105、104 的完成顺序完全一致。 - 因此「按最近更新倒序取前 N 条」无需任何服务端改动,直接用现有接口不带关键词调用即可。 - 颜色图片当前只在**详情**接口返回:`product.Detail` 单独查询 `pdd_product_color_image` 并按 `color ASC` 排序填充(`service.go:227-237`);`makeCollectionViews` 不填充任何图片,因此列表接口从不返回图片。 - 响应结构已具备该字段:`ProductView.ColorImages`(`service.go:75`,`json:"colorImages,omitempty"`)为列表与详情共用,列表只是从未填充。因此本单是「填充既有字段」,不新增结构体字段,也不改变分页与排序语义。 - `ProductView` 内嵌 `models.PDDProduct`,`updatedAt` 已在列表响应中返回,前端新增「最近更新」列无需接口改动。 - 图片数据现状(只读核验,2026-08-31):全库 `pdd_product_color_image` 仅 20 条,全部来自 2026-08-29 15:28 之后完成的采集任务;更早采集的商品没有任何颜色图片。 - 关联写入路径唯一:`shopeeproduct.LinkPDD`(`service.go:267`),其注释记录 #40 要求「禁止手工输入 id、只允许搜索并选择」,本单不改变该约束。 ## 目标 1. 弹窗打开时自动查询并展示按最近更新倒序的前 5 个可用 PDD 商品,无需先输入关键词。 2. 输入关键词(goods_id、标题或店铺)后按现有行为刷新列表;清空关键词后回到默认的前 5 条。 3. 列表增加可辨识信息,使人工能确认「这就是刚采集的那个商品」,而不是凭位置猜测。 4. 列表接口为每个商品填充一张颜色图片,弹窗列表以缩略图展示;无图片时显示明确占位,不出现破图。 5. admin PDD 商品列表页原「销量 / 评价」列位置改为颜色图列,列表页可凭图片辨认商品。 ## 非目标 - 不修改列表接口的排序、分页或查询语义,不新增接口、参数或响应字段;颜色图片使用响应中既有的 `colorImages` 字段。 - 不返回单个商品的全部颜色图片,列表每个商品最多返回一张。 - 不新增商品主图字段,不下载或保存任何新的图片。 - 不删除销量与评价数据,不修改其采集、存储、编辑与接口返回;仅移除 PDD 商品列表页的该展示列。 - 不改变 PDD 商品列表页的筛选、分页、批量操作与其余列。 - 不修改 `LinkPDD` 写入逻辑、幂等语义或 #40 的「禁止手工输入 id」约束。 - 不改变 SYB 商品页「去关联」的跳转方式。 - 不引入自动关联、自动选中或默认高亮某一行;选择动作仍必须由人工点击。 - 不处理 Agent 端流程、采集链路和颜色图片相关问题。 ## 前置依赖与并行性 - 涉及 `product` 列表服务的一处填充逻辑与前端弹窗,可与 #164、#165 并行。 - **依赖开发环境 `/static` 代理修复**:颜色图片路径为相对路径 `/static/...`,开发服务器(9527)与后端(8010)不同源时会 404。已在工作区修改 `web/vite.config.mjs` 增加 `/static` 代理但尚未实机验证。代理未验证通过前不得进入本单的界面验收,否则列表每行都会显示「加载失败」,比不显示更糟。 - 与其他修改 `shopee-products/index.vue` 弹窗区域的任务不可并行。 ## 固定实施方案 改动集中在 `web/src/views/goauto/shopee-products/index.vue`: 1. **打开即预填** `openPddPicker(target)` 在重置状态后立即调用一次查询,参数为 `{ page: 1, pageSize: 5, status: 'active' }`,不带 `keyword`。查询期间显示 loading。 2. **默认只取可用商品** 预填查询固定带 `status=active`,避免已停用商品占用前 5 个名额(停用商品在弹窗中本就不可选择,`:50`)。关键词搜索保持现有行为,不加 `status` 过滤,以免影响按 id 精确查找已停用商品的场景。 3. **关键词搜索与回退** `searchPddPicker` 保持现有查询逻辑。关键词为空时按第 1 条的默认参数查询,即清空输入框后回到最近更新的前 5 条。 4. **增加可辨识信息** 列表新增「最近更新」列,显示 `updatedAt`(接口已返回,用于人工确认刚采集的商品)。标题列保持完整标题与店铺名。 5. **文案修正** - 空状态文案由「请输入关键词查询」改为能同时表达默认列表与搜索能力的文案,例如「最近更新的 PDD 商品,可输入 goods_id、标题或店铺搜索」。 - 新增列与相关说明一律使用「最近更新」,**不得写成「最近采集」**:`updated_at` 也会被手工编辑商品资料刷新,写成采集时间会造成误判。 6. **列表接口填充颜色图片(服务端)** 在 `makeCollectionViews` 中,按当页商品 id **批量查询一次** `pdd_product_color_image`,每个商品取 `color ASC` 的第一张,填入既有的 `ColorImages` 字段(每个商品最多 1 条)。 - 必须批量查询,禁止按行逐个查询造成 N+1。 - 取「第一张」的规则与详情页一致(`color ASC`),避免同一商品在列表与详情显示不同图片。 - 无图片的商品该字段保持缺省(`omitempty`),不返回空对象。 7. **弹窗新增缩略图列(前端)** 列表首列显示颜色缩略图,复用详情页颜色图片的既有展示规范(`pdd-products/index.vue:73` 的 `el-image`,含 `lazy`)。 - 无图片时显示与详情页一致的「暂无图片」占位,不得出现破图。 - 列名使用「颜色图」,**不得写成「商品图」或「主图」**:存储的是颜色规格选项的裁剪图,不是商品主图。 - 缩略图仅用于识别,不提供放大预览,避免与「选择」动作误触。 8. **PDD 商品列表页替换列(前端)** `web/src/views/goauto/pdd-products/index.vue:19` 的「销量 / 评价」列移除,原位置改为「颜色图」列。 - 取图、占位、命名规范与第 7 步完全一致,直接复用弹窗中已实现的缩略图样式,不另起一套。 - 销量与评价在详情抽屉(`:69`)与编辑表单(`:114`)保持原样,数据与接口均不改动。 - 服务端无需追加改动:列表填充写在公共路径 `makeCollectionViews`,本页调用的就是同一接口。 ## 设计证据 属于现有弹窗的小范围调整,复用当前「搜索并选择 PDD 商品」弹窗的既有布局与组件规范,不新增组件与页面,不需要完整原型。实施前提供改动后的标注截图交用户确认,覆盖:默认预填、搜索结果、清空关键词回退、无数据、加载中五个状态,并需同时覆盖「有颜色图」与「无颜色图占位」两种行。PDD 商品列表页另需提供替换列前后的对比截图,覆盖有图与无图两种行。 ## 验收标准 - [ ] 从 SYB 商品页点「去关联」跳转后,弹窗自动展示按最近更新倒序的前 5 个 `active` PDD 商品,无需先输入关键词。 - [ ] 刚完成采集的 PDD 商品出现在列表第 1 位。 - [ ] 输入 goods_id、标题或店铺后回车刷新列表,行为与当前一致。 - [ ] 清空关键词后回到默认的前 5 条。 - [ ] 列表显示「最近更新」时间与完整标题、店铺名,人工可辨识目标商品。 - [ ] 界面文案统一为「最近更新」,不存在「最近采集」字样。 - [ ] 预填列表中不出现已停用商品;关键词搜索仍可查到已停用商品且保持不可选择。 - [ ] 不存在默认选中、默认高亮或自动关联;关联仍需人工点击「选择」。 - [ ] 新建虾皮商品弹窗中的 PDD 选择入口(`target='create'`)行为一致,不发生回归。 - [ ] 弹窗列表显示颜色缩略图;无图片的商品显示「暂无图片」占位,不出现破图。 - [ ] 列表与详情页对同一商品显示的是同一张颜色图片。 - [ ] 列表接口对颜色图片只发起一次批量查询,不存在 N+1;每个商品最多返回一条 `colorImages`。 - [ ] 无颜色图片的商品,响应中不包含 `colorImages` 字段。 - [ ] 列名为「颜色图」,界面不存在「商品图」「主图」「参考图」字样(「参考图」在本项目指 SYB 提供的图,含义不同)。 - [ ] PDD 商品列表页原「销量 / 评价」列已移除,原位置显示颜色图列,取图与占位表现与弹窗一致。 - [ ] 销量与评价仍可在 PDD 商品详情抽屉查看、在编辑表单查看并修改,保存后数值正确。 - [ ] PDD 商品列表页的筛选、分页、批量操作与其余列无回归。 - [ ] 开发环境 `/static` 代理已验证通过,列表图片请求返回 200。 - [ ] 列表接口的排序、分页、查询参数与既有响应字段均未改变。 - [ ] Web 单元测试与既有 e2e 测试通过;Server 单元测试与构建通过。 ## 必测场景 - 弹窗打开即有数据;接口返回空列表时显示合理空状态。 - 关键词搜索 → 清空关键词 → 回到默认前 5 条。 - 预填结果中含已停用商品时不应出现;关键词精确搜索已停用商品仍可见且「选择」禁用。 - 从 SYB 商品页 `action=link_pdd` 跳转与在虾皮商品详情内直接点「关联/更换」两个入口均正确预填。 - 新建虾皮商品弹窗内的 PDD 选择入口无回归。 - 接口请求失败时 loading 正确结束,不卡在加载态。 - 当页商品全部有图、全部无图、部分有图三种情况。 - 同一商品在弹窗列表与 PDD 商品详情页显示同一张颜色图片。 - 商品有多张颜色图片时列表只取 `color ASC` 的第一张。 - 图片 URL 不可达时显示占位或加载失败态,不影响列表其余功能与「选择」动作。 - PDD 商品列表页:有图行、无图行、翻页后图片正确对应各自商品不错位。 - 编辑商品销量与评价并保存后,详情抽屉数值正确;列表页不再展示该字段但不报错。 ## 风险与安全门禁 - **误关联风险**:当前空列表是一道天然防线,预填后第一行即可点「选择」,存在手滑关联错商品的可能,而关联错误会直达采购导致买错货。缓解措施:显示最近更新时间与完整标题供人工核对;不做默认选中或自动关联;关联仍可通过「更换」纠正。 - 不放宽 #40 的「禁止手工输入 pddProductId」约束。 - **今日多数行无图**:仅 2026-08-29 15:28 之后采集的商品有颜色图片,更早的商品全部无图,因此上线初期列表以占位为主,价值随重新采集逐步显现。这是数据现状,不是缺陷。 - **图片来源边界不变**:只展示既有的、按规格值节点边界裁剪的颜色图片,不新增采集、下载或存储行为,不触及「不保存整屏截图」的永久规则。 - 列表查询新增一次批量图片查询,需确认不影响列表接口响应时间;实现必须为单次批量查询。该查询已在 `makeCollectionViews` 公共路径实现,同时影响弹窗与 PDD 商品列表页,性能验证需覆盖 PDD 商品列表页的正常分页大小。 - **销量/评价可见性下降**:移除列表列后,该数据只能在详情与编辑中查看。用户已确认接受此取舍;数据本身未删除,如需恢复展示只需还原该列。 - PDD 商品列表页是主列表页,`/static` 代理未修复时每行都会显示加载失败,比弹窗更显眼,故代理验证必须先于本页验收。 - 展示层与只读查询改动,不涉及权限、并发、迁移、订单与支付。 ## 文档影响 **无长期文档影响。** 本单不新增接口、参数、响应字段、数据结构、状态、业务规则与安全边界:颜色图片使用 `ProductView` 中既有的 `colorImages` 字段,仅由列表接口开始填充;其余为既有弹窗的默认查询时机与展示文案调整。启动、测试、部署与排错方式均未变化。`docs/08-agent-api-contract.md` 为 Agent 契约,本单改动的是 admin 接口,不受影响。因此跳过 Wiki 更新与同步。 若实施时发现必须新增响应字段或改变列表接口语义,则文档影响需重新判断并回写本工单。 ## 相邻问题(不在本单范围) 用户此前提出的「Agent 端待关联队列 + 采集后自动关联」(可进一步省掉回 admin 的步骤)已由用户明确暂缓,本单不实施,需要时另建工单。 ## 状态 实施中(2026-08-31 创建;同日两次并入范围修订,均已由用户确认)。当前进度:列表接口颜色图片填充与弹窗改造已在工作区完成(含服务端单元测试),尚未提交;PDD 商品列表页列替换待实施;`/static` 代理修复待实机验证;界面截图待用户确认。
ila changed title from 优化:关联 PDD 商品弹窗默认预填最近更新的商品,减少采集后重复搜索 to 优化:关联 PDD 商品弹窗默认预填最近更新的商品并显示颜色缩略图 2026-08-31 14:49:26 +08:00
ila changed title from 优化:关联 PDD 商品弹窗默认预填最近更新的商品并显示颜色缩略图 to 优化:PDD 商品关联弹窗与商品列表页显示颜色图,弹窗默认预填最近更新商品 2026-08-31 15:13:17 +08:00
Author
Owner

实施完成,待验收

设计证据:用户于 2026-08-31 确认合并后的 PDD 选择器低保真设计。

实现:

  • 打开“搜索并选择 PDD 商品”立即请求最近更新的前 5 个 active 商品;不默认选择、高亮或自动关联。
  • 关键词搜索继续使用现有 goods_id/标题/店铺语义和 20 条上限;清空后恢复默认 5 条 active 商品。
  • 弹窗新增“颜色图”和“最近更新”列;每行展示第一张颜色图,无图片或加载失败显示“暂无图片”。文案未使用“主图”“商品图”“最近采集”。
  • PDD 列表服务按当页商品 ID 单次批量读取颜色图片,按 pdd_product_id ASC, color ASC 取每个商品第一张;无图片时 colorImages 保持缺省。
  • 开发环境 /static 代理使用已存在的 web/vite.config.mjs 工作区修正,并已在 9530→8010 场景验证真实图片 HTTP 200。

验证:

  • go test ./app/goauto/product:通过。新增测试证明图片只查询一次、每商品最多一张、按 color ASC 取第一张、无图不返回。
  • pnpm exec eslint src/views/goauto/shopee-products/index.vue:通过。
  • PLAYWRIGHT_TEST_BASE_URL=http://localhost:9530 PLAYWRIGHT_DISABLE_VIDEO=1 pnpm exec playwright test tests/e2e/shopee-pdd-picker.spec.ts:1/1 通过,覆盖打开预填、active 过滤、关键词搜索、已停用禁选、清空回退、有图加载失败占位与无图占位。
  • pnpm build:prod:通过;仅有仓库既有 CSS 伪类和 chunk-size 警告。
  • /static/uploadfile/goauto-color/f96f0134-8e44-4fdc-a028-f69d24face71.jpg 经开发代理返回 200。

文档影响:无长期文档影响;未新增接口、参数、字段、数据结构、权限或业务规则,跳过 Wiki。Agent 不受影响。

提交:78f5895,已推送 origin/main。无关 Android、SYB 文档和 task 工作区修改均保留未提交。状态:待用户验收。

## 实施完成,待验收 设计证据:用户于 2026-08-31 确认合并后的 PDD 选择器低保真设计。 实现: - 打开“搜索并选择 PDD 商品”立即请求最近更新的前 5 个 `active` 商品;不默认选择、高亮或自动关联。 - 关键词搜索继续使用现有 goods_id/标题/店铺语义和 20 条上限;清空后恢复默认 5 条 active 商品。 - 弹窗新增“颜色图”和“最近更新”列;每行展示第一张颜色图,无图片或加载失败显示“暂无图片”。文案未使用“主图”“商品图”“最近采集”。 - PDD 列表服务按当页商品 ID 单次批量读取颜色图片,按 `pdd_product_id ASC, color ASC` 取每个商品第一张;无图片时 `colorImages` 保持缺省。 - 开发环境 `/static` 代理使用已存在的 `web/vite.config.mjs` 工作区修正,并已在 9530→8010 场景验证真实图片 HTTP 200。 验证: - `go test ./app/goauto/product`:通过。新增测试证明图片只查询一次、每商品最多一张、按 color ASC 取第一张、无图不返回。 - `pnpm exec eslint src/views/goauto/shopee-products/index.vue`:通过。 - `PLAYWRIGHT_TEST_BASE_URL=http://localhost:9530 PLAYWRIGHT_DISABLE_VIDEO=1 pnpm exec playwright test tests/e2e/shopee-pdd-picker.spec.ts`:1/1 通过,覆盖打开预填、active 过滤、关键词搜索、已停用禁选、清空回退、有图加载失败占位与无图占位。 - `pnpm build:prod`:通过;仅有仓库既有 CSS 伪类和 chunk-size 警告。 - `/static/uploadfile/goauto-color/f96f0134-8e44-4fdc-a028-f69d24face71.jpg` 经开发代理返回 200。 文档影响:无长期文档影响;未新增接口、参数、字段、数据结构、权限或业务规则,跳过 Wiki。Agent 不受影响。 提交:`78f5895`,已推送 `origin/main`。无关 Android、SYB 文档和 task 工作区修改均保留未提交。状态:待用户验收。
Author
Owner

范围修订二实施完成,最终待验收

已完成 Claude 更新后新增的 PDD 商品主列表范围:

  • 移除主列表“销量 / 评价”列,原位置替换为“颜色图”。
  • 使用列表接口已返回的首张 colorImages;有图显示 56×56 缩略图,无图或加载失败显示“暂无图片”。
  • 销量和评价数据未删除,详情抽屉继续显示,编辑表单继续读取和保存。
  • 筛选、分页、单商品定位、当前页多选和批量创建采集任务保持不变。

验证:

  • pnpm exec eslint src/views/goauto/pdd-products/index.vue:通过。
  • pnpm build:prod:通过;仅有仓库既有 CSS 伪类和 chunk-size 警告。
  • PLAYWRIGHT_TEST_BASE_URL=http://localhost:9530 PLAYWRIGHT_DISABLE_VIDEO=1 pnpm exec playwright test tests/e2e/pdd-product-module.spec.ts:5/5 通过。覆盖颜色图列、移除销量/评价列、无图/加载失败占位、详情仍显示销量评价、编辑保存数值、定位/查询/重置/批量采集回归。

提交:1340ba0,已推送 origin/main。

#168 的最终交付由两次提交组成:

  • 78f5895:服务端列表首图、PDD 选择弹窗默认预填/搜索/首图、静态代理与测试。
  • 1340ba0:PDD 商品主列表颜色图列及回归测试。

文档影响仍为无长期文档影响,未更新 Wiki。状态:最终待用户验收。

## 范围修订二实施完成,最终待验收 已完成 Claude 更新后新增的 PDD 商品主列表范围: - 移除主列表“销量 / 评价”列,原位置替换为“颜色图”。 - 使用列表接口已返回的首张 `colorImages`;有图显示 56×56 缩略图,无图或加载失败显示“暂无图片”。 - 销量和评价数据未删除,详情抽屉继续显示,编辑表单继续读取和保存。 - 筛选、分页、单商品定位、当前页多选和批量创建采集任务保持不变。 验证: - `pnpm exec eslint src/views/goauto/pdd-products/index.vue`:通过。 - `pnpm build:prod`:通过;仅有仓库既有 CSS 伪类和 chunk-size 警告。 - `PLAYWRIGHT_TEST_BASE_URL=http://localhost:9530 PLAYWRIGHT_DISABLE_VIDEO=1 pnpm exec playwright test tests/e2e/pdd-product-module.spec.ts`:5/5 通过。覆盖颜色图列、移除销量/评价列、无图/加载失败占位、详情仍显示销量评价、编辑保存数值、定位/查询/重置/批量采集回归。 提交:`1340ba0`,已推送 `origin/main`。 #168 的最终交付由两次提交组成: - `78f5895`:服务端列表首图、PDD 选择弹窗默认预填/搜索/首图、静态代理与测试。 - `1340ba0`:PDD 商品主列表颜色图列及回归测试。 文档影响仍为无长期文档影响,未更新 Wiki。状态:最终待用户验收。
Author
Owner

范围修订三:颜色裁剪图预览(用户已确认)

用户确认 PDD 选择弹窗与 PDD 商品主列表中的颜色缩略图支持单击/双击预览。这里的“原始图片”定义为服务端已保存的颜色规格裁剪图,不是整屏截图、商品主图或新下载图片。

固定边界:

  • 两处均复用 Element Plus el-image 的预览能力,预览源为当前 imagePath,不新增接口、字段、下载或存储。
  • 单击和双击缩略图都可进入同一预览;触屏与键盘用户仍可使用组件现有语义。
  • 预览使用 teleported viewer,关闭后停留在原列表/弹窗。
  • 在 PDD 选择弹窗中,点击图片只预览,绝不触发该行“选择”或自动关联。
  • 无图或加载失败继续显示“暂无图片”,不打开预览。

验收增加:两处有图缩略图可打开裁剪图预览;选择弹窗预览时不会触发关联;关闭预览后弹窗和搜索结果保持;无图/失败占位不可预览。

## 范围修订三:颜色裁剪图预览(用户已确认) 用户确认 PDD 选择弹窗与 PDD 商品主列表中的颜色缩略图支持单击/双击预览。这里的“原始图片”定义为服务端已保存的颜色规格裁剪图,不是整屏截图、商品主图或新下载图片。 固定边界: - 两处均复用 Element Plus `el-image` 的预览能力,预览源为当前 `imagePath`,不新增接口、字段、下载或存储。 - 单击和双击缩略图都可进入同一预览;触屏与键盘用户仍可使用组件现有语义。 - 预览使用 teleported viewer,关闭后停留在原列表/弹窗。 - 在 PDD 选择弹窗中,点击图片只预览,绝不触发该行“选择”或自动关联。 - 无图或加载失败继续显示“暂无图片”,不打开预览。 验收增加:两处有图缩略图可打开裁剪图预览;选择弹窗预览时不会触发关联;关闭预览后弹窗和搜索结果保持;无图/失败占位不可预览。
Author
Owner

范围修订三实施完成:颜色裁剪图预览

实现:

  • PDD 选择弹窗和 PDD 商品主列表的颜色缩略图均启用 Element Plus 图片预览。
  • 单击或双击缩略图均打开服务端已保存的颜色规格裁剪图;preview viewer teleported 到页面顶层。
  • 关闭后保留原弹窗、列表、搜索和选择状态。
  • 选择弹窗中点击图片不会调用“选择”或自动关联。
  • 无图及加载失败仍显示“暂无图片”,不提供预览。
  • 未新增接口、字段、下载、存储或 Agent 行为。

验证:

  • pnpm exec eslint src/views/goauto/shopee-products/index.vue src/views/goauto/pdd-products/index.vue:通过。
  • pnpm build:prod:通过;仅有仓库既有 CSS 伪类和 chunk-size 警告。
  • PLAYWRIGHT_TEST_BASE_URL=http://localhost:9530 PLAYWRIGHT_DISABLE_VIDEO=1 pnpm exec playwright test tests/e2e/shopee-pdd-picker.spec.ts tests/e2e/pdd-product-module.spec.ts:6/6 通过。覆盖两处单击/双击预览、关闭返回、选择弹窗不自动关联、无图占位,以及 PDD 列表既有定位/查询/编辑/批量采集回归。

提交:1d0b0ce,已推送 origin/main。#168 保持最终待用户验收。

## 范围修订三实施完成:颜色裁剪图预览 实现: - PDD 选择弹窗和 PDD 商品主列表的颜色缩略图均启用 Element Plus 图片预览。 - 单击或双击缩略图均打开服务端已保存的颜色规格裁剪图;preview viewer teleported 到页面顶层。 - 关闭后保留原弹窗、列表、搜索和选择状态。 - 选择弹窗中点击图片不会调用“选择”或自动关联。 - 无图及加载失败仍显示“暂无图片”,不提供预览。 - 未新增接口、字段、下载、存储或 Agent 行为。 验证: - `pnpm exec eslint src/views/goauto/shopee-products/index.vue src/views/goauto/pdd-products/index.vue`:通过。 - `pnpm build:prod`:通过;仅有仓库既有 CSS 伪类和 chunk-size 警告。 - `PLAYWRIGHT_TEST_BASE_URL=http://localhost:9530 PLAYWRIGHT_DISABLE_VIDEO=1 pnpm exec playwright test tests/e2e/shopee-pdd-picker.spec.ts tests/e2e/pdd-product-module.spec.ts`:6/6 通过。覆盖两处单击/双击预览、关闭返回、选择弹窗不自动关联、无图占位,以及 PDD 列表既有定位/查询/编辑/批量采集回归。 提交:`1d0b0ce`,已推送 `origin/main`。#168 保持最终待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#168