# 45 让获取任务按钮支持持续自动运行和安全停止 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 状态:已实现,待验收 - 日期:2026-08-09 - Gitea 工单: ## 背景与目标 原来的“获取任务”按钮每次只处理一轮,用户需要反复点击。此次把原按钮改成“开始自动获取 / 停止自动获取”开关:启动后持续按顺序处理任务,停止时取消下一轮并等待当前任务安全结束。 ## 最终方案 - 每轮仍然只创建一个 `ClaimTaskWorker`,处理待提交结果、本地未完成任务或领取一条新任务。 - 上一轮线程完全结束后,主线程使用单次 `QTimer` 安排下一轮,确保同一设备不会并发执行两条任务。 - 成功后短暂等待再继续;暂无任务时等待 5 秒;Admin 临时错误按 5、10、20、30 秒退避,之后保持 30 秒。 - 缺少配置、设备错误、需要人工处理和不可重试错误会停止自动获取,并保留明确的中文状态提示。 - 再次点击按钮或关闭程序时停止定时器,并请求当前任务在安全点取消。 - 未修改 Admin 接口、SQLite 表结构、`pdd_data` 结构和采购下单逻辑。 实际实现与建单方案一致。 ## 改了哪些 - `client/src/pdd_ui_event.py`:增加连续调度、退避重试、启动/停止状态和关闭清理。 - `client/test/test_pdd_ui_event.py`:覆盖连续串行执行、手动停止、退避、配置错误和关闭清理。 - `docs/client/02-architecture.md`:更新自动获取的线程与调度说明。 - `docs/client/05-ui-specification.md`:更新按钮状态及持续运行规则。 ## 验收结果 | 验收标准 | 结果 | |---|---| | 点击一次后持续处理多条任务,且同一时刻最多执行一轮 | 自动测试通过 | | 再次点击后不再启动下一轮,当前轮安全结束 | 自动测试通过 | | 暂无任务时等待 5 秒后继续 | 自动测试通过 | | Admin 可重试错误按 5/10/20/30 秒退避,成功后重置 | 自动测试通过 | | 配置、人工处理等不可自动恢复的问题会停止并恢复按钮 | 自动测试通过 | | 关闭程序后定时器不会再次领取任务 | 自动测试通过 | | 不改变 Admin、数据库和采购安全边界 | 代码检查通过 | ## 测试 - 执行的命令: - `C:/Python310/python.exe -m py_compile src/pdd_ui_event.py test/test_pdd_ui_event.py` - `C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py"` - `C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"` - `git diff --check -- client/src/pdd_ui_event.py client/test/test_pdd_ui_event.py docs/client/02-architecture.md docs/client/05-ui-specification.md` - 结果:语法检查通过;定向测试 19 项通过;Client 完整测试 176 项通过;差异格式检查通过。测试环境存在 Qt 字体目录警告,不影响测试结果。 - **没验证到的部分**:尚未连接真实 Admin 和 Android 设备连续执行多条采集任务;尚未通过真机验证采集中点击停止时的安全取消时机。未执行真实采购和下单。 ## 相关提交 - `5fd7198` feat: 支持持续自动获取任务 (#45)