Files
cmautobuy/docs/task/170-任务失败后继续下一条.md
T
2026-08-11 18:22:07 +08:00

3.7 KiB
Raw Blame History

#170 Client:任务失败不自动重试并继续下一条

背景与目标

旧流程把部分采集失败显示为“等待重试”,但实际上没有倒计时,还会停止整个自动 任务队列。采购人员难以判断任务是否失败,Admin 指派的后续任务也会被阻塞。本任务 改为每条任务自动执行一次,任务自身失败后记录原因并继续下一条。

最终方案

  • 普通采集或采购错误保存为 failed,错误上报中的 retryable 固定为 false, 自动流程不再重试当前任务。
  • 自动任务查询只选择 claimed,不再选择历史 retry_wait;旧记录保留并显示为 “采集失败”或“采购失败”。
  • 服务结果明确区分 task_failed 和 global_failed。前者上报成功后安排下一轮; 后者停止自动获取。
  • 设备断开、PDD 登录、验证码、风控、支付页、Admin/Outbox 阻塞和不可逆采购待 核单仍作为全局阻塞,不继续批量制造失败任务。
  • 列表和详情根据任务类型显示“采集失败”或“采购失败”,详情继续展示错误码与 失败原因。
  • 手动重新采集和重新采购入口保留;每次重新执行创建新的运行记录,采购仍永久 拒绝任何有不可逆历史的任务重新下单。
  • 同步更新需求、数据模型和界面规范中的稳定行为说明。

改了哪些文件

  • client/src/collect_task_service.py:普通采集错误改为单次失败,区分任务失败和 全局阻塞。
  • client/src/purchase_task_service.py:普通采购错误保存为失败并继续队列,全局及 不可逆安全规则保持停止。
  • client/src/task_repository.py:自动选择只读取 claimed,跳过失败和历史 retry_wait。
  • client/src/pdd_ui_event.py、client/src/task_detail_view.py:显示任务类型对应的 失败状态,并只对任务自身失败安排下一轮。
  • client/test/ 相关测试:覆盖失败后下一条、禁止自动重试、全局阻塞、中文状态、 失败原因和采购取消。
  • docs/client/01-requirements.md、03-data-model.md、05-ui-specification.md:同步 单次执行与失败队列规则。

验收结果

  • 新采集失败不再进入“等待重试”,列表显示“采集失败”。
  • 普通采购失败显示“采购失败”,详情保留具体错误原因。
  • 第一条任务自身失败且上报成功后,第二条本地任务可以继续执行。
  • 失败和历史 retry_wait 任务不会被自动选择。
  • 用户手动重新执行仍使用现有入口和安全预检。
  • 设备、登录、验证码、风控、Admin 和不可逆采购等全局问题仍停止队列。
  • 未修改 Admin 接口、数据库表结构、pdd_data 和采购不可逆门禁。
  • Client 全量测试和语法检查通过。
  • 用户使用多个真实任务确认一条失败后会继续下一条。

测试

在 client/ 目录执行:

$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
C:/Python310/python.exe -m py_compile src/collect_task_service.py src/purchase_task_service.py src/task_repository.py src/pdd_ui_event.py src/task_detail_view.py
Remove-Item Env:QT_QPA_PLATFORM

结果:Client 完整 429 项测试通过,语法检查通过。

没验证到的部分:未连接真实 Admin 连续领取多条任务;未连接 Android 真机;未 执行真实采购、下单或付款。

相关提交

  • 8b8a542 任务失败后继续执行下一条。