T-577 封面画廊重置图片

This commit is contained in:
chengma
2026-07-09 18:15:14 +08:00
parent d8472c988a
commit 90a054a14d
8 changed files with 135 additions and 287 deletions
+23 -8
View File
@@ -3,7 +3,7 @@ id: T-577
title: ②封面画廊「重新生成」改为「重置图片」:删单任务重生链路,复用筛选+批量生成
phase: 7
deps: [T-566, T-568]
status: TODO
status: DONE
created: 2026-07-09
---
@@ -19,18 +19,18 @@ T-568 已实现弹窗内「重新生成」:确认弹窗 → 重置封面 →
- 筛选:状态下拉已有「待生成」(`generate.py:834`,`to_generate` → `ai.is_generatable_task`);
- 批量生成:`start_generate` 作用于当前筛选结果、只生成缺失内容(`generate.py:1477`)。
收益:删掉单任务重生这条第二生成路径及其互斥机械,系统回到**唯一生成路径**(批量),双 worker 抢 DB/并发池的风险类别永久消失;N 次「确认→串行单图重生」变一次「开始生成」(并发 5、一次点数确认)。重置可撤销(旧图归档在画廊里,选中再「保存」即恢复指针),故**不需要重确认弹窗**(T-568 的弹窗 C 一并删除)。
收益:删掉单任务重生这条第二生成路径及其互斥机械,系统回到**唯一生成路径**(批量),双 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 口径)。
1. 复用 ② 重置的同一条底层路径(`reset_generated(task_id, reset_title=False, reset_cover=True)`),**不复制逻辑**;保留批量运行判断:批量生成运行中 → 拒绝并提示(同 `generate.py:1537`「AI 生成正在进行,不能重置」口径);归档改名 `PermissionError` → 中止并弹中文提示(T-566 口径),且 DB 指针不清空。
2. 成功后刷新②列表该行(图片状态变「待生成」)+ 重新枚举画廊(规范名已归档改名,列表变化)。
3. 左下状态 label 提示:「已重置图片,该行状态已改为待生成;请在②选『仅封面/标题和封面』生成模式后点开始生成」。
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-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 拦截误触发)
@@ -44,7 +44,7 @@ T-568 已实现弹窗内「重新生成」:确认弹窗 → 重置封面 →
### 文档同步
- T-568 保持 DONE(历史),本任务在其之上改造;`docs/04-architecture.md` / 相关 GUI 文档里「弹窗内单任务重新生成」的表述更新为「重置图片 + 批量补生成」。
- T-568 保持 DONE(历史),本任务在其之上改造;`docs/04-architecture.md`、`docs/02-requirements.md`、`docs/routes.md`、`docs/ui/README.md`、`docs/ui/tab2-ai-generate.svg` 等仍描述「单行重生成 / 弹窗内单任务重新生成」的位置更新为「重置图片 + 批量补生成」。历史任务文件无需回写。
## 验收要点
@@ -54,8 +54,9 @@ T-568 已实现弹窗内「重新生成」:确认弹窗 → 重置封面 →
- 批量生成运行中点「重置图片」→ 拒绝并提示,不改 DB。
- committed/applied 行重置前弹警示,取消则无副作用;普通行不弹确认。
- 归档改名失败(文件占用)→ 中止、DB 指针不清(T-566 口径不回归)。
- 单任务重生机械已删净:`rg "regenerate_thread|_set_regenerate_running|_bulk_generate_running"` 无残留;②「开始生成」不再有单任务重生感知逻辑。
- 单任务重生机械已删净:`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`
@@ -73,4 +74,18 @@ T-568 已实现弹窗内「重新生成」:确认弹窗 → 重置封面 →
## 执行记录
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)
- 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`:通过,无输出。