实现采购任务演练执行与结果回传 #71

Closed
opened 2026-08-09 23:24:24 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP)
  • 阶段:5. 采购演练与恢复
  • 依赖:#69 Admin 可复用规格映射与采购任务创建
  • 状态:待实施

要解决什么

Admin 已能创建包含 PDD 链接、目标动态规格、数量和人民币价格上限的采购任务,但 Client 目前只有采集任务执行器。若直接开放采购任务领取,任务会被标记为 claimed 后卡住。需要先建立一个只处理本地已保存采购任务的演练执行器,完成商品、规格、数量和价格核对,在最终提交订单前停止,并可靠生成可回传结果。

做什么 / 不做什么

做

  • 新增职责独立的采购任务应用服务和 PDD 采购适配层接口,不复用采集执行器冒充采购流程。
  • 支持从本地 Repository 读取一条已领取的采购任务并创建独立 task_run。
  • 按任务参数打开 PDD 商品,选择目标动态规格和数量,并在关键动作前重新读取页面状态。
  • 校验商品、规格、数量、当前人民币价格和 max_price_cent;多个候选、规格不存在、价格超限、验证码、登录失效、未知弹窗时停止。
  • 固定使用 dry_run:到达最终提交订单前安全停止,不点击提交订单、不付款。
  • 先在 SQLite 事务中保存执行结果和 Outbox,再由现有 Gateway 提交 Admin。
  • 提供可注入的设备/PDD Adapter,单元测试使用脱敏控件树或 Mock,不依赖真实设备。
  • 错误信息包含步骤、是否可重试和人工处理原因。

不做

  • 不修改 HTTP Gateway 的 supported_types,不从 Admin 领取采购任务;测试从本地准备任务。
  • 不打开真实下单开关,不点击提交订单,不自动付款。
  • 不绕过验证码、登录、风控或安全机制。
  • 不实现不可逆阶段后的崩溃核对;由后续恢复工单完成。
  • 不新增 Admin 接口或修改四接口契约。

已确认的实现方案

  • 参照现有 CollectTaskService 分层,新建独立 PurchaseTaskService;UI 不直接调用 uiautomator2、网络或 SQLite 长操作。
  • 领域输入使用现有 AdminTask / Repository 字段,PDD 目标规格保持 JSON 对象,不写死颜色尺码。
  • PDD Adapter 暴露“打开商品、读取当前商品、选择规格、设置数量、读取价格、到达提交前确认页、停止”的窄接口。
  • 每个高风险动作前用最新页面状态复核,价格全部使用人民币分整数。
  • 演练成功结果写入 purchase_result,明确记录 mode=dry_run、确认规格、数量、价格和“未提交订单”。
  • Worker 使用 QObject + moveToThread;后台不访问 QWidget。

预计修改:新增采购任务服务和 PDD 采购适配层文件;按最小范围调整任务模型、Repository/Outbox、事件层;增加对应单元测试、脱敏固件和 Client 基线文档。

验收标准

  • 本地已领取的采购任务能创建独立执行记录并进入演练流程。
  • PDD 规格按任务中的动态 options 精确选择,不写死颜色/尺码维度,不做相似猜测。
  • 商品、规格、数量和价格在高风险动作前使用最新页面状态复核。
  • 当前价格高于 max_price_cent 时停止,不进入最终提交步骤。
  • 多候选、无匹配、验证码、登录失效和未知弹窗均停止并给出明确原因。
  • 演练只到最终提交前确认页,绝不点击提交订单或付款。
  • 结果先写 SQLite 和 Outbox,再提交 Admin;提交失败不会重新执行采购流程。
  • Qt 主线程不执行设备、网络、等待或 SQLite 长操作。
  • HTTP Client 仍只声明 collect,不会提前领取采购任务。
  • Python 3.10 全量测试、语法检查和离屏 UI 冒烟通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/purchase_task_service.py
$env:QT_QPA_PLATFORM="offscreen"
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"
Remove-Item Env:QT_QPA_PLATFORM

使用脱敏控件树覆盖:正常演练、动态三维规格、价格超限、规格多候选/不存在、验证码、登录失效和未知弹窗。不得用真实下单验证。

风险和回退

  • 采购流程涉及不可逆风险;本工单在 Adapter 和应用服务两层都固定 dry_run,不得用调试参数绕过。
  • 页面状态可能变化;高风险动作前必须重新读取,不能依赖旧控件坐标或缓存价格。
  • 结果提交失败只重试 Outbox,不重新运行采购自动化。
  • 可按本工单提交回退;不删除本地任务、执行历史或 Outbox。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP) - 阶段:5. 采购演练与恢复 - 依赖:#69 Admin 可复用规格映射与采购任务创建 - 状态:待实施 ## 要解决什么 Admin 已能创建包含 PDD 链接、目标动态规格、数量和人民币价格上限的采购任务,但 Client 目前只有采集任务执行器。若直接开放采购任务领取,任务会被标记为 `claimed` 后卡住。需要先建立一个只处理本地已保存采购任务的演练执行器,完成商品、规格、数量和价格核对,在最终提交订单前停止,并可靠生成可回传结果。 ## 做什么 / 不做什么 ### 做 - 新增职责独立的采购任务应用服务和 PDD 采购适配层接口,不复用采集执行器冒充采购流程。 - 支持从本地 Repository 读取一条已领取的采购任务并创建独立 `task_run`。 - 按任务参数打开 PDD 商品,选择目标动态规格和数量,并在关键动作前重新读取页面状态。 - 校验商品、规格、数量、当前人民币价格和 `max_price_cent`;多个候选、规格不存在、价格超限、验证码、登录失效、未知弹窗时停止。 - 固定使用 `dry_run`:到达最终提交订单前安全停止,不点击提交订单、不付款。 - 先在 SQLite 事务中保存执行结果和 Outbox,再由现有 Gateway 提交 Admin。 - 提供可注入的设备/PDD Adapter,单元测试使用脱敏控件树或 Mock,不依赖真实设备。 - 错误信息包含步骤、是否可重试和人工处理原因。 ### 不做 - 不修改 HTTP Gateway 的 `supported_types`,不从 Admin 领取采购任务;测试从本地准备任务。 - 不打开真实下单开关,不点击提交订单,不自动付款。 - 不绕过验证码、登录、风控或安全机制。 - 不实现不可逆阶段后的崩溃核对;由后续恢复工单完成。 - 不新增 Admin 接口或修改四接口契约。 ## 已确认的实现方案 - 参照现有 `CollectTaskService` 分层,新建独立 `PurchaseTaskService`;UI 不直接调用 uiautomator2、网络或 SQLite 长操作。 - 领域输入使用现有 `AdminTask` / Repository 字段,PDD 目标规格保持 JSON 对象,不写死颜色尺码。 - PDD Adapter 暴露“打开商品、读取当前商品、选择规格、设置数量、读取价格、到达提交前确认页、停止”的窄接口。 - 每个高风险动作前用最新页面状态复核,价格全部使用人民币分整数。 - 演练成功结果写入 `purchase_result`,明确记录 `mode=dry_run`、确认规格、数量、价格和“未提交订单”。 - Worker 使用 `QObject + moveToThread`;后台不访问 QWidget。 预计修改:新增采购任务服务和 PDD 采购适配层文件;按最小范围调整任务模型、Repository/Outbox、事件层;增加对应单元测试、脱敏固件和 Client 基线文档。 ## 验收标准 - [ ] 本地已领取的采购任务能创建独立执行记录并进入演练流程。 - [ ] PDD 规格按任务中的动态 options 精确选择,不写死颜色/尺码维度,不做相似猜测。 - [ ] 商品、规格、数量和价格在高风险动作前使用最新页面状态复核。 - [ ] 当前价格高于 `max_price_cent` 时停止,不进入最终提交步骤。 - [ ] 多候选、无匹配、验证码、登录失效和未知弹窗均停止并给出明确原因。 - [ ] 演练只到最终提交前确认页,绝不点击提交订单或付款。 - [ ] 结果先写 SQLite 和 Outbox,再提交 Admin;提交失败不会重新执行采购流程。 - [ ] Qt 主线程不执行设备、网络、等待或 SQLite 长操作。 - [ ] HTTP Client 仍只声明 `collect`,不会提前领取采购任务。 - [ ] Python 3.10 全量测试、语法检查和离屏 UI 冒烟通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/purchase_task_service.py $env:QT_QPA_PLATFORM="offscreen" 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" Remove-Item Env:QT_QPA_PLATFORM ``` 使用脱敏控件树覆盖:正常演练、动态三维规格、价格超限、规格多候选/不存在、验证码、登录失效和未知弹窗。不得用真实下单验证。 ## 风险和回退 - 采购流程涉及不可逆风险;本工单在 Adapter 和应用服务两层都固定 `dry_run`,不得用调试参数绕过。 - 页面状态可能变化;高风险动作前必须重新读取,不能依赖旧控件坐标或缓存价格。 - 结果提交失败只重试 Outbox,不重新运行采购自动化。 - 可按本工单提交回退;不删除本地任务、执行历史或 Outbox。
Author
Owner

实施完成,准备提交

  • 新增独立 PurchaseTaskService,只处理本地已保存采购任务,不领取 Admin 任务。
  • 新增 PddPurchaseAdapter 窄接口;接口没有提交订单或付款方法,固定 dry_run。
  • 动态规格使用完整 options 对象精确选择和复核,不写死颜色/尺码。
  • 商品、规格、数量、价格及最终确认页在关键动作前后均重新读取页面状态。
  • 价格超限、规格/商品不一致、多候选、验证码、登录失效、未知/风控/支付页面全部安全停止。
  • 采购结果和失败均在 SQLite 事务内与运行记录、Outbox 一起保存;Admin 暂时不可用时只补交 Outbox,不重复演练。
  • HTTP Gateway 未改动,仍只声明 collect。

验证:采购专项 6 项通过;Client 全量 193 项通过;语法检查与 PyQt5 离屏主窗口冒烟通过。

未验证:未连接真机;本工单按范围使用可注入 Mock Adapter 验证应用层和安全边界,不执行真实下单。

## 实施完成,准备提交 - 新增独立 `PurchaseTaskService`,只处理本地已保存采购任务,不领取 Admin 任务。 - 新增 `PddPurchaseAdapter` 窄接口;接口没有提交订单或付款方法,固定 `dry_run`。 - 动态规格使用完整 `options` 对象精确选择和复核,不写死颜色/尺码。 - 商品、规格、数量、价格及最终确认页在关键动作前后均重新读取页面状态。 - 价格超限、规格/商品不一致、多候选、验证码、登录失效、未知/风控/支付页面全部安全停止。 - 采购结果和失败均在 SQLite 事务内与运行记录、Outbox 一起保存;Admin 暂时不可用时只补交 Outbox,不重复演练。 - HTTP Gateway 未改动,仍只声明 `collect`。 验证:采购专项 6 项通过;Client 全量 193 项通过;语法检查与 PyQt5 离屏主窗口冒烟通过。 未验证:未连接真机;本工单按范围使用可注入 Mock Adapter 验证应用层和安全边界,不执行真实下单。
Author
Owner

实现与归档已完成,等待用户验收。

  • 实现提交:311d55f feat: 实现采购任务安全演练 (#71)
  • 归档提交:4606193 docs: 归档任务 #71
  • 归档文档:docs/task/71-采购任务安全演练.md
  • Client 全量测试:193 项通过
  • 安全边界:固定 dry_run,仅到订单确认页前停止;没有提交订单或付款入口
  • 未验证:未连接真实 Admin、真实 Android 设备或 PDD 页面;执行器以可注入 Adapter 和测试替身验证。
实现与归档已完成,等待用户验收。 - 实现提交:`311d55f feat: 实现采购任务安全演练 (#71)` - 归档提交:`4606193 docs: 归档任务 #71` - 归档文档:`docs/task/71-采购任务安全演练.md` - Client 全量测试:193 项通过 - 安全边界:固定 `dry_run`,仅到订单确认页前停止;没有提交订单或付款入口 - 未验证:未连接真实 Admin、真实 Android 设备或 PDD 页面;执行器以可注入 Adapter 和测试替身验证。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:11 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#71