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

122 lines
8.9 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-606
title: AI工场项目入口、商品列表与安全删除优化
phase: 7
deps: [T-605]
status: DONE
created: 2026-07-11
---
## 问题 / 背景
⑥AI工场顶部同时存在「打开商品项目」和「拉取蝦皮主图」。对运营用户而言,前者抽象、后者才是实际开始处理商品的动作;现有「商品项目」列表还暴露了重复的「项目」字段。
此外,数据层已具备 `soft_delete_project()`,但 GUI 没有删除入口。若直接补一个删除按钮而不说明边界,用户可能误以为会删除蝦皮线上商品或本地图片;若项目仍有 cmhub 已提交/生成中的远端任务,直接隐藏项目还会造成任务仍可能继续扣点、但用户无法在列表中继续查询的风险。
本任务目标:**收敛 AI工场项目入口为“选择店铺和商品ID后拉取主图”,把左侧改成易扫读的商品列表,并提供不影响蝦皮商品、本地图片和远端未完成任务的安全项目删除。**
## 方案
### 1. 顶部操作条收敛项目入口
修改 `app/gui/tabs/image_studio.py`:
- 去掉可见的「打开商品项目」按钮及其相关界面文案;不再把“创建/打开项目”作为独立用户步骤。
- 顶部继续保留账号/店铺选择和商品ID输入。点击「拉取蝦皮主图」时沿用当前已验证行为:按当前输入的账号和商品ID创建或恢复 AI工场项目,再读取蝦皮主图。
- 当前项目标题显示为「店铺名 · 商品ID」:优先展示账号管理中的店铺名,缺失时回退账号别名;账号别名可放 tooltip,不占主要视觉空间。
- 将「拉取蝦皮主图」移动到当前项目标题右侧;「打开项目文件夹」「删除项目」作为右侧连续操作组。
- 未选择项目时,中文空状态改为“选择店铺并输入商品ID后,点击「拉取蝦皮主图」开始”,不得再提示“打开商品项目”。
- 删除旧入口后,运行期间禁用/恢复逻辑同步移除对 `open_project_button` 的依赖;项目列表切换、拉图、文件夹、生成、继续查询、导出等现有能力不回归。
### 2. 商品列表去除技术化重复字段
- 左侧区域标题由「商品项目」改为「商品列表」。
- 列表去掉「项目」列,改为店铺名、商品ID、更新时间三列;每行仍以 `project.id` 作为内部选择数据,不把内部 ID 展示给用户。
- 选择行后,继续同步顶部账号、商品ID、当前项目标题、提示词草稿、图片资产和终选数据。
- 调整列宽和行高,确保 1280×820 及较窄窗口下标题不遮挡、商品ID完整可见。
### 3. 安全软删除当前选定项目
- 新增红色语义的「删除项目」按钮;无当前选定项目、后台 worker 运行时按钮禁用。
- 点击后显示中文确认框,明确项目名称和边界:
```text
确定从AI工场商品列表删除“店铺名 · 商品ID”吗?
不会删除蝦皮商品,也不会删除本地图片。再次拉取同一商品会恢复原项目记录。
```
- 用户确认后复用 `app.image_studio.soft_delete_project()`;只写 `deleted_at/deleted_reason`,不物理删除图片目录、不删 assets/jobs/selections、不动蝦皮数据。
- 删除前查询该项目是否存在 `pending`、`submitted`、`running` 的图片任务。存在时禁止删除并给中文提示:先等待任务完成、停止本轮或继续查询,不允许把仍可能在远端执行/扣点的任务静默隐藏。
- 删除当前项目后显式清空 `current_project`、图片资产、源图和终选 UI;若列表还有其他项目,选择排序后的第一条;若没有则显示未选择商品空状态,并禁用打开文件夹/删除项目。不得依赖 `refresh_projects()` 对已软删除项目的隐式选择,避免残留过期项目引用。
- 重新拉取同一账号和商品ID时,保留既有 `create_or_get_project()` 恢复语义:恢复同一项目及其历史资产/终选,而不是新建重复记录。
### 4. 用户可见文案与测试
- 所有新增/改动 UI 文案使用中文和「蝦皮」。
- 删除失败、读取项目失败等底层错误继续走现有诊断脱敏,外围附带中文操作语境。
- 更新 GUI 单元测试和 `app/image_studio.py` 纯逻辑测试,覆盖顶部入口、三列商品列表、删除确认、软删除、恢复以及未完成远端任务拦截。
## 验收要点
- ⑥AI工场不再显示「打开商品项目」按钮;选择店铺、输入商品ID并点击「拉取蝦皮主图」可创建/恢复并打开正确项目。
- 「拉取蝦皮主图」位于当前「店铺名 · 商品ID」标题右侧;文件夹和删除项目按钮位于右侧操作组。
- 左侧标题为「商品列表」,列表不再显示「项目」列,仍可正确切换不同店铺/商品的项目。
- 点击「删除项目」后,确认框清楚说明不会删除蝦皮商品和本地图片,并说明同一商品再次拉取会恢复原项目。
- 取消确认不改变列表和当前项目;确认删除后,项目从默认列表消失,当前 UI 不残留已删除项目的数据。
- 存在 `pending/submitted/running` 远端任务时,删除被阻止,项目仍可继续查询;不静默丢失可能扣点的任务。
- 删除项目不改 DB schema、不物理删除目录;重新拉取同一账号/商品ID恢复原项目历史。
- 拉图、原图下载、生成、停止、继续查询、终选拖拽和导出不回归;不改 CDP 选择器、Chrome 启动/登录规则或 cmhub 请求协议。
## 测试要求
更新或新增:
- `tests/test_gui.py`
- 覆盖不出现「打开商品项目」、顶部操作条顺序和「商品列表」/三列标题。
- 覆盖拉取入口使用当前账号和商品ID。
- 覆盖删除取消、确认后的当前项目清理/切换、无项目时按钮状态。
- 覆盖存在未完成任务时不调用软删除并显示中文阻断提示。
- `tests/test_image_studio.py`
- 覆盖软删除不删除项目关联历史,默认列表隐藏,`create_or_get_project()` 可恢复同一项目。
验证命令:
```bash
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
```
## 边界(不改什么)
- 不新增永久删除、回收站页面或本地图片清理功能。
- 不改 `image_studio_projects` schema、图片目录布局及既有软删除恢复语义。
- 不取消远端 cmhub 任务;本任务只在本地删除前阻止存在未完成任务的项目。
- 不改 `app/editor.py`、CDP 读取蝦皮主图、商品详情页打开/关闭逻辑。
- 不改 cmhub 提交、轮询、下载、计费或 BYOK 逻辑。
- 不改①至⑤模块,不新增本地图片导入入口。
## 执行记录
- 2026-07-11:已完成。
- 代码:
- `app/gui/tabs/image_studio.py`:移除可见的「打开商品项目」入口;顶部改为店铺/商品ID输入、当前「店铺名 · 商品ID」、紧邻的「拉取蝦皮主图」以及「打开项目文件夹」「删除项目」操作组。
- `app/gui/tabs/image_studio.py`:左侧改为「商品列表」,展示店铺、商品ID、更新时间三列;当前项目标题优先显示店铺名,账号别名仅作为 tooltip。
- `app/gui/tabs/image_studio.py`:新增「删除项目」确认和软删除入口,明确不删除蝦皮商品或本地图片;删除前拦截 `pending/submitted/running` 任务,删除后显式清理当前项目 UI 并切换到剩余项目或空状态。
- `app/gui/tabs/image_studio.py`:统一未选择项目时的中文提示,移除旧按钮依赖,并让项目文件夹/删除按钮随当前项目和后台运行状态正确启用或禁用。
- 测试:
- `tests/test_gui.py`:更新 AI工场构建测试,覆盖去除旧入口、三列商品列表、顶部中文空状态和项目操作按钮状态。
- `tests/test_gui.py`:新增确认取消/确认软删除后切换项目测试,以及未完成图片任务阻止删除测试。
- 验证:
- 主工作区定向验证通过:
- `py -3.10 -m unittest tests.test_gui.GuiTests.test_image_studio_tab_builds_project_pool_and_template_controls tests.test_gui.GuiTests.test_image_studio_deletes_selected_project_only_after_safe_confirmation tests.test_gui.GuiTests.test_image_studio_blocks_deletion_with_active_remote_job tests.test_gui.GuiTests.test_image_studio_pull_main_images_uses_current_item_input tests.test_gui.GuiTests.test_image_studio_worker_thread_is_kept_until_thread_finished`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `git diff --check -- app/gui/tabs/image_studio.py tests/test_gui.py docs/tasks/T-606.md`
- 主工作区存在未提交默认提示词文件改动;为隔离无关改动,在临时干净 worktree `D:\chengma\cmshopee-t606-verify` 应用本任务 diff 后通过:
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`(380 tests)
- `git diff --check`