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

160 lines
8.2 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-576
title: ②③生成/更新内容模式下拉与缺失内容阻断
phase: 7
deps: [T-575]
status: DONE
created: 2026-07-09
---
## 问题 / 背景
当前②AI生成模块用「生成封面图片(成本较高)」checkbox 控制是否生成封面:
- 关闭:只生成标题。
- 开启:生成标题和封面。
这个设计能控制生图成本,但正式使用时不够精确:
- 用户无法只补生成封面;例如已生成标题后,想单独补封面,需要依赖当前增量逻辑和 checkbox 语义,不够直观。
- 「图片」文案不够准确,本模块实际处理的是商品封面,不是商品全部图片。
- ③更新蝦皮目前依赖⑤设置里的「允许更新封面」checkbox。这个开关离真实更新动作太远,用户在③点击开始更新时不一定清楚本轮到底更新标题、封面还是图文。
- 如果②只生成了标题,③却想更新封面,当前需要更明确地在开始前阻断并提示缺少新封面,避免进入 Chrome/CDP 后才失败。
## 产品结论
需求合理,建议做,但需要统一成“内容模式”而不是布尔开关。
②AI生成模块下拉:
- `只生成标题`
- `只生成封面`
- `生成标题和封面`
③更新蝦皮模块下拉:
- `只更新标题`
- `只更新封面`
- `更新标题和封面`
文案统一使用「封面」,不用「图片」,避免用户误解为商品详情图或所有商品图片。
## 方案
### 1. ②AI生成模式
- `app/appconfig.py`
- 增加兼容字段 `ai.generate_mode`,取值:
- `title`
- `cover`
- `title_cover`
- 兼容旧字段 `ai.generate_cover`:
- `false` → `generate_mode=title`
- `true` → `generate_mode=title_cover`
- 保存设置时可继续写回 `generate_cover` 兼容值,但 GUI 主逻辑以 `generate_mode` 为准。
- `app/ai.py`
- `is_generatable_task()`、`generation_component_totals()`、`generate_batch()` 支持三种生成模式。
- `title`:只补缺失标题,不调用生图。
- `cover`:只补缺失封面;需要当前任务已有 `new_title`,否则该任务不进入本轮,并在 GUI 给出可理解提示。
- `title_cover`:缺标题先生成标题,再生成封面;已有标题只补封面,已有封面只补标题或跳过。
- `app/gui/tabs/generate.py`
- 把「生成封面图片(成本较高)」checkbox 改成下拉框,例如 label「生成内容」。
- 下拉选项:
- `只生成标题`
- `只生成封面`
- `生成标题和封面`
- 开始生成时按选项筛选任务和计算标题/封面进度。
- 只生成封面但当前筛选任务都缺少新标题时,中止并中文提示:`当前筛选结果没有可生成封面的任务,请先生成标题。`
- 日志开头写明本轮生成内容,例如:`本轮生成内容:只生成封面`。
### 2. ③更新蝦皮模式
- `app/appconfig.py`
- 增加兼容字段 `shopee_update.update_mode`,取值:
- `title`
- `cover`
- `title_cover`
- 兼容旧字段 `shopee_update.allow_cover_update`:
- `false` → `update_mode=title`
- `true` → 默认 `update_mode=title_cover`,或保留用户当前选择。
- `allow_real_submit` 仍保留在⑤设置里,继续作为真实提交总开关。
- `app/gui/tabs/settings.py`
- 移除普通设置页里的「允许更新封面」用户控件。
- 保存设置时保留旧字段兼容,不破坏已有配置文件。
- `app/gui/tabs/apply.py`
- 在③更新蝦皮左下角增加「更新内容」下拉框。
- 下拉选项:
- `只更新标题`
- `只更新封面`
- `更新标题和封面`
- 原「检查本轮更新」「开始更新」「停止」等按钮向右挪,避免控件拥挤。
- 选择包含封面的模式时,确认弹窗中明确提示:`本轮将更新线上封面`。
- 选择「只更新标题」时,不要求 `new_cover_path`,也不触发封面更新。
- 选择「只更新封面」时,不要求标题改动,但必须有 `new_cover_path`。
- 选择「更新标题和封面」时,必须同时有 `new_title` 和 `new_cover_path`。
### 3. 开始更新前置校验
点击③「开始更新」后,在账号预检和 CDP 打开商品页之前,先按当前更新模式校验当前筛选结果:
- `只更新标题`:缺 `new_title` 的任务阻断。
- `只更新封面`:缺 `new_cover_path` 的任务阻断。
- `更新标题和封面`:缺任一内容的任务阻断。
阻断时不启动 ApplyWorker、不打开 Chrome tab、不改 DB 状态,弹中文提示,例如:
```text
当前筛选结果中有 3 条缺少新封面,不能执行“只更新封面”。
请先回到②AI生成选择“只生成封面”或“生成标题和封面”。
示例商品ID:25120403046、26887160467、28431952912
```
商品 ID 最多展示 5 个,避免弹窗过长。
「检查本轮更新」也应按当前更新模式展示缺失汇总,但检查模式可以只报告、不真实执行。
## 验收要点
- ②AI生成页不再显示「生成封面图片(成本较高)」checkbox,改为「生成内容」下拉。
- ②选择 `只生成标题` 时不调用生图、不要求旧封面/封面提示词。
- ②选择 `只生成封面` 时只补封面;缺新标题的任务不进入本轮,并给中文提示。
- ②选择 `生成标题和封面` 时保持原图文生成闭环,仍支持增量补缺。
- ⑤设置页普通 UI 不再显示「允许更新封面」checkbox。
- ③更新蝦皮左下角新增「更新内容」下拉,按钮布局不拥挤。
- ③选择 `只更新标题` 时允许任务无新封面。
- ③选择 `只更新封面` 时缺新封面必须在开始更新前阻断。
- ③选择 `更新标题和封面` 时缺新标题或新封面都必须阻断。
- 阻断发生在打开 Chrome 商品详情页之前,不写失败状态,不启动真实更新。
- 确认弹窗能按更新模式展示本轮将更新标题/封面/图文。
- 保留敏感和高风险边界:仍需要⑤ `allow_real_submit=true` 和③最终确认弹窗。
- 验证命令:
- `py -3.10 -m unittest tests.test_gui`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`
- `git diff --check`
## 边界(不改什么)
- 不改 AI/cmhub HTTP 协议、并发、重试、下载保存逻辑。
- 不改 DB schema,继续使用 `new_title` / `new_cover_path` 判断内容是否就绪。
- 不改 Excel 导入/回写格式。
- 不改 CDP/Shopee 页面操作细节;只在进入真实更新前增加本地前置校验。
- 不增加逐条人工审核流程。
## 执行记录
- 2026-07-09 完成。
- 文档:同步 `docs/04-architecture.md`、`docs/02-requirements.md`、`docs/api.md`、`docs/routes.md`、`docs/current-state.md`,明确②「生成内容」下拉、③「更新内容」下拉、旧布尔字段兼容和开始更新前缺失内容阻断。
- 配置:`app/appconfig.py` 新增 `ai.generate_mode` / `shopee_update.update_mode` 归一与兼容 helper;旧 `ai.generate_cover`、`shopee_update.allow_cover_update` 继续写回兼容。
- ②AI生成:`app/gui/tabs/generate.py` 将封面 checkbox 改为「生成内容」下拉;`app/ai.py`、`GenerateWorker` 支持只生成标题、只生成封面、生成标题和封面,进度和日志按模式统计。
- ③更新蝦皮:`app/gui/tabs/apply.py` 新增「更新内容」下拉;开始更新/检查前按模式校验缺少的新标题或新封面,阻断时不启动 `ApplyWorker`、不打开 Chrome、不写失败状态;确认弹窗和运行日志展示更新内容。
- ⑤设置:`app/gui/tabs/settings.py` 从普通设置页移除「允许更新封面」用户入口,仅保留旧字段兼容写回;保存设置时尽量读取磁盘最新更新模式,避免覆盖③下拉选择。
- 更新执行:`app/editor.py`、`ApplyWorker` 按 `update_mode` 只传递本轮需要改的标题/封面,避免只更新标题时误换封面、只更新封面时误改标题。
- 测试:补充/更新 `tests/test_appconfig.py`、`tests/test_ai.py`、`tests/test_gui.py`,覆盖模式兼容、只生成封面、②/③下拉持久化、③缺失内容阻断和 worker 传参。
- 验证通过:`python -m compileall app main.py`;`python -m unittest discover -s tests`(313 tests);`git diff --check`。