4.4 KiB
4.4 KiB
73 完善采购任务崩溃恢复与安全门禁验证
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP)
- 状态:已完成,待用户验收
- 日期:2026-08-10
- Gitea 工单:#73
背景与目标
采购演练可以执行和领取后,还需要明确处理进程退出、设备断开、结果
提交失败和结果不确定。本任务用 SQLite 已提交事实作为唯一恢复依据,
并证明只要 irreversible_action_at 有值,程序就不会再次执行采购。
最终方案
- 每个采购关键动作前,先同时保存任务和执行记录的
current_step。 - 启动时发现无不可逆标记的中断采购演练,先关闭旧执行记录,再把任务
改回待执行;新演练必须创建更大的
attempt_no和新attempt_id。 - 有不可逆标记时,任务和运行改为
manual_review / reconcile_purchase。 - 新增独立
PddPurchaseReconcileAdapter和PurchaseReconcileService,只提供读取 订单候选能力,没有选规格、设数量、提交订单或付款方法。 - 唯一匹配、未找到、多候选和未知结果均保存到执行诊断,任务仍等待人工确认。
- 采购的设备断开等可重试技术错误也先转人工处理,不隐式重跑采购。
- Outbox 继续优先补交;结果已落库时不再访问 PDD。
ClaimCapabilities只接受dry_run,live在数据对象创建时就被拒绝。- 界面为采购演练、结果待提交、只读核对和人工处理步骤提供中文说明。
改了哪些文件
client/src/task_repository.py:采购中断恢复、最新执行记录、只读核对结果。client/src/pdd_purchase_reconcile_adapter.py:只读核对边界。client/src/purchase_reconcile_service.py:核对条件、读取、记录与人工处理。client/src/task_dispatcher.py、client/src/pdd_ui_event.py:恢复分支优先于普通采购。client/src/purchase_task_service.py:保留服务步骤和诊断,采购错误不自动重跑。client/src/admin_gateway.py:从数据边界禁止live。client/src/task_detail_view.py:采购和恢复步骤的中文文案。client/test/:崩溃步骤、重启、不可逆恢复、设备断开、重复轮询和界面文案测试。docs/client/:同步架构、数据模型、界面和质量安全基线。
本任务没有修改数据库表结构,直接使用已有的 current_step、
irreversible_action_at 和 diagnostics_json。
验收结果
| 验收标准 | 结果 |
|---|---|
| 采购关键步骤在动作前持久化 | 通过 |
| 无不可逆标记时关闭旧运行后才恢复 | 通过 |
| 不可逆标记非空时 purchase 调用次数为 0 | 通过 |
| 已落库 Outbox 只补交,不重跑手机流程 | 通过 |
| 重复启动和重复轮询不会创建并发采购运行 | 通过 |
| 停止、设备断开、验证码、登录失效和未知结果安全停止 | 通过 |
| 采购继续禁止“重新执行” | 通过 |
| 采购与恢复步骤使用明确中文 | 通过 |
purchase_mode=live 不能通过参数开启 |
通过 |
| 语法、全量测试和离屏界面冒烟 | 通过 |
测试
- 执行的命令:
C:/Python310/python.exe -m unittest discover -s test -p "test_purchase*.py" -vC:/Python310/python.exe -m unittest discover -s test -p "test_task_repository.py" -vC:/Python310/python.exe -m unittest discover -s test -p "test_task_detail_view.py" -vC:/Python310/python.exe -m unittest discover -s testC:/Python310/python.exe -m py_compile src/admin_gateway.py src/pdd_ui_event.py src/pdd_purchase_reconcile_adapter.py src/purchase_reconcile_service.py src/purchase_task_service.py src/task_detail_view.py src/task_dispatcher.py src/task_repository.py- 按
client/AGENTS.md设置QT_QPA_PLATFORM=offscreen并创建MainWindow
- 结果:采购专项 12 项通过;Repository 14 项通过;Client 全量 207 项通过;
语法检查通过;离屏冒烟输出
OK。Qt 同时输出环境缺少字体目录警告,不影响本次结果。 - 未验证到的部分:未连接真实 Admin、Android 设备或 PDD 页面;没有执行 真实崩溃进程杀死,崩溃点由可注入 Adapter 抛错和 SQLite 历史状态构造验证。 本工单不代表真实下单安全门禁已放行。
相关提交
c86c748完善采购任务安全恢复