Files

92 lines
8.6 KiB
Markdown
Raw Permalink 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: DONE
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 口径),且 DB 指针不清空。
2. 成功后刷新②列表该行(图片状态变「待生成」)+ 重新枚举画廊(规范名已归档改名,列表变化)。
3. 左下状态 label 提示:「已重置图片,该行图片状态已改为待生成;请在②选择『只生成封面』或『生成标题和封面』后点击开始生成」。
4. **不弹确认弹窗**(重置可撤销:归档图仍在画廊,选中→保存即恢复);committed/applied 行例外,见下。
- **删除单任务重生链路**(T-568 引入的机械):`regenerate_thread`、单任务 `GenerateWorker` 启动、`_set_regenerate_running`/`_update_regenerate_button_state`/`regenerate_running_callback`、②「开始生成」对单任务重生的感知禁用、弹窗 C 确认、完成/失败刷新回调。批量运行检查不能删,只能改为通用重置守卫(例如保留 `bulk_running_checker` 或改名为 `_is_bulk_generate_running()`)。`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`、`docs/02-requirements.md`、`docs/routes.md`、`docs/ui/README.md`、`docs/ui/tab2-ai-generate.svg` 等仍描述「单行重生成 / 弹窗内单任务重新生成」的位置更新为「重置图片 + 批量补生成」。历史任务文件无需回写。
## 验收要点
- 弹窗按钮文案为「重置图片」;点击后该行图片状态列显示「待生成」、画廊重新枚举(原规范名图出现在归档候选中)、label 提示出现。
- 状态筛选「待生成」能筛出被重置的行(生成模式含封面时);「开始生成」只补这些行的封面,已有封面的行不动。
- 重置后无选中状态下 ↑↓/切换/关闭**不触发**三态确认;另选归档图「保存」可恢复指针(撤销路径单测覆盖)。
- 批量生成运行中点「重置图片」→ 拒绝并提示,不改 DB。
- committed/applied 行重置前弹警示,取消则无副作用;普通行不弹确认。
- 归档改名失败(文件占用)→ 中止、DB 指针不清(T-566 口径不回归)。
- 单任务重生机械已删净:`rg "regenerate_thread|_set_regenerate_running|regenerate_running_callback|CoverRegenerateWorker"` 无残留;②「开始生成」不再有单任务重生感知逻辑。批量运行判断可保留,但命名不应再表达「重新生成」。
- 生成模式为「仅标题」时:重置行不出现在「待生成」筛选、图片状态列走未启用分支——界面不误导(label 提示已写明要选含封面模式)。
- 旧 `regenerate` GUI 单测要替换为重置语义单测:普通行重置不弹确认、不启动 `GenerateWorker`;committed/applied 行确认后才重置;批量生成中拒绝重置且 DB 不变;重置后无选中切换/关闭不触发未保存确认;选择归档图保存可恢复指针。
- 验证命令(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。
## 执行记录
- 2026-07-09:已完成。
- 代码:
- `app/gui/tabs/generate.py`:封面画廊底部「重新生成」改为「重置图片」;点击后只调用 `db.reset_generated(task_id, reset_title=False, reset_cover=True)` 清空当前任务封面指针并重新枚举候选图,不再启动单任务 `GenerateWorker`。
- 删除弹窗单任务重生 worker、`CoverRegenerateWorker`、重生运行回调、②主界面对“画廊重生中”的互斥逻辑;保留批量生成运行判断,批量生成中拒绝「重置图片」。
- committed/applied 行重置前增加线上风险确认;普通行免确认。重置后无选中、保存置灰,切换/关闭不触发未保存确认;归档图仍可选中保存恢复指针。
- `tests/test_gui.py`:旧 `regenerate` 单测替换为重置语义单测,覆盖普通重置、已提交线上确认/取消、归档失败不清 DB、批量生成中拒绝、归档图恢复。
- 文档:
- 更新 `docs/04-architecture.md`、`docs/02-requirements.md`、`docs/routes.md`、`docs/ui/README.md`、`docs/ui/tab2-ai-generate.svg`,把“单行重生成”改为“重置图片 + 批量补生成”。
- 验证:
- `py -3.10 -m unittest tests.test_gui.GuiTests.test_cover_gallery_reset_image_clears_pointer_without_worker_or_confirmation ... test_cover_gallery_reset_image_disabled_while_bulk_generation_runs`:通过,6 tests。
- `py -3.10 -m unittest tests.test_gui tests.test_db`:通过,153 tests。
- `python -m ruff check app tests main.py`:通过。
- `py -3.10 -m compileall app main.py`:通过。
- `py -3.10 -m unittest discover -s tests`:通过,312 tests。
- `git diff --check`:通过,无输出。