Files
cmshoppe/docs/tasks/T-662c.md
T

68 lines
5.0 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-662c
title: AI生成范围确认与异常商品点数保护
status: DONE
phase: 7
deps: [T-662a]
created: 2026-07-18
---
# T-662c AI生成范围确认与异常商品点数保护
## 问题 / 背景
未上架、审核中或状态未知商品进入②会消耗 cmhub 点数。客户需要在每轮付费生成前明确选择范围,并让安全选项始终成为默认值;采集时选择“所有状态”只代表保存资料,不能自动授权后续扣点。
## 方案
- 本任务不新增商品状态列或下拉框。点击「开始生成」后,先按现有批次、店铺、商品ID、任务状态、生成内容模式和“缺什么生成什么”规则构造真实候选;候选为空时保持现有提示,不弹范围框。
- 候选存在时按 T-662a 状态代码分组,弹出中文生成范围对话框:
- `只生成状态正常的商品`:默认按钮,仅包含 `normal`;
- `生成所有状态的商品`:红色文字,包含 `normal/unlisted/reviewing/unknown`;
- `取消`:不创建 Worker、不调用 cmhub、不产生点数和 DB 变化。
- 弹窗展示本轮真实候选总数及正常、未上架、审核中、未知数量;说明“生成所有状态”会让非正常状态商品也调用 AI,可能额外消耗点数。示例商品ID数量受限,日志不得泄露接口路径或密钥。
- 若现有价格目录能依据本轮生成标题/图片模式可靠计算,则显示“预计最多消耗 X 点”;无法可靠计算时只显示风险说明,不编造点数。
- 默认焦点和回车只允许触发“只生成状态正常的商品”;红色选项不能成为默认按钮,不记忆危险选择。没有非正常候选时禁用“生成所有状态的商品”。
- `normal_only` 下,`unlisted/reviewing/unknown` 不进入 `GenerateWorker`,不创建 cmhub 请求、不消耗点数、不改 stage/status/Excel;历史 NULL 按 `unknown` 排除并提示重新采集。
- `all` 只授权本轮付费生成,不改变数据库商品状态,也不授权③更新线上商品。
- 使用共享纯逻辑 planner 输出 `base_candidates/status_counts/execution_tasks`;计划冻结字段至少包含 `task_id/updated_at/product_status/new_title/new_cover_path/生成内容模式`。弹窗期间相关数据变化时废弃旧计划并要求重新开始。
- Worker 接收确认后的精确任务列表和稳定范围代码 `normal_only/all`;本轮日志记录所选范围、排除统计和实际入队数量,正常模式下非正常商品不得通过其他入口绕过预检。
## 验收标准
- [ ] 真实候选为空时不弹范围框;有候选时弹窗数量与最终入队任务一致。
- [ ] 默认按钮、回车和普通确认只生成 `normal`;未上架、审核中、未知和历史 NULL 均不产生 cmhub 请求或点数。
- [ ] “生成所有状态”使用红色文字、非默认且不跨轮记忆;只有本轮明确选择后才能把非正常候选加入 Worker。
- [ ] 取消不创建 Worker、不调用 cmhub、不改 DB;计划数据变化时不能执行旧计划。
- [ ] 无非正常候选时危险按钮不可用;弹窗和日志使用中文并正确展示状态统计与可用的点数估算。
- [ ] 停止、进度、重试、增量生成、只生成标题/图片/图文和并发逻辑不回归。
## 测试与文档
- 纯逻辑 planner 覆盖四种状态、历史 NULL、两种范围、候选去重、点数估算和计划指纹。
- `tests/test_gui.py` 覆盖无候选、中文弹窗、默认焦点、回车、危险按钮样式/禁用、取消、数据变化、Worker 精确列表和点数不消耗边界。
- 更新 `docs/routes.md`、`docs/04-architecture.md` 和 `docs/api.md`。
## 验证
```bash
py -3.10 -m unittest tests.test_ai tests.test_gui
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 接口、价格目录、并发和重试;不新增商品状态筛选控件。
- 不把“生成所有状态”视为线上更新授权。
## 执行记录
- 已新增共享纯逻辑 `product_status.build_generation_plan()`:按任务 ID 去重、汇总四类状态、生成 `normal_only/all` 精确执行清单,并冻结候选指纹。
- ②「开始生成」在真实候选存在时弹出中文范围确认,默认只生成状态正常商品;“生成所有状态的商品”为红色危险选项,无异常候选时禁用。取消或候选在确认期间变化不会创建 Worker。
- `GenerateWorker` 接收范围、状态汇总和计划指纹;默认范围下再次防御性过滤非正常商品,`ai.generate_batch()` 只接收最终执行清单,运行日志记录范围和排除数量。
- 已更新 `docs/routes.md`、`docs/04-architecture.md`、`docs/api.md`。
- 验证通过:`py -3.10 -m unittest tests.test_product_status tests.test_gui`(203 项)、`py -3.10 -m unittest discover -s tests`(612 项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check`。