--- id: T-669 title: 导入采集商品状态展示与筛选 status: TODO phase: 7 deps: [T-662a, T-667] created: 2026-07-20 --- # T-669 导入采集商品状态展示与筛选 ## 问题 / 背景 商品状态已经在 `tasks.product_status/product_status_note/product_status_at` 保存,①「导入采集」却只显示处理阶段,顶部「状态」下拉实际也只筛选待采集、已采集、已生成等处理阶段。运营无法在采集页直观看出哪些商品已在架、未上架、审核中,或尚未检测;两个不同维度都称为“状态”也容易误操作。 ## 方案 - 在①任务表新增「商品状态」列,位于「阶段」右侧;现有「阶段」继续表示工作流进度,不复用或替换其含义。 - ①筛选行在现有处理阶段下拉左侧新增「商品状态」下拉,并把既有标签「状态」改为「处理状态」。商品状态选项固定为「全部商品状态、架上商品、未上架、审核中、状态未知、待检测」。 - 显示和筛选以原始 `tasks.product_status` 区分:`normal` 显示「架上商品」、`unlisted` 显示「未上架」、`reviewing` 显示「审核中」、显式 `unknown` 显示「状态未知」、NULL/空白显示「待检测」。不得把未检测的空值在①列表里伪装为真实的「状态未知」。 - 商品状态使用语义色:架上商品为成功绿,审核中为警示橙,未上架为错误红或深红,状态未知/待检测为中性灰;不能只依赖颜色,文字必须始终完整显示。保留已有阶段色。 - 商品状态列 tooltip 显示 `product_status_note`;历史批次自动迁移的 `normal` 必须能看到「历史批次默认按架上商品处理(未实时检测)」,让用户区分默认值与实时检测快照。检测时间存在时可追加简短检测时间。 - 商品状态和处理状态筛选为叠加关系,并与批次、店铺、商品 ID、未匹配筛选继续共同生效;刷新后按现有页面习惯保留可用选择。表格列宽调整为商品状态/阶段按内容宽度,商品 ID 和账号等主信息保留可读宽度,避免新增列后五列平均拉伸而截断。 ## 验收标准 - [ ] ①列表显示「商品状态」列,并能正确区分架上商品、未上架、审核中、状态未知和待检测;阶段列仍正确显示待采集、已采集、已生成等工作流状态。 - [ ] 商品状态下拉位于「处理状态」左侧;两项筛选可叠加,且继续与批次、店铺、商品 ID 筛选共同生效。 - [ ] 历史默认正常记录显示「架上商品」,tooltip 明确其未实时检测语义;真实 `unknown` 与 NULL/空白的「待检测」不混淆。 - [ ] 筛选、刷新、采集、回写、生成和更新既有行为不回归;不改变商品状态的写入时机、历史迁移规则或③更新安全预检。 - [ ] `tests/test_gui.py` 和模型相关测试覆盖状态列展示、tooltip、商品状态筛选与处理状态叠加筛选。 ## 验证 ```bash py -3.10 -m unittest discover -s tests -p "test_gui.py" py -3.10 -m unittest discover -s tests py -3.10 -m ruff check app tests main.py py -3.10 -m compileall app main.py git diff --check ``` ## 非目标 - 不新增 SQLite 字段,不修改商品状态检测、Chrome/CDP、AI 调用、Excel 或③更新流程。 - 不在②、③新增新的商品状态列或筛选控件;它们继续沿用现有生成/更新前的状态安全规则。 ## 执行记录 - 待实现。