下单后等待5秒自动进入只读核单闭环 #119

Closed
opened 2026-08-10 19:16:03 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:缺陷修复
  • 父级大工单:#1
  • 所属 MVP/版本:Client 真实采购安全闭环
  • 阶段:下单后只读核单

要解决什么

真实采购点击一次下单按钮后,服务已正确写入不可逆标记并把任务转为 reconcile_purchase,但返回结果类型是 manual_review。PDD 任务页面收到 manual_review 后会停止自动获取,下一轮 Dispatcher 无法自动执行已有的只读核单,手机可能一直停留在微信登录或支付页面。

当前只有用户再次点击“自动获取”或重启 Client 后,Dispatcher 才会优先处理核单任务。流程不完整,也容易让操作人员误以为程序卡住。

做什么 / 不做什么

做什么

  • 下单按钮点击或点击结果不确定后,返回专用的“等待只读核单”结果。
  • Client 收到该结果后等待固定 5 秒,再自动启动下一轮。
  • 下一轮仍由 Dispatcher 现有优先级先处理 reconcile_purchase,不领取新任务。
  • 保持下单前不可逆标记、最多点击一次和异常后只核单的安全规则。
  • 用户在等待期间点击停止时取消下一轮;任务保留为待核单,下次启动只能核单。
  • 补充服务层、Dispatcher 和 UI 自动循环测试。
  • 更新采购安全基线中稳定的闭环说明。

不做什么

  • 不再次打开商品或重新执行采购。
  • 不把固定等待 5 秒当作下单成功判断。
  • 不自动登录微信或执行付款。
  • 不绕过 PDD 登录、验证码、风控或支付机制。
  • 不使用浏览器通用链接代替现有 PDD 只读核单导航。
  • 不修改 Admin 接口、数据库结构或采购结果格式。

已确认的实现方案

  1. 在 PurchaseTaskService._submit_live_once() 中,下单点击完成或结果不确定并成功保存 reconcile_purchase 后,返回新的稳定结果类型 reconcile_pending,不再返回会停止循环的 manual_review。
  2. 在 PDD UI 自动获取结果路由中识别 reconcile_pending,调用现有下一轮定时器,固定延迟 5000 ms。
  3. 下一轮沿用 TaskDispatcher.execute_one() 的既有优先顺序:未解决不可逆状态检查 → next_purchase_reconcile_task() → Outbox → 其他任务。由此保证只核单、不重下。
  4. 核单 Adapter 继续负责:外部应用时重新启动 PDD、只通过白名单进入“个人中心/我的订单/待付款”、读取订单,不点击支付。
  5. 用户停止或 Client 关闭时不强制启动下一轮;数据库中的不可逆标记和 reconcile_purchase 状态确保恢复后仍只允许核单。
  6. 更新测试和 docs/client/06-quality-security.md。

预计修改文件:

  • client/src/purchase_task_service.py
  • client/src/pdd_ui_event.py
  • client/test/test_purchase_task_service.py
  • client/test/test_pdd_ui_event.py 或相关自动获取测试
  • docs/client/06-quality-security.md
  • 完成后归档 docs/task/<工单号>-下单后自动进入只读核单闭环.md

验收标准

  • 下单点击前仍先持久化不可逆标记。
  • 下单按钮仍最多点击一次,异常也绝不重新下单。
  • 转为 reconcile_purchase 后返回 reconcile_pending。
  • Client 收到结果后等待 5 秒自动启动下一轮。
  • 下一轮优先执行当前任务的只读核单,不领取新任务。
  • 等待期间用户停止时不启动下一轮,任务仍保持待核单。
  • 核单成功后沿用现有 SQLite/Outbox/Admin 提交流程。
  • 自动化测试通过;不执行真机下单或付款。

验证方式

从 client 目录执行:

C:/Python310/python.exe -m unittest discover -s test -p "test_purchase_task_service.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_task_dispatcher.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"

真机验收由用户执行:下单点击后即使进入微信登录/支付页,Client 显示等待核单;约 5 秒后自动进入只读核单,且不会再次打开商品或点击下单。

风险和回退

  • 风险:5 秒只是页面跳转缓冲,不代表订单创建成功;必须继续严格核对唯一未付款订单。
  • 风险:PDD 或微信页面结构变化可能导致核单失败;失败只转人工处理,不能重下。
  • 回退:恢复 UI 对结果的停止处理,但保留不可逆标记和只读核单恢复路径,不影响防重复下单安全线。
## 基本信息 - 类型:缺陷修复 - 父级大工单:#1 - 所属 MVP/版本:Client 真实采购安全闭环 - 阶段:下单后只读核单 ## 要解决什么 真实采购点击一次下单按钮后,服务已正确写入不可逆标记并把任务转为 `reconcile_purchase`,但返回结果类型是 `manual_review`。PDD 任务页面收到 `manual_review` 后会停止自动获取,下一轮 Dispatcher 无法自动执行已有的只读核单,手机可能一直停留在微信登录或支付页面。 当前只有用户再次点击“自动获取”或重启 Client 后,Dispatcher 才会优先处理核单任务。流程不完整,也容易让操作人员误以为程序卡住。 ## 做什么 / 不做什么 ### 做什么 - 下单按钮点击或点击结果不确定后,返回专用的“等待只读核单”结果。 - Client 收到该结果后等待固定 5 秒,再自动启动下一轮。 - 下一轮仍由 Dispatcher 现有优先级先处理 `reconcile_purchase`,不领取新任务。 - 保持下单前不可逆标记、最多点击一次和异常后只核单的安全规则。 - 用户在等待期间点击停止时取消下一轮;任务保留为待核单,下次启动只能核单。 - 补充服务层、Dispatcher 和 UI 自动循环测试。 - 更新采购安全基线中稳定的闭环说明。 ### 不做什么 - 不再次打开商品或重新执行采购。 - 不把固定等待 5 秒当作下单成功判断。 - 不自动登录微信或执行付款。 - 不绕过 PDD 登录、验证码、风控或支付机制。 - 不使用浏览器通用链接代替现有 PDD 只读核单导航。 - 不修改 Admin 接口、数据库结构或采购结果格式。 ## 已确认的实现方案 1. 在 `PurchaseTaskService._submit_live_once()` 中,下单点击完成或结果不确定并成功保存 `reconcile_purchase` 后,返回新的稳定结果类型 `reconcile_pending`,不再返回会停止循环的 `manual_review`。 2. 在 PDD UI 自动获取结果路由中识别 `reconcile_pending`,调用现有下一轮定时器,固定延迟 5000 ms。 3. 下一轮沿用 `TaskDispatcher.execute_one()` 的既有优先顺序:未解决不可逆状态检查 → `next_purchase_reconcile_task()` → Outbox → 其他任务。由此保证只核单、不重下。 4. 核单 Adapter 继续负责:外部应用时重新启动 PDD、只通过白名单进入“个人中心/我的订单/待付款”、读取订单,不点击支付。 5. 用户停止或 Client 关闭时不强制启动下一轮;数据库中的不可逆标记和 `reconcile_purchase` 状态确保恢复后仍只允许核单。 6. 更新测试和 `docs/client/06-quality-security.md`。 预计修改文件: - `client/src/purchase_task_service.py` - `client/src/pdd_ui_event.py` - `client/test/test_purchase_task_service.py` - `client/test/test_pdd_ui_event.py` 或相关自动获取测试 - `docs/client/06-quality-security.md` - 完成后归档 `docs/task/<工单号>-下单后自动进入只读核单闭环.md` ## 验收标准 - [ ] 下单点击前仍先持久化不可逆标记。 - [ ] 下单按钮仍最多点击一次,异常也绝不重新下单。 - [ ] 转为 `reconcile_purchase` 后返回 `reconcile_pending`。 - [ ] Client 收到结果后等待 5 秒自动启动下一轮。 - [ ] 下一轮优先执行当前任务的只读核单,不领取新任务。 - [ ] 等待期间用户停止时不启动下一轮,任务仍保持待核单。 - [ ] 核单成功后沿用现有 SQLite/Outbox/Admin 提交流程。 - [ ] 自动化测试通过;不执行真机下单或付款。 ## 验证方式 从 `client` 目录执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -p "test_purchase_task_service.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_task_dispatcher.py" C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" ``` 真机验收由用户执行:下单点击后即使进入微信登录/支付页,Client 显示等待核单;约 5 秒后自动进入只读核单,且不会再次打开商品或点击下单。 ## 风险和回退 - 风险:5 秒只是页面跳转缓冲,不代表订单创建成功;必须继续严格核对唯一未付款订单。 - 风险:PDD 或微信页面结构变化可能导致核单失败;失败只转人工处理,不能重下。 - 回退:恢复 UI 对结果的停止处理,但保留不可逆标记和只读核单恢复路径,不影响防重复下单安全线。
Author
Owner

状态:进行中。先补服务结果类型和 UI 5 秒调度测试,再确认下一轮 Dispatcher 仍严格优先只读核单;不执行真机下单。

状态:进行中。先补服务结果类型和 UI 5 秒调度测试,再确认下一轮 Dispatcher 仍严格优先只读核单;不执行真机下单。
Author
Owner

实现完成,状态:待验收。

实现提交:b789b50

完成内容:

  • 下单点击或点击结果不确定、并成功保存 reconcile_purchase 后,返回 reconcile_pending。
  • UI 收到该结果后保持自动获取运行,固定等待 5000 ms,再启动下一轮。
  • 下一轮继续使用 Dispatcher 既有优先级,先执行当前任务只读核单,不领取新任务。
  • 等待期间用户停止会取消定时器;不可逆任务仍保留,恢复后只能核单。
  • 下单前不可逆标记、最多点击一次、异常不重下等门禁未改变。
  • 5 秒仅为跳转缓冲,不作为下单成功证据。

验证:

  • PurchaseTaskService:11 项通过。
  • TaskDispatcher:12 项通过。
  • PDD UI 事件:46 项通过。
  • Client 全量:343 项通过。
  • py_compile、git diff --check 通过。

未执行真机下单、微信登录或支付。

实现完成,状态:待验收。 实现提交:`b789b50` 完成内容: - 下单点击或点击结果不确定、并成功保存 `reconcile_purchase` 后,返回 `reconcile_pending`。 - UI 收到该结果后保持自动获取运行,固定等待 5000 ms,再启动下一轮。 - 下一轮继续使用 Dispatcher 既有优先级,先执行当前任务只读核单,不领取新任务。 - 等待期间用户停止会取消定时器;不可逆任务仍保留,恢复后只能核单。 - 下单前不可逆标记、最多点击一次、异常不重下等门禁未改变。 - 5 秒仅为跳转缓冲,不作为下单成功证据。 验证: - PurchaseTaskService:11 项通过。 - TaskDispatcher:12 项通过。 - PDD UI 事件:46 项通过。 - Client 全量:343 项通过。 - `py_compile`、`git diff --check` 通过。 未执行真机下单、微信登录或支付。
Author
Owner

本地归档已提交:

  • 文档:docs/task/119-下单后自动进入只读核单闭环.md
  • 归档提交:9824d4d

工单保持打开,等待用户真机验收。验收通过后再关闭并勾选父工单 #1。

本地归档已提交: - 文档:`docs/task/119-下单后自动进入只读核单闭环.md` - 归档提交:`9824d4d` 工单保持打开,等待用户真机验收。验收通过后再关闭并勾选父工单 #1。
Author
Owner

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

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