8.6 KiB
8.6 KiB
id, title, phase, deps, status, created
| id | title | phase | deps | status | created | ||
|---|---|---|---|---|---|---|---|
| T-577 | ②封面画廊「重新生成」改为「重置图片」:删单任务重生链路,复用筛选+批量生成 | 7 |
|
DONE | 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 — 画廊弹窗按钮改造
- 「重新生成」按钮改名「重置图片」,点击后:
- 复用 ② 重置的同一条底层路径(
reset_generated(task_id, reset_title=False, reset_cover=True)),不复制逻辑;保留批量运行判断:批量生成运行中 → 拒绝并提示(同generate.py:1537「AI 生成正在进行,不能重置」口径);归档改名PermissionError→ 中止并弹中文提示(T-566 口径),且 DB 指针不清空。 - 成功后刷新②列表该行(图片状态变「待生成」)+ 重新枚举画廊(规范名已归档改名,列表变化)。
- 左下状态 label 提示:「已重置图片,该行图片状态已改为待生成;请在②选择『只生成封面』或『生成标题和封面』后点击开始生成」。
- 不弹确认弹窗(重置可撤销:归档图仍在画廊,选中→保存即恢复);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 提示已写明要选含封面模式)。
- 旧
regenerateGUI 单测要替换为重置语义单测:普通行重置不弹确认、不启动GenerateWorker;committed/applied 行确认后才重置;批量生成中拒绝重置且 DB 不变;重置后无选中切换/关闭不触发未保存确认;选择归档图保存可恢复指针。 - 验证命令(unittest,不引入 pytest):
py -3.10 -m unittest tests.test_gui tests.test_dbpython -m ruff check app tests main.pypy -3.10 -m compileall app main.pypy -3.10 -m unittest discover -s testsgit 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:通过,无输出。