Files
cmshoppe/docs/reviews/2026-06-27-T201-T205-acceptance.md
T
chengma 5892de5303 test: 修正Phase2验收口径并补预检断言
收录Claude对T-201到T-205的验收报告,并把报告中的GUI用例数量、T-205最终方案和T-203未登录语义改为当前口径。

同步任务文档、API文档、当前状态和progress,明确匹配账号未登录由T-205预检blocked拦截,不进入逐条采集、不写skipped或failed;别名未匹配仍由T-203逐条mark_skipped。

补强test_gui中未登录预检分支断言,确认被拦截任务保持imported/pending且last_error为空。
2026-06-27 15:28:33 +08:00

52 lines
4.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.
# 验收报告 · T-201 ~ T-205(含 T-204b)· Phase 2 导入采集
- 日期:2026-06-27
- 范围:Codex 完成的 Phase 2——T-201 `app/excel.py` 导入、T-202/T-202b Tab① 列表与汇总栏、T-203 采集旧数据、T-204 回写原 Excel、T-204b 采集后自动回写、T-205 账号就绪引导保护
- 评审方式:编译检查 + 单元测试 + 逐模块源码阅读 + 对照 `docs/06-tasks.md` 验收要点
- 结论:**通过,质量偏上。T-205 采用“预检拦截 + 弹窗说明 + 自动跳④”的实现,已与当前任务文档对齐。**
## 一、验证方法与结果
```
python3 -m unittest discover -s tests -p "test_excel.py" # Ran 7 tests, OK(本机实跑,已临时装 openpyxl)
python3 -m compileall app main.py # OK
```
- 本评审在 WSL 沙箱进行:`python3` 缺 PySide6/openpyxl。临时安装 openpyxl 后 **excel 测试 7/7 本机实跑通过**。
- GUI/worker 测试(`tests/test_gui.py` 18 个用例、`tests/test_workers.py`)因本机无 PySide6 只能读源码 + 测试清单核对;其“绿”以 Codex 在 Windows(`python` = PySide6 6.5.3)的运行为准。
## 二、逐任务核对
| 任务 | 结论 | 关键核对 |
| --- | --- | --- |
| T-201 `excel.py` 导入 | ✅ | 多文件解析;记 `source_file_abs/source_sheet/source_row/row_key`;缺必需列→拒整文件记 `file_errors`;脏行(别名空/商品id空/非数字)逐行跳过计 `invalid`+`row_errors`;写 batches/tasks;`row_key` 唯一性由 DB `IntegrityError` 兜底;表头别名归一化(中英/空格/下划线)到位 |
| T-202 Tab① 列表+导入+匹配标记 | ✅ | `QTableView`+`TaskTableModel`;未匹配别名阶段显示「略过」并有 tooltip;导入即刷新 |
| T-202b 导入汇总栏 | ✅ | 文件数/行数/有效/无效/匹配/未匹配;「未匹配(n)」可点击筛出,「全部」复位 |
| T-203 采集旧数据 | ✅ | `CollectWorker` 走后台线程;逐条 `set_collected`;旧封面落 `images/<slug>/<item_id>_old.jpg`;未匹配账号→`mark_skipped` 记原因;T-205 后匹配账号未登录会先被预检 `blocked=True` 拦截,不进入逐条采集、不写 skipped/failed;`stop` 协作式取消 |
| T-204 回写原 Excel | ✅ | `write_back` 写回原文件;锁检测(winerror 5/32/33 + errno 13/16 + PermissionError)→明确提示;`export_copy` 另存副本退路。**本机实跑验证通过** |
| T-204b 采集后自动回写 | ✅ | 采集成功>0 自动触发回写;锁占用提示转「手动重试/另存」,SQLite 保留结果。合理增项 |
## 三、T-205 实现方式确认
**T-205 的实现方式已确认接受。**
- 当前文档口径:无账号、Chrome 未启动、未登录时,允许用“执行按钮禁用或采集前汇总提示”的方式阻断;被阻断时提示去④账号管理处理。
- 当前实现:采集按钮不静态置灰,点击后由 `CollectWorker._preflight` 预检。无账号 / Chrome 未起 / 未登录时返回 `blocked=True`,弹窗说明具体账号原因,并自动跳到 ④(`open_accounts_callback` → `MainWindow.open_accounts_tab`)。
- 最终语义:匹配账号未登录属于 T-205 预检阻断,不进入 T-203 的逐条采集分支,因此不写 skipped/failed;只有别名未匹配等逐条可判定问题继续按 T-203 逻辑 `mark_skipped`。
评审判断:**接受该实现,作为最终方案记录**。静态置灰需要 UI 线程提前轮询每个账号的 CDP 登录态,成本高且容易变慢;点击时预检能给出“为什么不能跑”的具体原因,并自动导航到 ④,体验和可维护性都更合适。
## 四、小问题(不影响验收)
- `_on_collect_row_updated` 每条 row_updated 都整表 `refresh_tasks()`(重查 DB + 重建 model)。大批量时偏向 O(n²) 次 DB 读,属性能小瑕,非正确性问题;可改单行局部更新。
- 本机无法跑 GUI 测试(WSL 无 PySide6);18 个 GUI 用例(含 4 个预检/引导分支:无账号 / Chrome 未起 / 未登录 / 弹窗跳转④)的通过以 Codex 在 Windows 的运行为准——环境限制,非代码问题。
## 五、待办 / 边界
- ⚠️ `CollectWorker` / `editor.collect` 对真实 Shopee 仍是 mock 覆盖,未真机冒烟;T-203“采集旧标题+旧封面下载”的真连 CDP 路径尚未跑过一次。
- **建议**:进 Phase 3(AI 生成)前,账号④走通(启动→人工登录→检测)后,对 Tab① 做一次真机采集冒烟(导入小 Excel → 采集 1~2 条 → 看 `images/<slug>/` 出图 + 回写原 Excel),确认 CDP 链路在新代码下无回归。
## 六、总评
合格偏上的工程交付:excel 解析/回写健壮且本机实测通过,worker 线程纪律与预检引导到位,测试覆盖密(含 4 个预检/引导分支)。T-205 的“预检拦截 + 引导去④”方案已接受并与当前文档对齐。可推进 Phase 3(T-301 `app/ai.py`)。