feat: 实现采购任务安全演练 (#71)

This commit is contained in:
chengma
2026-08-09 23:39:37 +08:00
parent dbc08dc0ec
commit 311d55f0da
7 changed files with 1162 additions and 7 deletions
+6 -1
View File
@@ -89,7 +89,7 @@ client/
| 目录分层 | domain / application / infrastructure / workers / ui | 平铺在 `src/` 下:`db.py`、`db_schema.py`、`task_repository.py`、`settings_repository.py`、`task_models.py` 等,另有 `src/util/`、`src/demo1/` |
| 主按钮文案 | 「开始自动获取」⇄「停止自动获取」 | 已按持续串行模式实现 |
| Admin 网关 | `AdminGateway` + Mock/HTTP 两实现 | 登记、领取、结果和失败提交已实现 |
| 采集任务协调器 | `CollectTaskService` | 已实现单条采集任务流程;采购仍未接入 |
| 任务应用服务 | `CollectTaskService` / `PurchaseTaskService` | 采集已接入自动获取;采购已实现本地 `dry_run` 演练,领取与分派由后续工单接入 |
| Outbox 提交 | 从 `outbox_events` 取件重试 | 采集结果与失败已实现,重试不重复采集 |
| PDD 自动化 | `infrastructure/pdd/` 适配层 | `pdd_device_service.py` 与 `pdd_collect_service.py` 已接入采集主链 |
@@ -350,6 +350,11 @@ purchase(task, mode) -> PurchaseResult
reconcile_purchase(task, run) -> PurchaseResult | ManualReview
```
采购演练通过 `PddPurchaseAdapter` 的窄接口逐步读取最新页面状态。该接口只提供
打开商品、读取状态、精确选择动态规格、设置数量、进入提交前确认页和停止,
**不提供提交订单或付款方法**。这样即使应用层调用错误,也没有可误触的真实下单入口。
采购规格使用完整 `options` 对象精确比较,不假定只有颜色和尺码两个维度。
现有 `wait_goods_page`、规格面板坐标、颜色尺码选择和下单按钮定位函数可以迁移到该适配层。实验脚本中的硬编码商品、设备、文件路径和 `print` 不得进入正式服务。
PDD 页面可能出现登录失效、验证码、控件树不完整、A/B 页面、库存变化和价格变化。适配层必须返回结构化错误,不得把这些情况统一返回 `False`。
+18 -4
View File
@@ -544,18 +544,27 @@ CREATE TABLE app_settings (
"purchase": {
"mode": "dry_run",
"requested": {
"color": "黑色",
"size": "L",
"options": {
"color": "黑色",
"size": "L",
"bundle": "标准版"
},
"quantity": 2,
"max_price_cent": 4200
},
"confirmed": {
"color": "黑色",
"size": "L",
"options": {
"color": "黑色",
"size": "L",
"bundle": "标准版"
},
"quantity": 2,
"unit_price_cent": 3990,
"total_price_cent": 7980
},
"confirmation_reached": true,
"order_submitted": false,
"payment_attempted": false,
"order_no": null,
"ordered_at": null,
"ordered_at_raw": null,
@@ -564,6 +573,11 @@ CREATE TABLE app_settings (
}
```
`requested.options` 和 `confirmed.options` 都是动态对象,键名来自 Admin 和 PDD
页面,不允许写死成颜色、尺码,也不做相似匹配。`dry_run` 必须同时满足
`order_submitted=false`、`payment_attempted=false` 和
`match_status=not_submitted`;只表示已经安全到达最终提交前确认页。
真实下单后 `mode` 为 `live`,`match_status` 只能是 `matched`、`ambiguous` 或 `not_found`。只有 `matched` 可以自动报告采购成功。
## 9. JSON 兼容规则