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

8.4 KiB
Raw Blame History

id, title, phase, deps, status, created
id title phase deps status created
T-641 商品套图最近上下文恢复与执行前确认 7
T-640
TODO 2026-07-16

问题 / 背景

⑥「商品套图」当前存在三类容易造成误操作或内容丢失的体验问题:

  1. 软件重启后不会恢复最后选择的店铺。product_suite.last_settings 目前只保存平台、站点、语言和比例;新建首个任务会回退到账号列表第一项,用户可能在未注意店铺变化时拉取错误商品。
  2. 「商品卖点与要求」只有在已经建立正式项目或临时草稿、取得 project_id 后才会自动保存到 SQLite。用户只选择店铺并输入卖点、尚未添加图片或拉取主图时,内容仍只在内存中,关闭软件后会丢失。
  3. 「拉取蝦皮主图」只有本地已经存在图片时才弹覆盖确认;首次拉取会直接启动。「生成套图」也只有数量超过阈值时才确认。两个操作分别涉及店铺/商品上下文和 cmhub 点数消耗,缺少稳定的执行前复核。

本任务负责最近上下文、未完成草稿和执行前确认;拉取过程中停止、迟到结果隔离及清理本轮图片由 T-642 单独处理。

方案

1. 持久化最后选择的店铺

修改 app/appconfig.py、app/gui/tabs/product_suite.py 和 docs/04-architecture.md:

  • 在 config.json 的 product_suite 下新增 last_account_alias,只保存账号别名,不保存账号密码、Cookie 或登录态。
  • 用户完成有效店铺切换后立即保存该别名;被弹窗取消或因项目绑定规则拒绝的切换不得覆盖最近值。
  • 软件启动后的第一个新任务优先选择 last_account_alias。
  • 同一次运行中新建任务继续优先继承当前任务的店铺,保持现有工作流。
  • 最近账号已删除、被软删除或不在当前账号列表时,回退到第一个可用账号,并将无效值清理或覆盖。
  • 已绑定项目、恢复的临时草稿仍以项目自己的 account_alias 为准,不能被全局最近值覆盖。

2. 将未绑定卖点保存为可恢复草稿

卖点是商品级业务内容,不能作为全局默认文本复制给其他商品。修改 app/gui/tabs/product_suite.py,沿用现有 image_studio_projects.draft_prompt:

  • 当前任务尚无 project_id 时,用户选择了有效店铺且输入的卖点 strip() 后非空,在文本稳定约 800ms 后创建一次临时草稿并保存 draft_prompt。
  • 不因第一个字符立即创建项目;连续输入只创建一个草稿、只在防抖稳定后落库。
  • 切换任务、关闭任务、关闭软件、开始拉取、添加图片或开始生成前,必须同步刷新卖点;如内容非空且尚无项目,创建草稿并保存,避免用户在防抖到期前关闭造成丢失。
  • 空白卖点、无有效店铺或程序化回填不得创建草稿。
  • 自动创建的草稿沿用现有恢复机制,重启后恢复为「临时草稿」任务,并显示原店铺与卖点。
  • 用户把卖点清空且该草稿没有原图、job、selection 或其他业务内容时,关闭任务可继续使用现有空草稿清理语义,避免积累无内容项目。
  • 新建另一个普通任务时卖点默认留空;只有用户明确使用现有“继承当前任务”行为时才允许同一次运行内继承,不能从 config.json 全局复制上一个商品卖点。

3. 拉取蝦皮主图始终显示上下文确认

修改 pull_main_images():

  • 完成店铺、商品 ID、项目绑定和运行状态校验后,无论本地是否已有图片,都必须先弹确认框。
  • 确认内容至少包含:
    • 店铺显示名与别名;
    • 商品 ID;
    • 当前可用商品原图数量;
    • 操作说明「读取蝦皮主图并在后台下载,不会修改蝦皮线上商品」。
  • 当前已有图片时,额外说明蝦皮原图列表会刷新,本地手动添加图片会保留。
  • 按钮使用中文「确认拉取」「取消」;用户取消时不得创建 worker、启动 Chrome、打开商品页或修改数据库。
  • 不显示账号密码、Cookie、完整本地路径或其他敏感信息。

T-642 完成后,运行中的同一按钮会切换为停止入口;本任务只负责空闲状态下的执行前确认。

4. 生成套图始终显示成本与参数确认

修改正常整轮 start_generation() 流程:

  • 在完成模板校验、项目/原图/卖点校验并构造准确 specs 后,创建 job 和启动 worker 前始终弹确认框,不再只对超过数量阈值的任务确认。
  • 确认内容至少包含:
    • 店铺显示名与别名;
    • 商品 ID;临时草稿显示「未绑定商品」;
    • 可用商品原图数量;
    • 「每张上传图分别作为主图生成」是/否;
    • 白底图、场景图、卖点图及自定义分类的生成数量;
    • 图片比例与最终生成总数;
    • 「本次生成会消耗 cmhub 点数」提示。
  • 提示词正文不在确认框完整展示,避免超长文本和敏感业务内容占满弹窗;可显示「商品卖点已填写」或截断摘要。
  • 按钮使用中文「确认生成」「返回修改」。
  • 用户返回修改时不得创建 job、提交 cmhub 或产生点数消耗。
  • T-640 的失败卡片单张「重试」不弹完整套图确认框,继续使用独立重试语义;如后续需要重试扣点确认,应另设简短确认,不复用整轮参数弹窗。

5. 配置与文档兼容

  • product_suite.last_settings 继续只负责平台、站点、语言和比例。
  • last_account_alias 与 last_settings 同级保存,不把商品 ID、卖点、图片路径或密钥写入 config.json。
  • 旧配置缺少 last_account_alias 时保持兼容,不影响启动。
  • 同步更新 docs/04-architecture.md 中 product_suite 配置 schema、最近上下文优先级和草稿保存事实。

验收要点

  • 选择店铺后关闭并重启软件,首个新任务恢复最后有效店铺。
  • 最近店铺已删除时自动回退,不出现无效下拉项或启动异常。
  • 已绑定项目和恢复草稿始终显示项目自己的店铺,不被最近店铺覆盖。
  • 未添加图片、未输入商品 ID 时,仅输入非空卖点并关闭软件,重启后可在恢复的临时草稿中看到原卖点。
  • 空白输入和程序化回填不会创建临时草稿;同一次连续输入只创建一个草稿。
  • 新建无关商品任务不会自动带入上一个商品卖点。
  • 首次点击「拉取蝦皮主图」也会显示店铺、商品 ID 和只读操作确认,取消后不启动 worker/Chrome。
  • 有本地图片时确认框说明刷新范围,并明确本地手动添加图片保留。
  • 正常点击「生成套图」始终显示店铺、商品 ID、原图数、每图主图开关、分类数量、比例、总数和点数提示。
  • 取消生成确认后不创建 image_studio_jobs,不调用 cmhub。
  • 单张失败重试保持 T-640 行为,不弹整轮生成确认。
  • 所有用户可见文本为中文,日志和弹窗不暴露密钥、Cookie、接口路径或完整提示词。

测试

  • tests/test_appconfig.py:
    • last_account_alias 默认值、保存、旧配置兼容与无效类型归一化。
  • tests/test_product_suite_gui.py:
    • 最近店铺跨重启恢复、账号失效回退、项目店铺优先;
    • 无项目卖点防抖创建草稿、关闭前同步保存、空文本不建草稿、新任务不串卖点;
    • 首次/已有图片拉取确认及取消不启动;
    • 正常生成确认内容与取消不建 job;
    • 单张失败重试不走整轮确认。
  • 运行:
py -3.10 -m unittest tests.test_appconfig tests.test_product_suite_gui
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

边界(不改什么)

  • 不把商品卖点作为全局默认值保存到 config.json。
  • 不保存账号密码、Cookie、登录态、商品图片路径或 cmhub Key。
  • 不修改 SQLite schema,继续复用 image_studio_projects.draft_prompt 和现有草稿恢复机制。
  • 不实现拉取中停止、下载取消、迟到结果隔离或清理本轮新增图片,这些属于 T-642。
  • 不修改 cmhub API、图片生成协议、并发上限、计费规则或单张重试行为。
  • 不修改 Shopee/CDP 选择器、商品更新流程、①导入采集、②AI生成、③更新蝦皮、④账号管理或⑤设置。

执行记录

  • 待执行。