Files
cmautobuy/docs/task/71-采购任务安全演练.md
T

67 lines
3.5 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.
# 71 实现采购任务演练执行与结果回传
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP)
- 状态:已完成,用户验收通过
- 日期:2026-08-09
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/71
## 背景与目标
Client 已认识采购任务数据,但没有独立采购执行器。直接开放领取会让任务卡在
已领取状态,也可能把尚未验证的页面操作带入真实订单流程。本任务先建立只处理
本地任务的 `dry_run` 演练服务,在最终提交订单前停止并可靠回传结果。
## 最终方案
- 新增独立 `PurchaseTaskService`,不复用采集执行器,也不领取 Admin 任务。
- 新增可注入的 `PddPurchaseAdapter` 窄接口。接口没有提交订单或付款方法。
- 动态规格使用完整 `options` 对象精确选择和比较,不写死颜色、尺码维度。
- 进入打开商品、选择规格、设置数量和确认页等关键动作前先持久化步骤;动作前后
重新读取商品、规格、数量和人民币分价格。
- 多候选、无匹配、价格超限、验证码、登录失效、未知页面、风控页和支付页均停止。
- 演练结果明确记录 `mode=dry_run`、确认规格、数量、价格、未提交订单和未付款。
- 结果或失败与执行记录、Outbox 在 SQLite 事务内一起保存。提交失败只补交 Outbox,
不重新执行手机流程。
- HTTP Gateway 保持只声明 `collect`,采购领取留给依赖工单 #72。
## 改了哪些文件
- `client/src/pdd_purchase_adapter.py`:采购演练适配层接口和最新页面状态对象。
- `client/src/purchase_task_service.py`:本地采购演练、校验、失败分类和结果提交。
- `client/src/task_repository.py`:采购运行、步骤、结果、失败及 Outbox 原子持久化。
- `client/src/task_models.py`:执行记录说明同时适用于采集和采购。
- `client/test/test_purchase_task_service.py`:正常演练和安全停止场景测试。
- `docs/client/02-architecture.md`:记录采购服务和无下单入口的适配边界。
- `docs/client/03-data-model.md`:采购结果改用动态 `options` 对象。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 本地采购任务创建独立执行记录并进入演练 | 通过 |
| 动态 options 精确选择,不写死颜色尺码 | 通过 |
| 关键动作前后使用最新页面状态复核 | 通过 |
| 价格超过人民币分上限时停止 | 通过 |
| 多候选、无匹配、验证码、登录和未知页面安全停止 | 通过 |
| 到达最终提交前停止,不提交订单或付款 | 通过 |
| 结果先写 SQLite 与 Outbox,提交失败不重跑手机流程 | 通过 |
| HTTP Client 仍只声明 collect | 通过 |
## 测试
- 执行的命令:
- `C:/Python310/python.exe -m unittest discover -s test -p "test_purchase*.py" -v`
- `C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" -q`
- `C:/Python310/python.exe -m py_compile src/task_models.py src/task_repository.py src/pdd_purchase_adapter.py src/purchase_task_service.py`
- 设置 `QT_QPA_PLATFORM=offscreen` 后创建并关闭 `MainWindow`
- 结果:采购专项 6 项通过;Client 全量 193 项通过;语法检查通过;离屏冒烟输出
`MAIN_WINDOW_OK`。
- **未验证到的部分**:未连接真实 Android 设备;本工单使用可注入 Mock Adapter
验证应用层和安全边界,没有点击真实提交订单或付款。
## 相关提交
- `311d55f` 实现采购任务安全演练