diff --git a/docs/task/263-增强双微信系统选择器识别并安全返回PDD.md b/docs/task/263-增强双微信系统选择器识别并安全返回PDD.md new file mode 100644 index 0000000..d6dfc10 --- /dev/null +++ b/docs/task/263-增强双微信系统选择器识别并安全返回PDD.md @@ -0,0 +1,62 @@ +# 263 增强双微信系统选择器识别并安全返回 PDD + +- 类型:缺陷 +- 父级大工单:#96 +- 所属 MVP / 版本:#97 真实采购首单闭环(不支付) +- 状态:已完成 +- 日期:2026-08-18 +- Gitea 工单: + +## 背景与目标 + +真实采购提交订单后按设计进入只读核单。真机显示两个微信候选的 Android 应用选择器时,#261 的识别没有命中,代码尝试启动 PDD 后仍被选择器覆盖,最终以 `RECONCILE_ORDER_PAGE_TIMEOUT` 转人工。 + +本任务增强选择器识别,兼容混合节点包名、重复无障碍值和 Android Resolver 变体;证据完整时仍只按一次返回键,绝不选择微信、点击支付或重新下单。 + +## 最终方案 + +- 分别读取每个节点的 `text` 和 `content-desc`,不再使用拼接标签做精确判断。 +- 使用白名单标题和以“微信”开头的候选名称识别页面语义,兼容微信分身的显示名称差异。 +- 页面语义命中后读取 `app_current()`,同时校验 Android 标准 Resolver 包和 `ChooserActivity` / `ResolverActivity` 精确值或安全后缀。 +- 选择器判断先于 PDD 控件树判断,兼容选择器与底层 PDD 节点同时出现在控件树中的情况。 +- 可信选择器最多按一次返回;一次返回后仍存在时返回 `RECONCILE_ANDROID_CHOOSER_STUCK`,前台系统组件不可信时返回 `RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED`。 +- 保留原外部应用恢复、登录/验证/风控停止和 PDD 支付页一次返回规则。 + +最终实现与建单方案一致,没有修改订单提交、`PURCHASE_OUTCOME_UNKNOWN`、数据库、Admin 接口或存量任务。 + +## 改了哪些 + +- `client/src/pdd_u2_purchase_reconcile_adapter.py`:重构选择器语义和前台组件证据,调整判断顺序并保留一次返回门禁。 +- `client/test/test_pdd_u2_purchase_reconcile_adapter.py`:增加混合包名、重复 `text/content-desc`、微信名称变体和独立 Resolver 包测试。 +- `docs/client/06-quality-security.md`:同步多微信选择器的组合证据及安全返回规则。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 混合节点包名和底层 PDD 节点存在时仍识别选择器 | 通过 | +| `text/content-desc` 重复时仍识别标题和微信候选 | 通过 | +| Android 标准 Resolver 包、标题和 Activity 变体通过 | 通过 | +| 前台 package/activity 不可信时停止且不按返回 | 通过 | +| 未知系统页面不触发返回,普通外部跳转保持兼容 | 通过 | +| 一次返回后选择器仍存在时停止,不重复返回 | 通过 | +| 不选择微信、不点击支付、不重新下单或付款 | 通过 | + +## 测试 + +- 执行的命令: + - `C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_reconcile_adapter.py test/test_pdd_u2_purchase_reconcile_adapter.py` + - `C:/Python310/python.exe -m pytest -q --disable-warnings test/test_pdd_u2_purchase_reconcile_adapter.py test/test_purchase_recovery.py test/test_purchase_task_service.py` + - `C:/Python310/python.exe -m pytest -q test` + - 设置 `QT_QPA_PLATFORM=offscreen` 后创建 `MainWindow`。 +- 结果:语法检查通过;定向测试 47 项全部通过;完整 Client 测试 513 项通过、2 项与本工单无关的既有版本号断言失败;离屏界面冒烟输出 `OK`。 +- **没验证到的部分**:未连接真机执行继续核单。诊断时 ADB 服务因客户端版本不一致自动重启,设备当前需要重新确认调试授权;没有重新提交订单、触发支付或修改 `cg46` 数据。 + +## 遗留问题 + +- 真机确认 ADB 调试授权后,需要通过 #262 的同一入口对已提交订单执行一次“继续核单”验收。 +- 工作区 Client 版本为 `0.1.2`,两项更新模块测试仍固定期待 `0.1.0`,不属于本工单范围。 + +## 相关提交 + +- `2a0c17a` 增强双微信选择器识别。