--- id: T-671 title: AI生成商品状态筛选与生成状态命名 status: DONE phase: 7 deps: [T-669] created: 2026-07-20 --- # T-671 AI生成商品状态筛选与生成状态命名 ## 问题 / 背景 ②「AI生成」顶部现有「状态」下拉只筛选待生成、已生成、失败等生成进度,名称容易被理解为商品是否在架。商品状态目前只在点击「开始生成」后的范围确认框参与安全判断,运营无法在日常列表中预先筛选架上、未上架、审核中或待检测的商品。 ## 方案 - 在②筛选行的现有状态下拉左侧新增「商品状态」下拉,顺序固定为「批次、店铺、商品ID、商品状态、生成状态、刷新、打开图片文件夹」。既有标签「状态」改为「生成状态」。 - 商品状态选项与 T-669 的①保持一致:全部商品状态、架上商品、未上架、审核中、状态未知、待检测;按原始 `tasks.product_status` 判断,NULL/空白为「待检测」,显式 `unknown` 为「状态未知」,不得混淆。 - 商品状态、生成状态、批次、店铺和商品 ID 筛选条件叠加生效;刷新时保留仍有效的选择。生成状态继续使用既有待生成、已生成、失败、略过、已更新语义,不改变标题状态/图片状态列的展示逻辑。 - 点击「开始生成」后,仍必须以当前筛选结果重新建立商品状态生成计划并显示既有范围确认框。商品状态筛选仅缩小范围,绝不授权处理异常商品:筛到未上架、审核中、状态未知或待检测后,用户仍需在确认框中明确选择「生成全部商品」才会请求 AI;默认「生成架上商品」继续只执行 `normal`。 - ②表格本任务不新增「商品状态」列,避免在现有六列(店铺、商品ID、旧标题、新标题、标题状态、图片状态)上继续压缩可读宽度;商品状态通过筛选和确认摘要呈现。 ## 验收标准 - [x] ②筛选行显示「商品状态」和「生成状态」两个明确标签,商品状态位于生成状态左侧。 - [x] 商品状态下拉能分别筛出架上商品、未上架、审核中、状态未知和待检测,并可与生成状态、批次、店铺、商品 ID 筛选叠加。 - [x] 商品状态筛选不会改变 SQLite 数据、标题/封面生成结果或进度状态。 - [x] 筛选异常商品后点击开始生成,默认范围仍不执行异常商品;只有用户在确认框主动选择「生成全部商品」才会执行。 - [x] `tests/test_gui.py` 覆盖控件顺序和中文标签、筛选交集、NULL/unknown 区分,以及异常筛选下生成范围确认仍生效。 ## 验证 ```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 ``` ## 非目标 - 不在②表格新增商品状态列,不调整既有列宽。 - 不改商品状态检测、历史批次迁移、AI 调用、CMHub、CDP/Shopee、Excel 或③更新逻辑。 - 不移除、跳过或放宽点击开始生成时的商品状态范围确认。 ## 执行记录 - ②筛选行新增「商品状态」下拉,原「状态」改名为「生成状态」;商品状态使用 T-669 的共享选项和原始空值识别,与批次、店铺、商品 ID、生成状态叠加筛选。 - 开始生成仍只从当前筛选后的 `model.tasks` 取候选,并继续执行既有商品状态范围确认;异常商品在默认「生成架上商品」范围内不入队。 - 更新路由文档,并补充控件标签、组合筛选、待检测/状态未知与默认安全计划的 GUI 回归测试。 - 验证通过:`py -3.10 -m unittest discover -s tests`(623 项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check`。