--- id: T-679c title: 商品套图多来源恢复、重试与历史展示 phase: 7 deps: [T-679a, T-679b] status: DONE created: 2026-07-20 --- # T-679c 商品套图多来源恢复、重试与历史展示 ## 问题 / 背景 **发布门禁:T-679a、T-679b、T-679c 与集成验收 T-679 未全部完成前不得发布。** 本任务承载 direct 重试的重复计费二次确认,而 T-679 负责跨来源回归;缺任一项都可能让用户在无提示下重复付费或错误恢复任务。 默认网关异步任务可凭 `task_id` 继续查询;自定义网关同步请求无法在程序中断后确认远端状态。两类 job 在同一项目中并存时,错误的“恢复”或自动重试会造成重复计费、错误轮询或用户误判结果。 ## 方案 - 「继续查询已提交图片」仅列出并执行 `generation_source=cmhub`、`provider=cmhub` 且存在 `task_id` 的 job;无 task ID 的 direct job 永不出现在该入口。 - direct 失败卡片只提供“重新生成”,点击后必须再次经过 T-679b 的确认流程,并明确提示“服务商可能对上次未确认请求已计费,本次可能再次收费”。不得后台自动重试或直接复用旧 job。 - 项目载入、历史弹窗和结果卡片以中文显示来源“默认网关 / 自定义网关”;来源是历史事实,切换⑤设置后不得改写。 - 运行中的 direct job 因程序中断被标失败后,历史中保留失败记录和可手动重试入口;不得清除或伪装成已取消。 - 默认网关历史、导出、删除撤销和继续查询维持原有行为;混合来源时每个入口严格按来源过滤。 ## 验收要点 - [ ] 继续查询入口只恢复有 cmhub task ID 的默认网关 job;切换来源后仍能恢复旧任务。 - [ ] direct 失败重试必须二次确认,并显示可能重复计费提示;不会自动提交。 - [ ] 历史与结果卡片准确显示中文来源,且不会暴露 URL、模型、密钥或上游原始错误。 - [ ] 同一项目混合来源的历史、导出、删除和重试不会串路。 - [ ] 默认网关的历史生成、导出本轮、继续查询、删除撤销不回归。 ## 测试与文档 - `tests/test_product_suite_gui.py`、`tests/test_image_studio_generation.py`:来源过滤、直连失败二次确认、程序中断记录、混合项目历史和默认任务恢复。 - 更新 `docs/04-architecture.md`、`docs/routes.md`、`docs/ui/` 对应说明。 ## 验证 ```bash py -3.10 -m unittest tests.test_product_suite_gui tests.test_image_studio_generation tests.test_gui py -3.10 -m ruff check app tests main.py py -3.10 -m compileall app main.py git diff --check ``` ## 边界(不改什么) - 不改 T-679a 的直连请求与状态写入规则,不改 T-679b 的新建任务预检和确认内容。 - 不新增自动恢复、自动重试、provider 私有适配或图片理解直连路径。 - 不改 cmhub 协议、Chrome/CDP、Excel 或蝦皮更新。 ## 关联 - T-679a:同步 direct job 状态语义。 - T-679b:生成确认和用户提示。 - T-679:完成本任务后的集成验收。 ## 执行记录 - 已将「来源」和「是否可继续查询」拆为两个判断:恢复入口仍严格要求已保存的 `cmhub/cmhub + task_id`,因此切换到自定义网关后仍可查询旧默认网关任务,而 direct job 永不进入轮询或恢复。 - 结果卡、项目历史图片/轮次和全局历史轮次均显示已保存的中文来源;来源只读 job 的 `generation_source/provider`,切换⑤设置不会改写历史显示。混合来源轮次显示两种来源摘要,不暴露模型、URL 或密钥。 - direct 失败或启动期中断恢复后的卡片允许在当前自定义网关配置合格时手动重新生成;每次先显示完整生成确认,并默认取消且明确提示服务商可能已计费、本次可能再次收费。确认后新建 job,绝不自动补发、复用旧 job 或进入继续查询。默认网关重试、历史、导出、删除撤销和继续查询保持原有语义。 - 新增来源过滤、持久化来源显示、切换设置不改写历史、direct 二次确认和陈旧 direct 失败重试入口的 GUI 回归测试;更新 `docs/04-architecture.md`、`docs/routes.md`、`docs/ui/tab6-suite-recovery-T679c.svg` 与 UI 索引。 - 验证:`py -3.10 -m unittest tests.test_product_suite_gui tests.test_image_studio_generation tests.test_gui`(294 项)、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check` 均通过;完整测试结果见本任务提交前的最终校验。