# 139 增加不可逆门禁保护的批量重新采购 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 - 状态:已完成,用户验收通过 - 日期:2026-08-11 - Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/139 ## 背景与目标 增加人工批量重新采购入口,同时确保任何历史上已经进入下单不可逆阶段的任务都不会再次下单。 ## 最终方案 批量预检永久检查该任务全部 `task_runs.irreversible_action_at`,存在任意标记就拒绝重新采购。安全任务在同一 Android 设备线程逐条执行。真实下单后等待 5 秒,自动完成只读核单并上报 Admin;只有当前任务形成成功闭环才启动下一条。核单不确定、上报失败或需要人工处理时,停止剩余队列。 用户在不可逆阶段后请求停止时,只停止剩余任务;当前任务仍完成只读核单,绝不重新点击下单。 ## 改了哪些 - `client/src/task_repository.py`:增加采购重新执行预检、准备事务和永久不可逆门禁。 - `client/src/pdd_ui_event.py`:增加采购串行闭环、5 秒等待、只读核单、上报和失败停队。 - `client/src/purchase_task_service.py`:公开提交已落库核单事件的安全入口,并区分真实采购成功提示。 - `client/src/pdd_ui.py`:增加“重新采购”按钮。 - `client/test/`、`docs/client/`:补充安全门禁测试并同步规则。 ## 验收结果 | 验收标准 | 结果 | |---|---| | 只把勾选记录中的采购任务加入队列 | 通过 | | 历史任一次执行有不可逆标记时永久拒绝重新采购 | 通过 | | 采购任务在固定设备线程严格串行 | 通过(自动测试);真机待验收 | | 下单后只读核单并上报成功才继续下一条 | 通过(代码路径和回归测试);真机待验收 | | 核单不确定时停止剩余队列,绝不重新下单 | 通过 | ## 测试 - 执行的命令:`C:/Python310/python.exe -m unittest discover -v -s test -p 'test_*.py'` - 结果:370 项测试全部通过,包含不可逆恢复与采购安全回归。 - 执行的命令:延迟关闭的 PyQt5 离屏 `MainWindow` 冒烟测试。 - 结果:输出 `SMOKE_OK`。 - **没验证到的部分**:未用真实 Android 设备进行批量重新采购;未产生真实订单,也未付款。必须由用户按安全门禁真机验收。 ## 相关提交 - `598c808` 增加批量重新采集和安全重新采购