Files
cmshoppe/docs/tasks/T-569.md
T

86 lines
5.0 KiB
Markdown
Raw Normal View History

---
id: T-569
title: ②封面画廊上下条切换与未保存选择拦截
phase: 7
deps: [T-567]
2026-07-09 12:19:29 +08:00
status: DONE
created: 2026-07-09
---
## 问题 / 背景
T-567 的封面画廊只处理当前单条任务。运营批量检查时需要在弹窗内连续查看上一条/下一条商品,而不是关闭弹窗后回到列表再双击。切换记录时,如果当前画廊已经勾选了另一张候选但尚未保存,必须避免静默丢失选择。
## 方案(改哪个文件、改成什么)
### 上一条/下一条按钮
- 在 T-567 封面画廊弹窗底部增加「上一条」「下一条」。
- 目标任务来自②当前表格模型的相邻可见行,必须尊重当前筛选结果和排序。
- 第一条时「上一条」置灰;最后一条时「下一条」置灰。
- 切换记录时只刷新弹窗内容区和内部当前 task,不重建整个窗口;窗口大小和位置保持不变。
### 键盘切换
- 支持 `↑` / `↓` 键切换上一条/下一条,和按钮走同一个切换函数。
- 画廊内 `QRadioButton` 设置 `ClickFocus` 或 `NoFocus`,避免方向键在 radio 组内改变候选选择而不是切换记录。
- 输入框/按钮等获得焦点时如不适合消费方向键,应保持 Qt 默认行为;不为键盘切换破坏可访问性。
### 未保存选择拦截
- 判断条件:当前 radio 选中路径 != DB 当前 `task.new_cover_path`。
- 在按钮切换、方向键切换、关闭弹窗前都必须进入同一套拦截流程。
- 弹三态确认框,按钮必须是中文:
- 「保存」:调用 `db.update_generated_cover()`;如任务已提交线上,先弹 T-567 同款“本地换封面不会回滚蝦皮,重复更新会再次提交线上”确认;保存成功后继续切换/关闭。
- 「不保存」:丢弃当前勾选,继续切换/关闭。
- 「取消」:留在当前任务,不切换、不关闭。
- 保存失败时保留当前任务和弹窗,显示中文错误。
### 与 T-568 的关系
- 如果 T-568 已完成且当前任务正在单任务重生:
- 可允许切换到其它任务,但切回时必须刷新最新 DB/候选;
- 当前任务运行中时画廊显示“生成中”状态,不显示旧 `new_cover_path` 为当前有效图误导用户。
- 如果 T-568 尚未完成,本任务只需保证 T-567 基础画廊切换逻辑正确。
## 验收要点
- 上一条/下一条按钮按当前②可见列表相邻行切换;边界按钮置灰。
- `↑` / `↓` 与按钮共用切换逻辑;方向键不会改变 radio 选中。
- 切换记录不改变弹窗尺寸和屏幕位置。
- 当前有未保存选择时,按钮切换、键盘切换、关闭弹窗都会弹中文三态确认。
- 「保存 / 不保存 / 取消」三种路径行为正确;保存失败不切换。
- 已提交线上任务保存前仍弹二次警示。
- 验证命令:
- `py -3.10 -m unittest tests.test_gui`
- `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 数据层契约。
- 不改 T-568 单任务重新生成逻辑。
- 不改 cmhub/AI 请求、DB schema、Excel、③更新、CDP/Shopee。
## 执行记录
2026-07-09 12:19:29 +08:00
- 2026-07-09 完成 T-569。
- 修改 `app/gui/tabs/generate.py`:
- ②封面画廊新增「上一条」「下一条」按钮,目标任务来自打开画廊时②当前可见表格任务列表,按相邻行切换,首尾边界按钮自动置灰。
- 切换任务时只刷新弹窗内部任务、旧封面和候选画廊内容,不重建整个窗口,窗口尺寸和位置保持不变;切换时会重新读取 DB 最新任务和候选文件。
- 支持 `↑` / `↓` 键走同一套上一条/下一条切换逻辑;候选 `QRadioButton` 改为 `ClickFocus`,避免方向键在 radio 组内改候选。
- 增加统一未保存选择拦截:按钮切换、方向键切换、取消/关闭弹窗前,如果当前选中候选不同于当前 DB 封面指针,会弹中文三态确认「保存 / 不保存 / 取消」。保存路径复用 `db.update_generated_cover()`,已提交线上任务仍先弹“本地换封面不会回滚蝦皮,重复更新会再次提交线上”确认;保存失败保留当前任务。
- 与 T-568 兼容:单任务封面重生运行中切换回该任务时显示“封面重新生成中”,完成/失败后继续刷新 DB 和候选列表。
- 修改 `tests/test_gui.py`:
- 覆盖上一条/下一条按当前可见列表切换、边界按钮状态、切换不改变窗口尺寸/位置。
- 覆盖 `↑`/`↓` 键切换任务且不改变候选 radio 选择。
- 覆盖未保存选择在切换和关闭时的「保存 / 不保存 / 取消」三种路径,以及已提交任务保存前的二次确认。
- 验证通过:
- `py -3.10 -m unittest tests.test_gui`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`(302 tests;PySide6 字体目录警告不影响结果)
- `git diff --check`