From d8472c988aa87f507473febd3819a4429d194099 Mon Sep 17 00:00:00 2001 From: chengma Date: Thu, 9 Jul 2026 18:02:16 +0800 Subject: [PATCH] docs(tasks): add T-577 gallery regen button becomes reset-image (drop single-task regen) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ②封面画廊「重新生成」改「重置图片」:只重置不就地重生,复用既有 「待生成」状态列/筛选/开始生成批量补生成链路(已核端到端存在); 删 T-568 引入的单任务 GenerateWorker 与批量/单任务互斥机械,回到 唯一生成路径。含重置态拦截判定、committed 警示、可撤销语义。 Co-Authored-By: Claude Opus 4.8 --- docs/tasks/T-577.md | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 docs/tasks/T-577.md diff --git a/docs/tasks/T-577.md b/docs/tasks/T-577.md new file mode 100644 index 0000000..dd3c9ec --- /dev/null +++ b/docs/tasks/T-577.md @@ -0,0 +1,76 @@ +--- +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。 + +## 执行记录 + +(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)