fix: stabilize Shopee cover replacement
This commit is contained in:
+84
@@ -812,3 +812,87 @@
|
||||
- 修复:`_wait_post_update()` 改为先判断 `redirected_to_list` 或成功 toast;错误 toast 只记录为 `last_error_state`,观测窗口结束仍没有成功信号时才返回 `POST_UPDATE_ERROR`。
|
||||
- 测试:`tests/test_editor_login.py` 新增 `test_click_update_treats_list_redirect_as_success_even_with_stale_error_toast`,保留 `test_click_update_reports_logistics_validation_after_confirm` 覆盖未跳转时错误仍失败;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(28 tests),`python -m compileall app main.py` 通过,`python -m unittest discover -s tests` 通过(135 tests),`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
- 下一步:用户复跑真实 T-404 链路,确认 GUI 与浏览器成功状态一致。
|
||||
## 【2026-06-30】文档补充 · ③ 更新前账号 Chrome 就绪预检
|
||||
|
||||
- 背景:讨论 ③「开始更新」后如果本轮需要的账号 Chrome 未打开,是否应由程序自动打开。产品判断为:真实更新是线上高风险动作,不应静默启动多个账号浏览器并继续提交。
|
||||
- 决策:③ 点击「开始更新」并通过安全开关/确认后,真实提交前必须检查当前筛选结果涉及的账号 Chrome/CDP/登录态;若任一账号 Chrome 未启动、CDP 端口不可访问、未登录或端口冲突,弹窗列出账号和原因,整体中止本轮更新,不调用 `editor.apply_task()`,不写失败状态,不自动打开 Chrome。
|
||||
- ④ 边界:④「启动登录」只打开对应账号浏览器供人工登录;④「检测登录」与①/③预检只验证当前环境是否可用,不自动登录、不填密码。
|
||||
- 文档:同步 `docs/02-requirements.md`、`docs/routes.md`、`docs/api.md`、`docs/04-architecture.md`、`docs/06-tasks.md`、`docs/current-state.md`。本轮只更新文档,未改代码。
|
||||
## 【2026-06-30】代码补齐 · ③ 账号未就绪时明确中止更新
|
||||
|
||||
- 代码:`app/gui.py` 的 ③ 更新账号未就绪弹窗新增明确文案:本轮更新已中止,不会自动打开账号 Chrome,也不会提交任何商品;① 采集账号未就绪文案单独保持为“本轮采集已中止”,避免把更新语义带到采集模块。
|
||||
- 测试:`tests/test_gui.py` 覆盖 ③ 账号 Chrome 未启动时 `ApplyWorker` 不调用 `accounts.launch_for_login()`、不调用 `editor.apply_task()`、不写任务失败状态;覆盖弹窗包含“本轮更新已中止 / 不会自动打开账号 Chrome / 不会提交任何商品”。同步修正①采集阻断文案断言。
|
||||
- 验证:`python -m py_compile app/gui.py tests/test_gui.py` 通过;`python -m unittest discover -s tests -p "test_gui.py"` 通过(54 tests);`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(135 tests);`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
## 【2026-06-30】文档补充 · 正式使用批量更新与设置页布局
|
||||
|
||||
- 背景:单条真实更新已人工测试通过,正式使用需要支持当前筛选结果无论多少条都能更新到 Shopee,同时降低误筛选风险,并整理⑤设置页视觉密度。
|
||||
- 决策:保留预览能力但不再对用户显示 `dry-run` 技术词,③ 增加「预览本轮更新」按钮;「开始更新」按每批最大更新条数自动分批,确认弹窗显示总数/每批/预计批次;点击停止为协作式停止,当前商品跑到安全边界后不再开始新商品或下一批。
|
||||
- 设置页:⑤ 内容区居中并加大左右留白到当前约 250% 的视觉尺度;模型详情、角色与生成参数、路径与端口、Shopee 更新安全均改为响应式三列布局,短字段一格,URL/API Key/路径等长字段跨列;测试商品 ID 后续移入高级/调试区或弱化展示。
|
||||
- 文档:同步 `docs/02-requirements.md`、`docs/routes.md`、`docs/api.md`、`docs/04-architecture.md`、`docs/06-tasks.md`、`docs/current-state.md`。本轮只更新文档,未改代码。
|
||||
## 【2026-06-30】代码补齐 · T-506 正式使用批量更新体验
|
||||
|
||||
- 代码:③ 更新shopee新增「预览本轮更新」按钮,预览不再依赖⑤里的 dry-run 开关;正式「开始更新」固定走真实更新安全开关和确认弹窗,弹窗展示任务数、每批最大更新条数和预计批次。
|
||||
- 分批:`ApplyWorker` 新增 `batch_size`,真实更新按当前筛选全部可更新记录切批执行;每批写运行日志,summary/progress/run_log options 记录 `batch_size` 和 `batch_count`;点击停止为协作式停止,不再开始下一条或下一批。
|
||||
- 设置页:⑤ 隐藏用户可见 dry-run 开关,保存设置时将 `dry_run` 固定为 `False`;模型详情、角色与生成参数、路径与端口、Shopee 更新安全改为三列布局,内容区居中并加大左右留白。
|
||||
- 测试:更新 `tests/test_gui.py` 覆盖预览按钮、不再按总数阻断、Worker 分批日志、设置页 dry-run 隐藏与保存为 False。
|
||||
- 文档:`docs/00-ai-start-here.md`、`docs/04-architecture.md`、`docs/routes.md` 同步新语义;`docs/06-tasks.md` 将 T-506 标记 DONE,`docs/current-state.md` 更新当前实现快照。
|
||||
- 验证:`python -m py_compile app/gui.py tests/test_gui.py` 通过;`python -m unittest discover -s tests -p "test_gui.py"` 通过(54 tests);`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(135 tests);`git diff --check` 无空白错误(仅 LF/CRLF 提示)。
|
||||
## 【2026-06-30】设置页微调 · 左右留白缩短为约 40%
|
||||
|
||||
- 背景:用户反馈 ⑤ 设置模块两边空白需要缩短为当前约 40%。
|
||||
- 代码:`app/gui.py` 中 SettingsTab 外层 `layout.setContentsMargins(45, 18, 45, 18)` 调整为 `18, 18, 18, 18`,中间内容区 `panel_layout.setContentsMargins(32, 18, 32, 18)` 调整为 `13, 18, 13, 18`;保留居中内容区和三列表单,当前 `panel.setMaximumWidth(1800)` 用于减少宽屏下的左右空白。
|
||||
- 文档:同步 `docs/02-requirements.md`、`docs/routes.md`、`docs/api.md`、`docs/06-tasks.md`、`docs/current-state.md`,将 250% 留白描述改为约 40% / 适度留白。
|
||||
## 【2026-06-30】设置页微调 · 保存成功提示框
|
||||
|
||||
- 背景:⑤ 设置点击「保存设置」成功后原来只写状态栏,用户不容易感知保存结果。
|
||||
- 文档:先同步 `docs/02-requirements.md`、`docs/routes.md`、`docs/api.md`、`docs/current-state.md`,明确保存成功后保留状态栏提示并弹轻量提示框。
|
||||
- 代码:`SettingsTab.save_app_settings()` 在保存、替换配置、回填表单并设置状态栏后,调用 `QMessageBox.information(self, "保存设置", "设置已保存")`。
|
||||
- 测试:更新 `tests/test_gui.py` 的设置保存用例,mock 成功提示框并断言标题/文案,避免模态框阻塞测试。
|
||||
## 【2026-06-30】设置页微调 · 最大并行账号数移到多账号并行后
|
||||
|
||||
- 文档:先同步 `docs/routes.md`、`docs/api.md`、`docs/06-tasks.md`、`docs/current-state.md`,明确 Shopee 更新安全三列布局中「最大并行账号数」必须位于「多账号并行更新」后面同一行。
|
||||
- 代码:`SettingsTab` 的 Shopee 更新安全字段顺序调整为第二行「允许更新封面 / 多账号并行更新 / 最大并行账号数」,「成功后关闭本次新开编辑页」移动到下一行;同时保留 `self.shopee_update_form_layout` 供测试定位。
|
||||
- 测试:`tests/test_gui.py` 新增布局位置断言,确认 `max_parallel_accounts_spin` 与 `parallel_accounts_checkbox` 同行且在其后。
|
||||
## 【2026-06-30】设置页微调 · 并行账号数与并行开关合并同一组件
|
||||
|
||||
- 背景:用户确认「最大并行账号数」不是只放到同一网格行,而是必须紧跟「多账号并行更新」后面,不能显示到下面。
|
||||
- 文档:先同步 `docs/routes.md`、`docs/api.md`、`docs/06-tasks.md`、`docs/current-state.md`,明确「多账号并行更新」与「最大并行账号数」合并为同一个横向组件,最大并行账号数紧跟其后且不换行。
|
||||
- 代码:`SettingsTab` 新增 `parallel_accounts_group`,内部用 `QHBoxLayout` 顺序放置 `parallel_accounts_checkbox`、`max_parallel_accounts_label`、`max_parallel_accounts_spin`;Shopee 更新安全表单支持字段跨 2 个组件位,并把该组合组件放在「允许更新封面」后面。
|
||||
- 测试:更新 `tests/test_gui.py`,断言组合组件与「允许更新封面」同一行,跨 2 个组件位,且内部 widget 顺序为多账号并行开关、最大并行账号数标签、输入框。
|
||||
## 【2026-06-30】文档补充 · T-507 移除普通流程测试商品 ID 限制
|
||||
|
||||
- 背景:正式批量更新时,③「开始更新」当前仍因任务包含非测试商品 ID 阻断,只允许更新 ⑤ 配置的测试商品 ID。这适合开发测试阶段,但不适合正式批量更新真实商品。
|
||||
- 决策:新增 T-507。普通正式更新不再以 `test_item_id` 阻断当前筛选结果;当前筛选结果可包含多个真实商品 ID。`test_item_id` 仅保留为历史/调试兼容字段,后续如需要调试模式再单独启用。
|
||||
- 保留安全闸:允许真实提交线上商品、允许更新封面、每批最大更新条数、开始更新二次确认、账号 Chrome/CDP/登录态预检、多账号并行上限、运行日志和 Excel 回写。
|
||||
- 文档:同步 `docs/02-requirements.md`、`docs/routes.md`、`docs/api.md`、`docs/04-architecture.md`、`docs/06-tasks.md`、`docs/current-state.md`。本轮只更新文档,代码尚未改;下一步代码更新前仍会因非测试商品 ID 阻断。
|
||||
## 【2026-06-30】代码更新 · T-507 移除普通流程测试商品 ID 限制
|
||||
|
||||
- 代码:`ApplyTab._update_safety_error()` 移除 `test_item_id` 非空与商品 ID 比对阻断;普通正式更新只继续检查「允许真实提交线上商品」和「允许更新封面」。
|
||||
- 代码:③「开始更新」确认弹窗不再显示测试商品 ID;当前筛选结果可包含多个真实商品 ID,仍按每批最大更新条数分批执行。
|
||||
- 代码:⑤ 设置页隐藏普通用户可见的测试商品 ID 输入入口,但保留 `test_item_id` 字段加载/保存兼容旧配置和后续调试模式。
|
||||
- 测试:更新 `tests/test_gui.py`,覆盖确认弹窗不含测试商品 ID、非测试商品 ID/空测试商品 ID 不再阻断、设置页测试商品 ID 入口隐藏且配置兼容。
|
||||
- 验证:`python -m py_compile app/gui.py tests/test_gui.py` 通过;`python -m unittest discover -s tests -p "test_gui.py"` 通过(54 tests);`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(135 tests)。
|
||||
## 【2026-06-30】T-404 补丁 · 上传前点击上传块模拟人工路径
|
||||
|
||||
- 现象:商品 26887160467 更新封面时,代码删除第一张图片后直接 `DOM.setFileInputFiles`,Shopee 图片组件长期转圈;同一张约 220KB 图片在浏览器手动上传成功。
|
||||
- 分析:文件大小和格式不是主因;差异在于人工流程会先点击「新增图片」上传块,Shopee 前端可能在点击时初始化上传队列,而旧代码直接给隐藏 input 注入文件,可能导致队列未完整初始化。
|
||||
- 文档:先同步 `docs/04-architecture.md`、`docs/api.md`、`docs/06-tasks.md`、`docs/current-state.md`,将封面上传策略改为“点击上传块 → 短暂等待 → 重新获取 input → `DOM.setFileInputFiles` → 派发 input/change”。
|
||||
- 代码:`app/editor.py` 新增 `JS_CLICK_UPLOAD_TILE` 和 `_click_upload_tile()`;`replace_cover()` 在上传前先点击 `.shopee-image-manager__upload`,等待 1 秒后重新获取 `input[type=file]`,再注入本地图片;失败时返回 `UPLOAD_TILE_NOT_READY` 并带 `upload_click` 诊断。
|
||||
- 测试:`tests/test_editor_login.py` 扩展 `FakeCoverCDP`,新增上传块点击成功和上传块不可点击的回归测试,确认执行 `DOM.setFileInputFiles` 时上传块已先被点击。
|
||||
- 验证:`python -m py_compile app/editor.py tests/test_editor_login.py` 通过;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(30 tests);`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(137 tests)。T-404 仍需真实商品复跑确认。
|
||||
## 【2026-06-30】T-404 补丁 · 返回商品列表后延迟关闭 tab
|
||||
|
||||
- 背景:真实流程为点击页面主「更新」后出现 Shopee 确认弹窗,点击弹窗主按钮「更新」后跳回我的商品列表页;如果此时立即关闭本轮新开的 tab,可能不给页面跳转与状态稳定留时间。
|
||||
- 文档:先同步 `docs/04-architecture.md`、`docs/api.md`、`docs/routes.md`、`docs/06-tasks.md`、`docs/current-state.md`,明确 `close_success_tab=true` 且成功提交、tab 为本轮自动新开时,确认后跳回商品列表页场景关闭前等待 2 秒。
|
||||
- 代码:`app/editor.py` 的 `_close_applied_product()` 在真正调用 `close_tab(target_id, host=...)` 前执行 `time.sleep(2)`;失败任务、复用的用户已有 tab、未开启 `close_success_tab` 的任务不等待关闭。
|
||||
- 测试:更新 `tests/test_editor_login.py`,成功提交并关闭自动新开 tab 的路径断言 `time.sleep(2)`;失败提交路径断言不关闭且不等待。
|
||||
- 验证:`python -m py_compile app/editor.py tests/test_editor_login.py` 通过;`python -m unittest discover -s tests -p "test_editor_login.py"` 通过(30 tests);`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(137 tests)。T-404 仍需真实商品复跑确认。
|
||||
|
||||
## 【2026-06-30】T-404/T-502 补丁 · 8张图也先删第一张 + 图片路径按批次细分
|
||||
|
||||
- 第1点文档:同步 `docs/04-architecture.md`、`docs/api.md`、`docs/routes.md`、`docs/05-coding-rules.md`、`docs/06-tasks.md`、`docs/current-state.md`,明确更新封面统一按“替换第一张”执行,不再只在满 9 张时删除;`有1張重複的圖片` / `重複` / `重复` / `duplicate` 作为封面上传错误立即失败。
|
||||
- 第1点代码:`app/editor.py` 的 `replace_cover()` 改为只要有新封面就先校验 `old_cover_path` 本地备份,再删除当前第一张、等待稳定、点击上传块并上传新图;上传循环优先处理错误 toast,重复图返回 `UPLOAD_DUPLICATE_IMAGE`。`tests/test_editor_login.py` 覆盖 8 张图也删除第一张、重复图片 toast 和旧备份缺失保护。
|
||||
- 第2点文档:同步本地图片目录规则,新采集/新生成图片改为 `images/<batch_id>/<slug>/<task_id>_<item_id>_old/new.jpg`;DB 已存旧路径继续作为权威路径,不迁移、不推断。
|
||||
- 第2点代码:新增 `app/image_paths.py` 统一图片路径 helper;`CollectWorker` 的旧封面目标路径、`ai.generate_batch()` 的新封面目标路径、`editor.collect()` 兜底旧封面路径均接入该规则。历史 `old_cover_path/new_cover_path` 仍按 DB 记录读取。
|
||||
- 测试:新增 `tests/test_image_paths.py`;更新 `tests/test_ai.py`、`tests/test_gui.py`、`tests/test_editor_login.py`。验证通过:`python -m py_compile app/image_paths.py app/ai.py app/gui.py app/editor.py tests/test_image_paths.py tests/test_ai.py tests/test_gui.py tests/test_editor_login.py`;`python -m unittest discover -s tests -p "test_image_paths.py"`(2 tests);`python -m unittest discover -s tests -p "test_ai.py"`(7 tests);`python -m unittest discover -s tests -p "test_gui.py"`(54 tests);`python -m unittest discover -s tests -p "test_editor_login.py"`(32 tests);`python -m compileall app main.py`;`python -m unittest discover -s tests`(141 tests);`git diff --check` 无空白错误,仅 LF/CRLF 提示。
|
||||
- 下一步:用户复跑 T-404 真实商品链路,重点确认 8 张图商品先删第一张、重复图片提示不再拖到超时、新图片上传成功后可提交。
|
||||
Reference in New Issue
Block a user