解析商品质量诊断并支持按「缺少视频」筛选 #11

Open
opened 2026-09-02 20:44:10 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:需求 | 所属 Epic:#2 | 所属 MVP:#3 | 阶段:待实施

依赖与并行

  • 前置工单:#8、#10(均已实施完成并推送)
  • 允许并行:否;原因:要改 products 表结构和 getPage 的解析。

原始需求

  • 来源:用户对话,2026-09-02
  • 关键原话:「里面每个 record 有 diagnoses 字段,要这个数据提取出来存到 sqlite,
    页面上可以筛选『缺少视频』的,因为缺少视频的商品才需要用图片去淘宝搜商品视频」

要解决什么

货憨憨的 getPage 响应里带有商品质量诊断。其中「缺少视频」直接标出了
哪些商品才需要去淘宝找视频,能把工作量从「全店商品」缩小到真正需要处理的那部分。
现在这个字段被完全丢弃了。

真实数据(Claude 已用负责人抓包和线上只读验证核对)

字段名是 diagnosisInfo,不是 diagnoses。它是记录里的一个对象,
真实结构比负责人贴出的多一层:

"diagnosisInfo": {
  "itemId": "53115620137",
  "qualityLevel": "1",
  "diagnoses": [
    {
      "field": "ALL",
      "diagnosisResults": [
        {"type": "缺少视频", "solution": "上传相应的视频"},
        {"type": "缺少品牌信息", "solution": "填写品牌信息"}
      ]
    }
  ]
}

500 条样本里出现过的全部诊断类型:

次数 类型
135 缺少尺寸表
135 缺少标准变体
62 缺少品牌信息
60 所需属性过少
59 缺少视频
58 合格级属性数量不足

field 实测只出现过 "ALL";qualityLevel 出现过 "1" 和 "2"。

已线上验证的两点

  • 所有店铺都返回诊断(负责人确认)
  • itemStatus 不影响诊断:实测三个店铺的 NORMAL 与 UNLIST 均正常返回诊断。
    SOLD_OUT 与 BANNED 查询返回 0 条,这是货憨憨自身的已知现象,与本工单无关。

关键设计:必须存三态,不能存布尔

500 条样本里 293 条 diagnosisInfo 为 null;另一个店铺一页 50 条里只有 10 条有诊断。
比例因店铺而异。

null 不等于「有视频」:可能是货憨憨没诊断过、诊断还没跑完,或该商品不参与诊断。
若把 null 当成「有视频」,这些商品会被永久排除在处理范围外且无人察觉。

因此 video_diagnosis 取三个值:

值 含义 界面筛选项
missing 诊断明确报了「缺少视频」 缺少视频 ← 主要工作对象
ok 有诊断,但未报缺少视频 视频齐全
unknown diagnosisInfo 为 null 诊断未知 ← 需要单独看

做什么 / 不做什么

  • 做:解析 diagnosisInfo;products 表加 video_diagnosis 和 quality_level;
    新增 product_diagnoses 表保存全部诊断类型;界面加诊断筛选;
    「视频」列显示诊断结果。
  • 不做:不做「按诊断类型批量修复」这类功能;不改淘宝相关代码。

为什么要存全部诊断类型而不只存「缺少视频」

采集成本为零(同一份响应里已经有了),但另外 5 种类型对将来的商品质量优化同样有价值。
现在丢掉,将来要用就得重新全量拉一遍。

预计修改文件

  • internal/store/store.go(只在 migrations 末尾追加,不得修改已有条目)
  • internal/store/product.go(Product 加字段、查询条件加诊断筛选)
  • internal/store/diagnosis.go、diagnosis_test.go(新建)
  • internal/huohanhan/product.go(解析 diagnosisInfo)
  • internal/huohanhan/product_test.go
  • app.go
  • frontend/src/views/ProductListView.vue

验收标准

  • 新迁移在 migrations 末尾追加,已有条目未改动;老库升级后原有数据与本地状态不丢
  • diagnosisInfo 为 null 时存 unknown,不得当成 ok
  • 报了「缺少视频」存 missing,有诊断但没报的存 ok
  • 全部诊断类型都落库,不只保存「缺少视频」
  • 界面可按 全部 / 缺少视频 / 视频齐全 / 诊断未知 筛选
  • 「视频」列显示诊断结果
  • 重复下载数据不会把诊断结果清空

验证方式

go vet ./...
go test ./...
cd frontend; npx vite build

交给 Codex 实施的约定

本工单由本机 Codex CLI(模型 gpt-5.6-sol)实施,由 Claude 审核。

Codex 必须遵守:

  • 先读仓库根目录 AGENTS.md,第 10 节「项目专用规则」是不可违反的红线。
  • 只改本工单「预计修改文件」列出的范围;发现别的问题记录下来,不要顺手改。
  • Wails 专有 API 只能出现在 main.go 和 app.go;internal/ 不许 import wails。
  • 不把账号、密码、token、Cookie 写入代码、日志、注释或测试固定值。
  • 面向初级维护者写代码:直白实现,注释解释「为什么」和边界,不逐行翻译代码。
  • 新增逻辑要有 go test 覆盖;不能联网的部分用假数据测,不要写需要真实账号才能跑的测试。
  • 完成后必须真实执行并贴出输出:go vet ./...、go build ./...、go test ./...。
  • 不要自行提交 Git,也不要改 docs/ 下的任何文件(那是 Wiki 镜像)。
## 基本信息 - 类型:需求 | 所属 Epic:#2 | 所属 MVP:#3 | 阶段:待实施 ## 依赖与并行 - 前置工单:#8、#10(均已实施完成并推送) - 允许并行:否;原因:要改 products 表结构和 getPage 的解析。 ## 原始需求 - 来源:用户对话,2026-09-02 - 关键原话:「里面每个 record 有 diagnoses 字段,要这个数据提取出来存到 sqlite, 页面上可以筛选『缺少视频』的,因为缺少视频的商品才需要用图片去淘宝搜商品视频」 ## 要解决什么 货憨憨的 `getPage` 响应里带有商品质量诊断。其中「缺少视频」直接标出了 **哪些商品才需要去淘宝找视频**,能把工作量从「全店商品」缩小到真正需要处理的那部分。 现在这个字段被完全丢弃了。 ## 真实数据(Claude 已用负责人抓包和线上只读验证核对) 字段名是 **`diagnosisInfo`**,不是 `diagnoses`。它是记录里的一个对象, 真实结构比负责人贴出的多一层: ```json "diagnosisInfo": { "itemId": "53115620137", "qualityLevel": "1", "diagnoses": [ { "field": "ALL", "diagnosisResults": [ {"type": "缺少视频", "solution": "上传相应的视频"}, {"type": "缺少品牌信息", "solution": "填写品牌信息"} ] } ] } ``` 500 条样本里出现过的全部诊断类型: | 次数 | 类型 | |---|---| | 135 | 缺少尺寸表 | | 135 | 缺少标准变体 | | 62 | 缺少品牌信息 | | 60 | 所需属性过少 | | **59** | **缺少视频** | | 58 | 合格级属性数量不足 | `field` 实测只出现过 `"ALL"`;`qualityLevel` 出现过 `"1"` 和 `"2"`。 ### 已线上验证的两点 - **所有店铺都返回诊断**(负责人确认) - **`itemStatus` 不影响诊断**:实测三个店铺的 NORMAL 与 UNLIST 均正常返回诊断。 `SOLD_OUT` 与 `BANNED` 查询返回 0 条,这是货憨憨自身的已知现象,与本工单无关。 ## 关键设计:必须存三态,不能存布尔 500 条样本里 **293 条 `diagnosisInfo` 为 `null`**;另一个店铺一页 50 条里只有 10 条有诊断。 比例因店铺而异。 `null` **不等于「有视频」**:可能是货憨憨没诊断过、诊断还没跑完,或该商品不参与诊断。 若把 `null` 当成「有视频」,这些商品会被永久排除在处理范围外且无人察觉。 因此 `video_diagnosis` 取三个值: | 值 | 含义 | 界面筛选项 | |---|---|---| | `missing` | 诊断明确报了「缺少视频」 | 缺少视频 ← 主要工作对象 | | `ok` | 有诊断,但未报缺少视频 | 视频齐全 | | `unknown` | `diagnosisInfo` 为 null | 诊断未知 ← 需要单独看 | ## 做什么 / 不做什么 - 做:解析 `diagnosisInfo`;`products` 表加 `video_diagnosis` 和 `quality_level`; 新增 `product_diagnoses` 表保存全部诊断类型;界面加诊断筛选; 「视频」列显示诊断结果。 - 不做:不做「按诊断类型批量修复」这类功能;不改淘宝相关代码。 ## 为什么要存全部诊断类型而不只存「缺少视频」 采集成本为零(同一份响应里已经有了),但另外 5 种类型对将来的商品质量优化同样有价值。 现在丢掉,将来要用就得重新全量拉一遍。 ## 预计修改文件 - `internal/store/store.go`(**只在 migrations 末尾追加**,不得修改已有条目) - `internal/store/product.go`(Product 加字段、查询条件加诊断筛选) - `internal/store/diagnosis.go`、`diagnosis_test.go`(新建) - `internal/huohanhan/product.go`(解析 diagnosisInfo) - `internal/huohanhan/product_test.go` - `app.go` - `frontend/src/views/ProductListView.vue` ## 验收标准 - [ ] 新迁移在 migrations 末尾追加,已有条目未改动;老库升级后原有数据与本地状态不丢 - [ ] `diagnosisInfo` 为 null 时存 `unknown`,不得当成 `ok` - [ ] 报了「缺少视频」存 `missing`,有诊断但没报的存 `ok` - [ ] 全部诊断类型都落库,不只保存「缺少视频」 - [ ] 界面可按 全部 / 缺少视频 / 视频齐全 / 诊断未知 筛选 - [ ] 「视频」列显示诊断结果 - [ ] 重复下载数据不会把诊断结果清空 ## 验证方式 ```powershell go vet ./... go test ./... cd frontend; npx vite build ``` ## 交给 Codex 实施的约定 本工单由本机 Codex CLI(模型 `gpt-5.6-sol`)实施,由 Claude 审核。 Codex 必须遵守: - 先读仓库根目录 `AGENTS.md`,第 10 节「项目专用规则」是不可违反的红线。 - 只改本工单「预计修改文件」列出的范围;发现别的问题记录下来,不要顺手改。 - Wails 专有 API 只能出现在 `main.go` 和 `app.go`;`internal/` 不许 import wails。 - 不把账号、密码、token、Cookie 写入代码、日志、注释或测试固定值。 - 面向初级维护者写代码:直白实现,注释解释「为什么」和边界,不逐行翻译代码。 - 新增逻辑要有 `go test` 覆盖;不能联网的部分用假数据测,不要写需要真实账号才能跑的测试。 - 完成后必须真实执行并贴出输出:`go vet ./...`、`go build ./...`、`go test ./...`。 - 不要自行提交 Git,也不要改 `docs/` 下的任何文件(那是 Wiki 镜像)。
Author
Owner

需求变化记录(2026-09-02,负责人决定)

日期 变化内容 原因 用户确认
2026-09-02 由三态改为两态:只有诊断明确报「缺少视频」才算缺少视频,其余(含 diagnosisInfo 为 null)一律按有视频处理 负责人原话:「初定包含"缺少视频"的才是缺少视频,其他的默认有视频。不用管现在 sqlite 里的数据」 是

我此前提出的顾虑与处理

我曾建议存三态,理由是 500 条样本里 293 条 diagnosisInfo 为 null,
而 null 可能表示「尚未诊断」而非「已有视频」;按两态处理时,
这部分商品会被归入「有视频」,从而不会进入淘宝搜索的处理范围。

负责人已知悉该顾虑并明确选择两态,措辞为「初定」,属于阶段性决定。
按此实施,不再保留 unknown。

若后续发现有商品实际缺少视频却被归为「有视频」,重新评估是否恢复三态。

因此变更的实现约定

  • video_diagnosis 只有两个取值:missing(诊断含「缺少视频」)与 ok(其余全部情况,含 null)
  • 界面筛选项:全部 / 缺少视频 / 有视频(去掉「诊断未知」)
  • 迁移新列默认值为 ok
  • 不需要处理已有数据:负责人明确说明不用管现在 SQLite 里的数据,
    下次「下载数据」会整体刷新

不变的部分

  • 仍然采集并保存全部 6 种诊断类型到 product_diagnoses 表,
    不只保存「缺少视频」。采集成本为零,另外 5 种对后续商品质量优化有价值。
  • 仍然保存 qualityLevel。
## 需求变化记录(2026-09-02,负责人决定) | 日期 | 变化内容 | 原因 | 用户确认 | |---|---|---|---| | 2026-09-02 | 由三态改为**两态**:只有诊断明确报「缺少视频」才算缺少视频,其余(含 `diagnosisInfo` 为 null)一律按**有视频**处理 | 负责人原话:「初定包含"缺少视频"的才是缺少视频,其他的默认有视频。不用管现在 sqlite 里的数据」 | 是 | ### 我此前提出的顾虑与处理 我曾建议存三态,理由是 500 条样本里 293 条 `diagnosisInfo` 为 `null`, 而 `null` 可能表示「尚未诊断」而非「已有视频」;按两态处理时, 这部分商品会被归入「有视频」,从而**不会进入淘宝搜索的处理范围**。 负责人已知悉该顾虑并明确选择两态,措辞为「初定」,属于阶段性决定。 按此实施,不再保留 `unknown`。 若后续发现有商品实际缺少视频却被归为「有视频」,重新评估是否恢复三态。 ### 因此变更的实现约定 - `video_diagnosis` 只有两个取值:`missing`(诊断含「缺少视频」)与 `ok`(其余全部情况,含 null) - 界面筛选项:全部 / 缺少视频 / 有视频(去掉「诊断未知」) - 迁移新列默认值为 `ok` - **不需要处理已有数据**:负责人明确说明不用管现在 SQLite 里的数据, 下次「下载数据」会整体刷新 ### 不变的部分 - 仍然采集并保存**全部 6 种诊断类型**到 `product_diagnoses` 表, 不只保存「缺少视频」。采集成本为零,另外 5 种对后续商品质量优化有价值。 - 仍然保存 `qualityLevel`。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmsp#11