Files
cmshoppe/docs/tasks/T-577.md
T
chengmaandClaude Opus 4.8 d8472c988a docs(tasks): add T-577 gallery regen button becomes reset-image (drop single-task regen)
②封面画廊「重新生成」改「重置图片」:只重置不就地重生,复用既有
「待生成」状态列/筛选/开始生成批量补生成链路(已核端到端存在);
删 T-568 引入的单任务 GenerateWorker 与批量/单任务互斥机械,回到
唯一生成路径。含重置态拦截判定、committed 警示、可撤销语义。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 18:02:16 +08:00

77 lines
6.3 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-577
title: ②封面画廊「重新生成」改为「重置图片」:删单任务重生链路,复用筛选+批量生成
phase: 7
deps: [T-566, T-568]
status: TODO
created: 2026-07-09
---
## 问题 / 背景
T-568 已实现弹窗内「重新生成」:确认弹窗 → 重置封面 → 单任务 `GenerateWorker` 就地重生,并为此引入批量/单任务互斥守卫(`_bulk_generate_running`/`_set_regenerate_running`/回调/tooltip,`app/gui/tabs/generate.py:613-650` 附近)。运营实际节奏是**审阅→批处理**:↑↓翻看几百条、把差图逐条标记,退出后一把批量重生;弹窗内阻塞等单图重生反而打断翻查。
新方案(已评审定案):弹窗按钮改为**「重置图片」**——只重置、不就地重生。重置后该行图片状态自动变「待生成」,运营翻完全部记录后退出弹窗,在②用状态筛选「待生成」+ 点「开始生成」批量补生成。
**整条后半链路已存在,零新建**(已核):
- 重置底层:②「重置生成结果」按钮同款 `db.reset_generated(reset_title=False, reset_cover=True)`(`generate.py:442`),T-566 归档旧图自动生效;
- 状态显示:无新封面 → 图片状态列「待生成」(`app/gui/models.py:383`);
- 筛选:状态下拉已有「待生成」(`generate.py:834`,`to_generate` → `ai.is_generatable_task`);
- 批量生成:`start_generate` 作用于当前筛选结果、只生成缺失内容(`generate.py:1477`)。
收益:删掉单任务重生这条第二生成路径及其互斥机械,系统回到**唯一生成路径**(批量),双 worker 抢 DB/并发池的风险类别永久消失;N 次「确认→串行单图重生」变一次「开始生成」(并发 5、一次点数确认)。重置可撤销(旧图归档在画廊里,选中再「保存」即恢复指针),故**不需要重确认弹窗**(T-568 的弹窗 C 一并删除)。
## 方案(改哪个文件、改成什么)
### `app/gui/tabs/generate.py` — 画廊弹窗按钮改造
- 「重新生成」按钮改名「重置图片」,点击后:
1. 复用 ② 重置的同一条底层路径(`reset_generated(task_id, reset_title=False, reset_cover=True)`),**不复制逻辑**;继承既有守卫:批量生成运行中 → 拒绝并提示(同 `generate.py:1537`「AI 生成正在进行,不能重置」口径);归档改名 `PermissionError` → 中止并弹中文提示(T-566 口径)。
2. 成功后刷新②列表该行(图片状态变「待生成」)+ 重新枚举画廊(规范名已归档改名,列表变化)。
3. 左下状态 label 提示:「已重置图片,该行状态已改为待生成;请在②选『仅封面/标题和封面』生成模式后点开始生成」。
4. **不弹确认弹窗**(重置可撤销:归档图仍在画廊,选中→保存即恢复);committed/applied 行例外,见下。
- **删除单任务重生链路**(T-568 引入的机械):`regenerate_thread`、单任务 `GenerateWorker` 启动、`_bulk_generate_running`/`_set_regenerate_running`/`_update_regenerate_button_state`/`regenerate_running_callback`、②「开始生成」对单任务重生的感知禁用、弹窗 C 确认、完成/失败刷新回调。`rg regenerate` 核对无残留死代码。
### 重置后弹窗状态语义(防 T-569 拦截误触发)
- 重置后:画廊重新枚举、radio **无选中**、「保存」置灰直到用户另选一张。
- **T-569 未保存拦截**须把「重置后无选中 + DB 指针为空」视为**无待存变更**:↑↓/上一条/下一条/关闭都不弹三态确认。
- 用户重置后仍可选中某张归档图「保存」→ `update_generated_cover` 恢复指针(有意的撤销路径,写进代码注释与单测)。
### committed/applied 行重置
- 重置 → 重生 → 再更新 = 再次提交线上。对 `committed=1` 或 `stage='applied'` 的行,重置前弹既有口径警示(「本地重置不会回滚蝦皮,重新生成并更新会再次提交线上」,参考 `apply.py:334` / 保存路径同款);确认才执行。普通行仍免确认。
### 文档同步
- T-568 保持 DONE(历史),本任务在其之上改造;`docs/04-architecture.md` / 相关 GUI 文档里「弹窗内单任务重新生成」的表述更新为「重置图片 + 批量补生成」。
## 验收要点
- 弹窗按钮文案为「重置图片」;点击后该行图片状态列显示「待生成」、画廊重新枚举(原规范名图出现在归档候选中)、label 提示出现。
- 状态筛选「待生成」能筛出被重置的行(生成模式含封面时);「开始生成」只补这些行的封面,已有封面的行不动。
- 重置后无选中状态下 ↑↓/切换/关闭**不触发**三态确认;另选归档图「保存」可恢复指针(撤销路径单测覆盖)。
- 批量生成运行中点「重置图片」→ 拒绝并提示,不改 DB。
- committed/applied 行重置前弹警示,取消则无副作用;普通行不弹确认。
- 归档改名失败(文件占用)→ 中止、DB 指针不清(T-566 口径不回归)。
- 单任务重生机械已删净:`rg "regenerate_thread|_set_regenerate_running|_bulk_generate_running"` 无残留;②「开始生成」不再有单任务重生感知逻辑。
- 生成模式为「仅标题」时:重置行不出现在「待生成」筛选、图片状态列走未启用分支——界面不误导(label 提示已写明要选含封面模式)。
- 验证命令(unittest,不引入 pytest):
- `py -3.10 -m unittest tests.test_gui tests.test_db`
- `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`
## 边界(不改什么)
- 不改 T-566 数据层契约(归档、`update_generated_cover`、枚举)。
- 不改批量 `GenerateWorker`/`generate_batch`/cmhub 链路、并发计划。
- 不改 ②「重置生成结果」按钮既有行为(弹窗按钮只是其单条封面模式的快捷入口)。
- 不改 T-567 画廊查看/保存、T-569 切换拦截本身(仅按上文调整重置态的拦截判定)。
- 不改 ③更新/Excel/CDP/Shopee。
## 执行记录
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)