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

61 lines
5.0 KiB
Markdown
Raw 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-688
title: 商品套图主图拖拽排序反馈与拉取保护
phase: 7
deps: [T-631, T-658b]
status: DONE
created: 2026-07-22
---
## 问题 / 背景
⑥「商品套图」的商品原图列表已经支持内部拖拽排序,列表第一张也是未勾选「每张上传图分别作为主图生成」时的主图;但是现有界面只以文字顺序隐含该规则,用户不容易确认“拖到第一张”是否已经生效。
另外,拉取蝦皮主图时会有后台 worker 同步、下载和刷新原图列表。此时如果继续进行内部排序,用户的拖拽顺序可能与后台同步刷新竞争,造成排序结果不直观。生成过程中已有整体禁用原图列表的保护,拉取过程中需要更精确地只禁止内部排序,不把整个套图界面锁死。
## 方案
### 1. 明确第一张主图语义
- 保持现有业务规则:未勾选「每张上传图分别作为主图生成」时,第 1 张商品原图是本轮所有任务的主图,其余最多 7 张按当前顺序作为参考图;勾选后第 1 张仍是白底图主图,其他分类按既有逐图主图规则执行。
- 第 1 张真实原图显示清晰、非破坏性的「主图」视觉标识;后续图片显示「参考 N」。不得依赖颜色单独传达主图语义。
- 列表 tooltip 改为明确中文说明:可拖动图片调整顺序,拖到第一位即可设为主图。
- 排序持久化成功后,在状态栏提示“已更新商品原图顺序,第一张图片为主图”;不弹确认框,不修改蝦皮线上商品或已有生成结果。
### 2. 拉取期间只锁定内部排序
- `pull_running()` 为真时,禁止商品原图列表发起或接收内部拖拽排序;界面保留图片查看、状态显示和其他非冲突操作,不得把整个 GUI 灰化。
- 内部排序被锁定时,hover/tooltip 明确提示“正在拉取蝦皮主图,完成后可调整图片顺序”。
- `reorder_originals()` 保留服务层防御:即使通过迟到 signal 或直接调用进入,拉取中也不得写入排序,必须刷新回数据库当前顺序并给出中文状态提示。
- 拉取完成、失败、取消和任务切换后恢复排序能力;生成运行中继续沿用既有禁用原图列表边界。
### 3. 数据与历史边界
- 继续复用 `image_studio.reorder_original_assets()` 的事务排序;不新增数据库字段,不改任务生成快照。
- 已创建的生图 job 继续使用 T-658b 冻结的 `source_asset_id/reference_asset_ids`;之后拖动仅影响下一轮生成,不得修改第一轮历史、重试或恢复的图片输入。
- 不改变本地原图下载、蝦皮主图拉取、cmhub 提交/轮询/下载、计费、终选、导出或①至⑤模块行为。
## 验收要点
- 用户能从第 1 张图片的「主图」标识和 tooltip 明确理解:拖到第一位即可设为主图。
- 将任意原图拖到第一位后,数据库 `source_order` 持久化正确,刷新或重启后顺序不丢失,并显示排序成功状态提示。
- 未勾选逐图主图时,下一轮 job 的主图和参考图顺序与拖拽后的顺序一致;已经存在的 job 快照不变。
- 拉取蝦皮主图期间,内部拖拽排序不可用且不会写入数据库;其他非冲突操作不被整页锁死。拉取结束、失败、取消后可再次排序。
- 生成中保持原有禁用边界,不出现拉取/生成状态切换后排序错误恢复或永久禁用。
- 自动验证:
- `py -3.10 -m unittest tests.test_product_suite tests.test_product_suite_gui`
- `py -3.10 -m unittest tests.test_image_studio`
- `py -3.10 -m unittest discover -s tests`
- `py -3.10 -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `git diff --check`
## 执行记录
- 2026-07-22 完成。
- `ProductOriginalList` 增加独立的内部排序开关;拉取蝦皮主图期间保留外部文件拖入、预览和其它界面操作,但关闭内部拖拽、落点指示和排序信号接收,并以中文 tooltip 提示等待拉取完成。
- 商品原图第1张继续作为业务主图,现以「主图」文字、粗体和语义色标识;每张图片和列表 tooltip 明确说明拖到第一位即可设为主图。事务排序成功后状态栏提示“已更新商品原图顺序,第一张图片为主图”。
- `reorder_originals()` 对生成中和拉取中的迟到排序信号防御性拒绝,并刷新数据库顺序;排序只影响以后新建的 job,既有 `source_asset_id/reference_asset_ids` 快照不变。
- 已同步 `docs/04-architecture.md` 与 `docs/routes.md`,新增/更新 GUI 测试覆盖主图反馈、排序持久化、拉取锁定、直接调用防御与恢复排序。
- 验证通过:`py -3.10 -m unittest tests.test_product_suite tests.test_product_suite_gui`(78项)、`py -3.10 -m unittest tests.test_image_studio`(24项)、`py -3.10 -m unittest discover -s tests`(669项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check`。离屏 PySide6 输出字体目录/插件告警,但无测试失败。