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

8.9 KiB
Raw Blame History

id, title, phase, deps, status, created
id title phase deps status created
T-606 AI工场项目入口、商品列表与安全删除优化 7
T-605
DONE 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 运行时按钮禁用。

  • 点击后显示中文确认框,明确项目名称和边界:

    确定从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() 可恢复同一项目。

验证命令:

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