增加不可逆门禁保护的批量重新采购 #139

Closed
opened 2026-08-11 10:29:34 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:采购安全人工执行
  • 依赖:#138、#119、#122、#124、#126

要解决什么

实现独立“重新采购”按钮,对勾选任务按类型和采购安全状态过滤,串行执行仍可安全重新开始的采购任务,同时严格防止重复下单。

做什么 / 不做什么

  • 做:过滤采集任务并显示数量。
  • 做:只有所有执行记录均没有 irreversible_action_at 的采购任务才可能重新采购。
  • 做:跳过执行中、结果待提交、存在未发送 Outbox 的采购任务。
  • 做:每条采购开始前重新检查不可逆记录和任务状态。
  • 做:真实下单后等待5秒并立即进入只读核单;核单唯一匹配并成功上报后才允许下一条采购。
  • 做:核单未找到、多候选或读取失败时停止剩余采购队列。
  • 做:已成功下单或曾进入不可逆阶段的任务只允许核单,不能重新下单。
  • 不做:不自动付款、不绕过验证码或风控。
  • 不做:不允许通过状态修改、调试参数或新执行记录清除不可逆事实。
  • 不做:不修改 Admin 接口和数据库结构。

怎么做

  • client/src/task_repository.py 增加采购重新执行预检及事务准备方法,检查任务类型、状态、Outbox、运行记录和永久不可逆标记。
  • client/src/pdd_ui_event.py 复用 #138 的串行内存队列,根据任务原有 execution_mode 选择 Adapter,不允许降级或升级。
  • client/src/purchase_task_service.py 提供复用已保存 Outbox 的公开提交边界,支持“下单 → 等待 → 只读核单 → 结果入库 → 上报”闭环。
  • 核单无法唯一确认、设备断开、Admin 待提交或人工处理时停止剩余采购队列,未开始任务保持原状态。
  • 更新采购服务、事件层、Client 基线和采购恢复测试。

验收标准

  • 混合勾选时准确显示可采购、过滤采集和安全跳过数量。
  • 任何历史运行包含不可逆标记时任务均不能重新采购。
  • 已下单任务不会再次打开商品页或调用采购 Adapter。
  • 每条任务开始前重新校验。
  • 采购任务严格串行,不与自动获取或重新采集并发。
  • 下单后先核单并成功上报,才能开始下一条。
  • 核单不确定时停止剩余队列,绝不重新下单。
  • 停止只取消未来任务;已经进入不可逆阶段的当前任务继续只读核单。
  • 不执行付款,不绕过安全机制。
  • 采购恢复和 Client 全量测试通过。

怎么验证

# client 目录
C:/Python310/python.exe -m unittest discover -s test -p 'test_task_repository.py' -v
C:/Python310/python.exe -m unittest discover -s test -p 'test_purchase_task_service.py' -v
C:/Python310/python.exe -m unittest discover -s test -p 'test_purchase_recovery.py' -v
C:/Python310/python.exe -m unittest discover -s test -p 'test_pdd_ui_event.py' -v
C:/Python310/python.exe -m unittest discover -s test -p 'test_*.py' -q

真实设备验收只创建未付款订单并读取订单编号和下单时间,不进入付款。

风险和回退

  • 重复下单是最高风险;任何不确定情况均停止剩余队列并转人工或只读核单。
  • 不可逆标记永久有效,不能通过重新执行清除。
  • 无数据库迁移,可回退实现提交;已进入不可逆阶段的任务仍必须保留并继续核单。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:采购安全人工执行 - 依赖:#138、#119、#122、#124、#126 ## 要解决什么 实现独立“重新采购”按钮,对勾选任务按类型和采购安全状态过滤,串行执行仍可安全重新开始的采购任务,同时严格防止重复下单。 ## 做什么 / 不做什么 - 做:过滤采集任务并显示数量。 - 做:只有所有执行记录均没有 `irreversible_action_at` 的采购任务才可能重新采购。 - 做:跳过执行中、结果待提交、存在未发送 Outbox 的采购任务。 - 做:每条采购开始前重新检查不可逆记录和任务状态。 - 做:真实下单后等待5秒并立即进入只读核单;核单唯一匹配并成功上报后才允许下一条采购。 - 做:核单未找到、多候选或读取失败时停止剩余采购队列。 - 做:已成功下单或曾进入不可逆阶段的任务只允许核单,不能重新下单。 - 不做:不自动付款、不绕过验证码或风控。 - 不做:不允许通过状态修改、调试参数或新执行记录清除不可逆事实。 - 不做:不修改 Admin 接口和数据库结构。 ## 怎么做 - `client/src/task_repository.py` 增加采购重新执行预检及事务准备方法,检查任务类型、状态、Outbox、运行记录和永久不可逆标记。 - `client/src/pdd_ui_event.py` 复用 #138 的串行内存队列,根据任务原有 `execution_mode` 选择 Adapter,不允许降级或升级。 - `client/src/purchase_task_service.py` 提供复用已保存 Outbox 的公开提交边界,支持“下单 → 等待 → 只读核单 → 结果入库 → 上报”闭环。 - 核单无法唯一确认、设备断开、Admin 待提交或人工处理时停止剩余采购队列,未开始任务保持原状态。 - 更新采购服务、事件层、Client 基线和采购恢复测试。 ## 验收标准 - [ ] 混合勾选时准确显示可采购、过滤采集和安全跳过数量。 - [ ] 任何历史运行包含不可逆标记时任务均不能重新采购。 - [ ] 已下单任务不会再次打开商品页或调用采购 Adapter。 - [ ] 每条任务开始前重新校验。 - [ ] 采购任务严格串行,不与自动获取或重新采集并发。 - [ ] 下单后先核单并成功上报,才能开始下一条。 - [ ] 核单不确定时停止剩余队列,绝不重新下单。 - [ ] 停止只取消未来任务;已经进入不可逆阶段的当前任务继续只读核单。 - [ ] 不执行付款,不绕过安全机制。 - [ ] 采购恢复和 Client 全量测试通过。 ## 怎么验证 ```powershell # client 目录 C:/Python310/python.exe -m unittest discover -s test -p 'test_task_repository.py' -v C:/Python310/python.exe -m unittest discover -s test -p 'test_purchase_task_service.py' -v C:/Python310/python.exe -m unittest discover -s test -p 'test_purchase_recovery.py' -v C:/Python310/python.exe -m unittest discover -s test -p 'test_pdd_ui_event.py' -v C:/Python310/python.exe -m unittest discover -s test -p 'test_*.py' -q ``` 真实设备验收只创建未付款订单并读取订单编号和下单时间,不进入付款。 ## 风险和回退 - 重复下单是最高风险;任何不确定情况均停止剩余队列并转人工或只读核单。 - 不可逆标记永久有效,不能通过重新执行清除。 - 无数据库迁移,可回退实现提交;已进入不可逆阶段的任务仍必须保留并继续核单。
Author
Owner

实施完成,等待验收

  • 实现提交:598c808
  • 归档提交:9181329
  • 本地归档:docs/task/139-增加不可逆门禁保护的批量重新采购.md

已完成:

  • 采购批量预检会检查任务全部历史运行;任一 irreversible_action_at 有值就永久拒绝重新采购。
  • 安全任务在固定设备线程严格串行。
  • 真实下单后等待 5 秒,只读核单并提交 Admin;只有当前任务成功闭环才启动下一条。
  • 核单不确定、上报失败或需要人工处理时停止剩余队列。
  • 不可逆阶段后的停止请求只停止剩余任务,当前任务仍完成只读核单,绝不重新下单。

验证:

  • Client 全量 370 项测试通过,包含不可逆恢复和采购安全回归。
  • PyQt5 离屏窗口冒烟测试输出 SMOKE_OK。
  • 未执行真机批量重新采购、未产生真实订单、未付款,等待安全门禁下的真机验收。
## 实施完成,等待验收 - 实现提交:`598c808` - 归档提交:`9181329` - 本地归档:`docs/task/139-增加不可逆门禁保护的批量重新采购.md` 已完成: - 采购批量预检会检查任务全部历史运行;任一 `irreversible_action_at` 有值就永久拒绝重新采购。 - 安全任务在固定设备线程严格串行。 - 真实下单后等待 5 秒,只读核单并提交 Admin;只有当前任务成功闭环才启动下一条。 - 核单不确定、上报失败或需要人工处理时停止剩余队列。 - 不可逆阶段后的停止请求只停止剩余任务,当前任务仍完成只读核单,绝不重新下单。 验证: - Client 全量 370 项测试通过,包含不可逆恢复和采购安全回归。 - PyQt5 离屏窗口冒烟测试输出 `SMOKE_OK`。 - 未执行真机批量重新采购、未产生真实订单、未付款,等待安全门禁下的真机验收。
Author
Owner

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

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:37 +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#139