修复只读核单前台误判并合并订单详情多视口字段 #122

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

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:MVP 后续真实采购核单
  • 阶段:不可逆下单后的只读订单核对

要解决什么

真实采购进入待付款订单详情后,当前核单存在两个问题:

  1. 部分设备的 app_current() 错误返回系统设置包名,即使无障碍控件树明确属于 PDD,代码仍报“核单时 PDD 不在前台”。
  2. 商品编号、规格、数量和金额位于订单详情上半屏,订单编号和下单时间位于下半屏;当前代码逐屏独立解析,只保留带订单号的屏幕,导致候选字段不完整,严格匹配失败并转人工处理。

复现:真实下单后停留在待付款订单详情;本地执行记录已有 irreversible_action_at;自动核单返回 RECONCILE_READ_FAILED 或 ORDER_NOT_FOUND,但人工向下读取能找到唯一订单号和下单时间。

做什么 / 不做什么

  • 做:核单时优先用控件树识别 PDD 页面;仅在控件树证据���足时使用 app_current() 兜底。
  • 做:在同一个、�����歧义的订单详情上下滚动时累积字段证据,合并成一个完整候选。
  • 做:增加多视口、前台误报和歧义保护测试。
  • 不做:不弱化最终严格匹配,不用任务参数伪造界面缺失字段。
  • 不做:不点击支付、取消订单,不重新下单,不修改数据库结构和 Admin 接口。

怎么做

  • 修改 client/src/pdd_u2_purchase_reconcile_adapter.py:增加控件树包名识别;提取不依赖订单号的单屏证据;只在单订单详情上下文中合并相邻视口证据;发现多个订单号或冲突字段时停止合并并保留不完整候选。
  • 修改 client/test/test_pdd_u2_purchase_reconcile_adapter.py:用脱敏 XML 构造上半屏/下半屏,验证字段合并、错误 app_current() 兜底以及多订单不误合并。
  • 保持 PurchaseReconcileService._candidate_matches() 的严格条件不变。

验收标准

  • 控件树明确包含多个 PDD 包节点时,app_current() 误报其他包不会中断核单。
  • 同一订单详情上半屏的商品/规格/数量/金额能与下半屏的订单号/时间合并。
  • 合并后的候选仍须通过现有商品、规格、数量、金额、未付款状态和时间范围严格匹配。
  • 多订单号、字段冲突或上下文不明时不会跨订单合并。
  • 代码路径不包含支付、取消订单或再次下单操作。
  • Client 自动化测试通过。

怎么验证

从 client/ 目录执行:

C:/Python310/python.exe -m unittest discover -s test -p test_pdd_u2_purchase_reconcile_adapter.py -v
C:/Python310/python.exe -m unittest discover -s test -p test_purchase_recovery.py -v
C:/Python310/python.exe -m unittest discover -s test -v

真机验证:仅在已有 irreversible_action_at 的订单上执行只读核单,确认能读取订单详情上下屏并形成唯一候选;不点击支付或取消订单。

风险和回退

风险:把两个订单卡片或不同订单页面的字段错误拼接,可能造成错误上报。防护方式是仅允许单订单详情上下文合并,订单号或关键字段冲突立即停止合并,并继续由严格匹配转人工处理。回退时恢复本工单提交,任务保持人工核对状态,绝不重新下单。

## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:MVP 后续真实采购核单 - 阶段:不可逆下单后的只读订单核对 ## 要解决什么 真实采购进入待付款订单详情后,当前核单存在两个问题: 1. 部分设备的 `app_current()` 错误返回系统设置包名,即使无障碍控件树明确属于 PDD,代码仍报“核单时 PDD 不在前台”。 2. 商品编号、规格、数量和金额位于订单详情上半屏,订单编号和下单时间位于下半屏;当前代码逐屏独立解析,只保留带订单号的屏幕,导致候选字段不完整,严格匹配失败并转人工处理。 复现:真实下单后停留在待付款订单详情;本地执行记录已有 `irreversible_action_at`;自动核单返回 `RECONCILE_READ_FAILED` 或 `ORDER_NOT_FOUND`,但人工向下读取能找到唯一订单号和下单时间。 ## 做什么 / 不做什么 - 做:核单时优先用控件树识别 PDD 页面;仅在控件树证据���足时使用 `app_current()` 兜底。 - 做:在同一个、�����歧义的订单详情上下滚动时累积字段证据,合并成一个完整候选。 - 做:增加多视口、前台误报和歧义保护测试。 - 不做:不弱化最终严格匹配,不用任务参数伪造界面缺失字段。 - 不做:不点击支付、取消订单,不重新下单,不修改数据库结构和 Admin 接口。 ## 怎么做 - 修改 `client/src/pdd_u2_purchase_reconcile_adapter.py`:增加控件树包名识别;提取不依赖订单号的单屏证据;只在单订单详情上下文中合并相邻视口证据;发现多个订单号或冲突字段时停止合并并保留不完整候选。 - 修改 `client/test/test_pdd_u2_purchase_reconcile_adapter.py`:用脱敏 XML 构造上半屏/下半屏,验证字段合并、错误 `app_current()` 兜底以及多订单不误合并。 - 保持 `PurchaseReconcileService._candidate_matches()` 的严格条件不变。 ## 验收标准 - [x] 控件树明确包含多个 PDD 包节点时,`app_current()` 误报其他包不会中断核单。 - [x] 同一订单详情上半屏的商品/规格/数量/金额能与下半屏的订单号/时间合并。 - [x] 合并后的候选仍须通过现有商品、规格、数量、金额、未付款状态和时间范围严格匹配。 - [x] 多订单号、字段冲突或上下文不明时不会跨订单合并。 - [x] 代码路径不包含支付、取消订单或再次下单操作。 - [x] Client 自动化测试通过。 ## 怎么验证 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -p test_pdd_u2_purchase_reconcile_adapter.py -v C:/Python310/python.exe -m unittest discover -s test -p test_purchase_recovery.py -v C:/Python310/python.exe -m unittest discover -s test -v ``` 真机验证:仅在已有 `irreversible_action_at` 的订单上执行只读核单,确认能读取订单详情上下屏并形成唯一候选;不点击支付或取消订单。 ## 风险和回退 风险:把两个订单卡片或不同订单页面的字段错误拼接,可能造成错误上报。防护方式是仅允许单订单详情上下文合并,订单号或关键字段冲突立即停止合并,并继续由严格匹配转人工处理。回退时恢复本工单提交,任务保持人工核对状态,绝不重新下单。
Author
Owner

状态:进行中。已确认根因:核单入口过早信任 app_current;订单详情扫描只保留带订单号的单屏候选。开始按已确认方案实现控件树优先识别和单订单详情多视口证据合并,保持最终严格匹配不变。

状态:进行中。已确认根因:核单入口过早信任 app_current;订单详情扫描只保留带订单号的单屏候选。开始按已确认方案实现控件树优先识别和单订单详情多视口证据合并,保持最终严格匹配不变。
Author
Owner

状态:待用户验收。

实现完成:

  • a8f8e73:控件树优先识别 PDD 前台;仅在单订单详情中合并上下视口字段;关键字段冲突时拒绝合并;保持最终严格匹配及只读安全边界。
  • 0f5d38b:归档 docs/task/122-只读核单多视口证据合并.md。

验证:

  • 核单 Adapter 定向测试 6 项通过;
  • 采购恢复定向测试 8 项通过;
  • Client 完整测试 349 项通过;
  • git diff --check 通过。

未验证:未在真实 Android 设备上重新执行自动核单。现有旧任务已进入 reconcile_manual_review,安全状态机不会自动重试,本任务未重置数据库状态,也未点击支付、取消订单或重新下单。

状态:待用户验收。 实现完成: - `a8f8e73`:控件树优先识别 PDD 前台;仅在单订单详情中合并上下视口字段;关键字段冲突时拒绝合并;保持最终严格匹配及只读安全边界。 - `0f5d38b`:归档 `docs/task/122-只读核单多视口证据合并.md`。 验证: - 核单 Adapter 定向测试 6 项通过; - 采购恢复定向测试 8 项通过; - Client 完整测试 349 项通过; - `git diff --check` 通过。 未验证:未在真实 Android 设备上重新执行自动核单。现有旧任务已进入 `reconcile_manual_review`,安全状态机不会自动重试,本任务未重置数据库状态,也未点击支付、取消订单或重新下单。
Author
Owner

真机后续发现微信中间页约 20 秒返回时存在过渡页过早失败,已拆分为 #124 继续修复;#122 的控件树优先和多视口合并仍保留。

真机后续发现微信中间页约 20 秒返回时存在过渡页过早失败,已拆分为 #124 继续修复;#122 的控件树优先和多视口合并仍保留。
Author
Owner

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

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