diff --git a/docs/tasks/T-673.md b/docs/tasks/T-673.md new file mode 100644 index 0000000..4a7d0d4 --- /dev/null +++ b/docs/tasks/T-673.md @@ -0,0 +1,59 @@ +--- +id: T-673 +title: 促销编辑提示商品状态误判修复 +status: TODO +phase: 7 +deps: [T-667, T-672] +created: 2026-07-20 +--- + +# T-673 促销编辑提示商品状态误判修复 + +## 问题 / 背景 + +历史批次 `2026-07-10T10:56:14` 的 13 条任务已有新封面,③选择「只更新封面」时仍被全部拦截。排查发现:旧状态重检把蝦皮横幅「由於正在進行促銷,以下一些欄位無法進行編輯,數值將顯示為灰色。」保存为显式 `unknown`。 + +现有 `product_status.classify_alerts()` 将任何未命中「审核中 / 您的商品未上架」白名单的 warning 横幅都归为 `unknown`。促销字段受限不是商品生命周期异常;将其作为商品状态未知会阻断仅更新封面的正常流程。T-667 的历史默认迁移只处理空状态,且正确地不覆盖已保存的 `unknown`,因此无法修复这批已被误写的数据。 + +## 方案 + +- 在共享 `app/product_status.py` 增加仅针对已确认文案特征的识别:标题同时表达「促销 / 促銷」和「无法 / 無法编辑 / 編輯」时,视为**非商品状态警示**。它不单独形成商品状态,也不作为 `unknown` 的理由。 +- `classify_alerts()` 保持状态优先级:同页若同时出现「审核中」或「您的商品未上架」,仍优先返回 `reviewing` 或 `unlisted`;只有页面成功读取、所有有效 warning 均为该已知促销编辑提示时,才返回 `normal`。其他未识别横幅、DOM 异常、非法返回仍返回 `unknown`。 +- 在 `db.init_db()` 增加幂等历史修复:仅处理商品状态功能上线前的未软删除批次中,`product_status='unknown'` 且 `product_status_note` 精确符合上述促销编辑提示特征的记录;改为 `normal`,写明「历史商品状态修正:促销编辑提示不属于商品状态异常」,保留原 `product_status_at`,并更新 `updated_at`。不得批量覆盖其他 `unknown`、`unlisted`、`reviewing`、`normal` 或上线后批次。 +- 更新商品状态架构/API/路由说明:促销字段编辑限制不属于商品状态;③仍只允许 `normal`,真正未知状态继续拦截。③的「商品状态不允许更新」提示不再引导已移除的“重新检测商品状态”入口。 + +## 验收标准 + +- [ ] 纯逻辑识别繁体和简体促销编辑提示为 `normal`;同页同时有促销提示和未上架/审核中横幅时,仍分别返回 `unlisted`/`reviewing`;其他未识别横幅、非法响应保持 `unknown`。 +- [ ] 数据库初始化只修复上线前、活动批次中具有该已知促销提示的显式 `unknown`;修改后的记录可进入③只更新封面的既有内容预检。 +- [ ] 其他历史 `unknown`、上线后相同提示、已软删除记录以及已确认 `normal/unlisted/reviewing` 均不被改写;重复 `init_db()` 不再修改已修复记录的 `updated_at`。 +- [ ] ③在全是该历史修复记录且新封面完整时,`build_apply_plan(..., "cover")` 返回可执行任务,不创建新的商品状态例外通道。 +- [ ] 用户可见提示为中文,不再提示用户使用已移除的商品状态重检入口。 + +## 测试与文档 + +- `tests/test_product_status.py` 覆盖促销横幅的繁简识别、多个横幅优先级和未知保护。 +- `tests/test_db.py` 覆盖精确历史修复范围、重复初始化和③封面预检结果。 +- 更新 `docs/04-architecture.md`、`docs/routes.md`、`docs/api.md` 的商品状态契约。 + +## 验证 + +```bash +py -3.10 -m unittest discover -s tests -p "test_product_status.py" +py -3.10 -m unittest discover -s tests -p "test_db.py" +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 +``` + +## 非目标 + +- 不把所有 `unknown` 自动改为 `normal`,不放宽③对真实未知、未上架和审核中商品的拦截。 +- 不新增历史状态重检按钮、强制更新开关、Chrome 访问、AI 调用或线上商品更新。 +- 不把促销导致的字段可编辑性限制解释为标题更新许可;本任务只修复商品生命周期状态的误分类。 + +## 执行记录 + +- 待实现。