Files
cmshoppe/docs/reviews/2026-06-27-T201-T205-acceptance.md
T

52 lines
4.9 KiB
Markdown
Raw Normal View History

# 验收报告 · 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`)。