--- id: T-667 title: 历史批次默认架上商品与移除状态重检入口 status: DONE phase: 7 deps: [T-662a, T-662d, T-666] created: 2026-07-20 --- # T-667 历史批次默认架上商品与移除状态重检入口 ## 问题 / 背景 T-662a 于 2026-07-18 16:34:37(本地时间)首次上线商品状态字段。此前导入的历史批次没有 `product_status` 快照;T-666 要求用户逐条打开历史商品详情页补检,几百条记录会带来明显等待和额外操作负担。产品决定:商品状态功能上线前创建、且状态为空的历史批次,默认按架上商品处理,以便继续生成和更新;不再提供用户手动状态重检入口。 ## 方案 - 定义稳定的商品状态功能上线时间常量 `2026-07-18T16:34:37`。`db.init_db()` 每次启动执行幂等迁移:仅对未软删除批次中 `batches.created_at` 早于该时间,且 `tasks.product_status` 为 `NULL` 或空白的记录写入 `normal`。 - 同时写 `product_status_note=历史批次默认按架上商品处理(未实时检测)`,保留 `product_status_at=NULL`,避免把默认值伪装为实时页面检测;更新 `updated_at`。已有 `normal/unlisted/reviewing/unknown` 均不得覆盖,功能上线后创建的批次也不得自动迁移。 - 移除①「重新检测商品状态」按钮、确认框、活动计时、专用 Worker、编辑器入口、`run_type=status_recheck` 运行日志及只为该入口添加的 GUI/测试/文档说明。常规①采集仍照现有流程实时检测并保存状态,新批次不受影响。 - ③继续只允许 `product_status=normal` 更新。历史默认记录因已迁移为 `normal` 可进入既有更新内容预检;不再显示“尚未检测商品状态”或引导用户点击重检。真实已保存的 `unknown` 仍显示「状态未知」并保持拦截。 ## 验收标准 - [x] 启动或 `db.init_db()` 后,状态功能上线时间前的活动批次中 NULL/空状态任务变为 `normal`,备注为历史默认语义,`product_status_at` 仍为空;重复初始化不重复改写。 - [x] 上线时间等于或晚于阈值的 NULL/空状态任务不迁移,已有四类状态也不覆盖,软删除批次不迁移。 - [x] ③历史默认 `normal` 记录可按原有标题/封面完整性规则进入更新;已保存 `unknown` 仍按「状态未知」阻断。 - [x] ①不再显示「重新检测商品状态」,运行中控件状态、采集活动计时、回写逻辑和正常采集不回归。 - [x] 不打开 Chrome、不访问商品详情页、不新增 AI 调用、不修改 Excel、不更新线上商品。 ## 测试与文档 - `tests/test_db.py` 覆盖历史迁移范围、幂等、边界时间、已有状态及软删除批次保护。 - `tests/test_product_status.py`、`tests/test_gui.py` 覆盖③历史默认正常可更新、真实 unknown 仍阻断,以及①重检入口移除。 - 更新 `docs/routes.md`、`docs/04-architecture.md`、`docs/api.md`;T-666 保留完成记录并标明已被本任务替代。 ## 验证 ```bash 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 ``` ## 非目标 - 不把功能上线后创建的缺失状态任务自动视为正常。 - 不覆盖已确认的未上架、审核中、状态未知或正常快照。 - 不为历史迁移新增确认弹窗、状态强制更新开关或详情页批量检测。 ## 执行记录 - 在 `db.init_db()` 增加幂等历史状态迁移:仅迁移上线时间前、未软删除批次的 NULL/空状态任务,写入 `normal` 和明确的历史默认备注,保留 `product_status_at=NULL`。 - 移除 T-666 的①「重新检测商品状态」入口、专用 Worker、编辑器流程、运行日志及其③引导;常规采集的实时状态读取保持不变。 - 更新架构、路由和 API 文档,并在 T-666 保留历史执行记录及其被替代说明。 - 验证通过:`py -3.10 -m unittest discover -s tests`(619 项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check`。