完善真实提交后的未付款订单核对与崩溃恢复 #100

Closed
opened 2026-08-10 14:37:47 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#96
  • 所属 MVP / 版本:#97
  • 阶段:阶段 3——提交后核单与不可逆恢复

要解决什么

提交后可能跳转、断网、崩溃或响应不确定。必须识别唯一匹配的未付款订单;无法确认时转人工,绝不能因为没有成功页而再次下单。

做什么 / 不做什么

  • 做:真实提交后通过 uiautomator2 进入待付款订单列表/详情,按商品、规格、数量、金额和时间唯一匹配,获取并保存订单编号 order_no 和下单时间 ordered_at;恢复不可逆运行;幂等回传。
  • 不做:本阶段不获取快递公司、快递单号或物流轨迹;不重新进入商品页、不重新选规格、不再次提交、不取消、不付款、不绕过安全校验。

怎么做

  • 扩展只读核单 Adapter,只允许读取订单列表/详情和未付款状态,不暴露购买、提交、取消或付款动作。
  • irreversible_action_at 有值时只走核单;唯一匹配的未付款订单才成功,0 个、多个或字段不符���转人工。
  • 结果记录必要订单标识、核对字段、未付款状态和时间,不记录 Cookie、token、支付信息或个人数据。
  • Outbox 与 Admin 幂等;重启可重复核对和补报,但不能产生第二次手机写操作。
  • 详情显示“已提交待付款”“结果不确定”“多个候选”等中文状态。
  • 预计文件:Client reconcile service/Adapter/task repository/详情视图/结果模型/Outbox/网关和测试文档。

验收标准

  • 不可逆标记存在时采购 Adapter 调用次数为 0。
  • 唯一匹配且未付款才成功并幂等回传。
  • 0 个、多候选、字段不符或非未付款状态转人工。
  • 断网、崩溃、重启只核单补报,不重下。
  • 只读接口无提交、取消和付款方法。
  • 数据与日志无凭据和不必要个人数据。
  • 页面明确人工处理步骤。

怎么验证

cd D:\chengma\cmautobuy\client
C:/Python310/python.exe -m unittest test.test_purchase_recovery -v
C:/Python310/python.exe -m unittest discover -s test -v

Mock 覆盖唯一/无/多候选、断网、重启、重复核对和补报;真实核单只在集成工单执行。

风险和回退

字段必须全部匹配且候选唯一,否则人工处理。回退仍保留不可逆标记和只读核单,任何版本都不得重新下单。

## 基本信息 - 类型:需求 - 父级大工单:#96 - 所属 MVP / 版本:#97 - 阶段:阶段 3——提交后核单与不可逆恢复 ## 要解决什么 提交后可能跳转、断网、崩溃或响应不确定。必须识别唯一匹配的未付款订单;无法确认时转人工,绝不能因为没有成功页而再次下单。 ## 做什么 / 不做什么 - 做:真实提交后通过 uiautomator2 进入待付款订单列表/详情,按商品、规格、数量、金额和时间唯一匹配,获取并保存订单编号 `order_no` 和下单时间 `ordered_at`;恢复不可逆运行;幂等回传。 - 不做:本阶段不获取快递公司、快递单号或物流轨迹;不重新进入商品页、不重新选规格、不再次提交、不取消、不付款、不绕过安全校验。 ## 怎么做 - 扩展只读核单 Adapter,只允许读取订单列表/详情和未付款状态,不暴露购买、提交、取消或付款动作。 - `irreversible_action_at` 有值时只走核单;唯一匹配的未付款订单才成功,0 个、多个或字段不符���转人工。 - 结果记录必要订单标识、核对字段、未付款状态和时间,不记录 Cookie、token、支付信息或个人数据。 - Outbox 与 Admin 幂等;重启可重复核对和补报,但不能产生第二次手机写操作。 - 详情显示“已提交待付款”“结果不确定”“多个候选”等中文状态。 - 预计文件:Client reconcile service/Adapter/task repository/详情视图/结果模型/Outbox/网关和测试文档。 ## 验收标准 - [x] 不可逆标记存在时采购 Adapter 调用次数为 0。 - [x] 唯一匹配且未付款才成功并幂等回传。 - [x] 0 个、多候选、字段不符或非未付款状态转人工。 - [x] 断网、崩溃、重启只核单补报,不重下。 - [x] 只读接口无提交、取消和付款方法。 - [x] 数据与日志无凭据和不必要个人数据。 - [x] 页面明确人工处理步骤。 ## 怎么验证 ```powershell cd D:\chengma\cmautobuy\client C:/Python310/python.exe -m unittest test.test_purchase_recovery -v C:/Python310/python.exe -m unittest discover -s test -v ``` Mock 覆盖唯一/无/多候选、断网、重启、重复核对和补报;真实核单只在集成工单执行。 ## 风险和回退 字段必须全部匹配且候选唯一,否则人工处理。回退仍保留不可逆标记和只读核单,任何版本都不得重新下单。
Author
Owner

实施前检查补充:现有只读核单骨架会把 matched 也停在人工处理,且不可逆记录未保存提交前确认金额,正式 MainWindow 也未注入 uiautomator2 核单 factory。

本工单将在既定范围内补齐:

  • 不可逆标记与最终确认快照(规格、数量、单价、总价)同事务保存;
  • 领域层按商品、完整规格、数量、总价、下单时间和未付款状态严格过滤,只有唯一候选自动成功;
  • matched 原子写入 live pdd_data 与 purchase_result Outbox,后续只补报;
  • 0 个、多候选、字段缺失/不符、非未付款或读取异常保留 manual_review,不产生成功 Outbox;
  • 新增只读 uiautomator2 核单 Adapter 并注入正式 Client,接口不提供提交、取消或付款方法;
  • 真机核单留给集成工单,本工单只跑脱敏 XML/Mock 和全量回归。
实施前检查补充:现有只读核单骨架会把 matched 也停在人工处理,且不可逆记录未保存提交前确认金额,正式 MainWindow 也未注入 uiautomator2 核单 factory。 本工单将在既定范围内补齐: - 不可逆标记与最终确认快照(规格、数量、单价、总价)同事务保存; - 领域层按商品、完整规格、数量、总价、下单时间和未付款状态严格过滤,只有唯一候选自动成功; - matched 原子写入 live pdd_data 与 purchase_result Outbox,后续只补报; - 0 个、多候选、字段缺失/不符、非未付款或读取异常保留 manual_review,不产生成功 Outbox; - 新增只读 uiautomator2 核单 Adapter 并注入正式 Client,接口不提供提交、取消或付款方法; - 真机核单留给集成工单,本工单只跑脱敏 XML/Mock 和全量回归。
Author
Owner

实现与自动化验证完成,准备提交:

  • 最终确认快照与 irreversible_action_at 同事务保存。
  • 领域服务严格匹配商品编号、完整规格、数量、确认总价、时间范围和 unpaid 状态;仅唯一候选生成 purchase_result Outbox。
  • matched 结果保存 order_no、ordered_at、payment_status=unpaid,明确 payment_attempted=false。
  • 0 个、多候选、字段不符、非未付款、读取异常均进入 manual_review,不产生成功 Outbox。
  • 重启后 result_pending 只补交原 Outbox,不再读取手机;相同 attempt 的结果键幂等。
  • 正式 Client 已注入只读 uiautomator2 核单 Adapter,只含白名单导航、返回、滚动和读取,不含提交、取消、付款方法。
  • 任务详情增加“已提交待付款”“结果不确定或多个候选”等中文步骤。

验证:

  • Client 全量:291 passed。
  • PyQt5 离屏主窗口:OK。
  • 未连接 Wi-Fi Android 设备,未执行真实订单核对或任何下单/付款操作。
实现与自动化验证完成,准备提交: - 最终确认快照与 irreversible_action_at 同事务保存。 - 领域服务严格匹配商品编号、完整规格、数量、确认总价、时间范围和 unpaid 状态;仅唯一候选生成 purchase_result Outbox。 - matched 结果保存 order_no、ordered_at、payment_status=unpaid,明确 payment_attempted=false。 - 0 个、多候选、字段不符、非未付款、读取异常均进入 manual_review,不产生成功 Outbox。 - 重启后 result_pending 只补交原 Outbox,不再读取手机;相同 attempt 的结果键幂等。 - 正式 Client 已注入只读 uiautomator2 核单 Adapter,只含白名单导航、返回、滚动和读取,不含提交、取消、付款方法。 - 任务详情增加“已提交待付款”“结果不确定或多个候选”等中文步骤。 验证: - Client 全量:291 passed。 - PyQt5 离屏主窗口:OK。 - 未连接 Wi-Fi Android 设备,未执行真实订单核对或任何下单/付款操作。
Author
Owner

已完成并进入待验收:

  • 实现提交:df67b0e(feat: 完善真实采购订单核对与恢复 (#100))
  • 归档提交:8931162(docs: 归档任务 #100)
  • 本地归档:docs/task/100-真实采购订单核对与崩溃恢复.md
  • Client 全量测试:291 passed
  • PyQt5 离屏主窗口:OK

未连接 Wi-Fi Android 设备,未执行真实 PDD 核单、下单、取消或付款。真实订单页字段和导航行为留给集成工单按当次授权验证。工单保持打开,等待用户验收。

已完成并进入待验收: - 实现提交:df67b0e(feat: 完善真实采购订单核对与恢复 (#100)) - 归档提交:8931162(docs: 归档任务 #100) - 本地归档:docs/task/100-真实采购订单核对与崩溃恢复.md - Client 全量测试:291 passed - PyQt5 离屏主窗口:OK 未连接 Wi-Fi Android 设备,未执行真实 PDD 核单、下单、取消或付款。真实订单页字段和导航行为留给集成工单按当次授权验证。工单保持打开,等待用户验收。
Author
Owner

需求边界补充(用户于 2026-08-10 再次确认):本工单就是 Client 的“下单后获取订单编号和下单时间”。实现应在真实提交后进入只读核单,唯一匹配未付款订单后保存 order_no 与 ordered_at。

快递单号在卖家发货后才存在,不属于本工单;后续应作为独立的只读物流查询需求评审。本工单继续保持打开、待真机订单页验收,不重复创建目标相同的新工单。

需求边界补充(用户于 2026-08-10 再次确认):本工单就是 Client 的“下单后获取订单编号和下单时间”。实现应在真实提交后进入只读核单,唯一匹配未付款订单后保存 `order_no` 与 `ordered_at`。 快递单号在卖家发货后才存在,不属于本工单;后续应作为独立的只读物流查询需求评审。本工单继续保持打开、待真机订单页验收,不重复创建目标相同的新工单。
Author
Owner

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

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