Files
cmshoppe/docs/tasks/T-673.md
T

64 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: T-673
title: 促销编辑提示商品状态误判修复
status: DONE
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 调用或线上商品更新。
- 不把促销导致的字段可编辑性限制解释为标题更新许可;本任务只修复商品生命周期状态的误分类。
## 执行记录
- 在 `product_status.classify_alerts()` 增加繁简促销编辑提示识别:该提示单独出现时按 `normal`,同页出现「审核中」或「您的商品未上架」仍优先返回真实异常状态;其他未识别横幅、DOM 异常和非法返回仍为 `unknown`。
- 在 `db.init_db()` 增加幂等精确修复:仅处理商品状态功能上线前、未软删除批次中由该促销提示误写的 `unknown`,修正为 `normal`、保留原检测时间并写入历史修正备注;其他未知、已确认异常、上线后批次和软删除数据均不改写。
- ③状态拦截提示改为中文安全说明,不再引导用户使用已移除的「重新确认商品状态」入口;同步更新架构、路由和 API 文档。
- 已对本机运行时数据库执行初始化迁移核验:批次 `20260710_105614_09b176d6` 的 13 条促销误判记录均已修正为 `normal`;只更新封面预检结果为候选 13 条、可执行 13 条、状态排除 0 条、缺少封面 0 条。未打开 Chrome、未调用 AI、未提交线上更新。
- 验证通过:`py -3.10 -m unittest discover -s tests -p "test_product_status.py"`(7 项)、`py -3.10 -m unittest discover -s tests -p "test_db.py"`(21 项)、`py -3.10 -m unittest discover -s tests -p "test_gui.py"`(206 项)、`py -3.10 -m unittest discover -s tests`(625 项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check`。