增强双微信系统选择器识别并安全返回 PDD #263

Open
opened 2026-08-18 10:08:27 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#96
  • 所属 MVP / 版本:#97 真实采购首单闭环(不支付)
  • 阶段:阶段 3/4,提交后只读核单与真实设备验收

要解决什么

最新 Client 对真实采购任务完成一次提交后,会按设计记录 PURCHASE_OUTCOME_UNKNOWN 并在 5 秒后进入只读核单。真机显示两个微信候选的 Android 应用选择器时,#261 的严格识别没有命中:代码尝试启动 PDD,但选择器仍覆盖前台,最终以 RECONCILE_ORDER_PAGE_TIMEOUT / PDD 正在从微信中间页恢复 转人工。

现有识别依赖控件树主包至少出现 3 次、组合后的 _label() 精确等于标题或“微信”,容易被混合包名、text 与 content-desc 重复值、OEM Resolver 包名和标题差异破坏。

做什么 / 不做什么

  • 做:把选择器语义证据与前台包/Activity 证据分开采集;分别读取 text 和 content-desc;兼容确认过的 Android Resolver 包和标题变体;无法确认时输出明确诊断;保留一次返回门禁和回归测试。
  • 不做:不修改提交订单和 PURCHASE_OUTCOME_UNKNOWN 语义;不选择任何微信;不点击“仅此一次”“始终”“去支付”或其他支付控件;不循环返回、不重新下单、不付款;不修改 Admin、数据库结构或存量任务。

怎么做

  • 修改 client/src/pdd_u2_purchase_reconcile_adapter.py:
    • 独立提取每个节点的 text / content-desc,不使用拼接标签判断选择器。
    • 先检查白名单选择器标题及微信候选,再读取 app_current() 的 package/activity 作为前台证据;不再要求控件树中至少 3 个 android 节点。
    • 包名只接受 Android 标准 Resolver 包;Activity 只接受 ChooserActivity / ResolverActivity 精确值或安全后缀。
    • 语义像选择器但前台证据不可信时返回 RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED;一次返回后仍存在时返回 RECONCILE_ANDROID_CHOOSER_STUCK。
  • 修改 client/test/test_pdd_u2_purchase_reconcile_adapter.py:增加混合包名、text/content-desc 重复、Resolver 包、标题变体、未知 Activity 和未知系统页面测试。
  • 同步 docs/client/06-quality-security.md 中稳定的识别和一次返回规则;不记录原始控件树或账号信息。

验收标准

  • 两个微信候选且节点包名混合时,可信 package/activity 组合可以识别选择器并只按一次返回。
  • text 与 content-desc 同时包含相同标题或微信名称时仍能正确识别。
  • Android 标准 Resolver 包和确认过的标题变体通过。
  • 语义像选择器但 package/activity 不可信时停止并返回明确错误,不按返回。
  • 未知系统页面不会触发返回,普通微信外部跳转仍沿用原 PDD 恢复逻辑。
  • 一次返回后仍是选择器时停止,不重复返回或启动 PDD。
  • 不选择微信、不点击支付、不改变不可逆标记、不重新下单或付款。
  • Python 3.10 定向测试、Client 回归、语法检查和离屏 UI 冒烟完成。

怎么验证

从 client/ 执行:

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 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
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

真机只允许对已提交订单执行只读核单。需要手机重新确认 ADB 调试授权;不得为了验收再次提交订单或触发付款。

风险和回退

风险是误把其他系统页面识别成选择器并按返回。必须同时具备标题、微信候选、可信前台 package/activity,且最多返回一次。回退时恢复 #261 的严格识别并安全转人工;不可清除不可逆标记或重启下单流程。

## 基本信息 - 类型:缺陷 - 父级大工单:#96 - 所属 MVP / 版本:#97 真实采购首单闭环(不支付) - 阶段:阶段 3/4,提交后只读核单与真实设备验收 ## 要解决什么 最新 Client 对真实采购任务完成一次提交后,会按设计记录 `PURCHASE_OUTCOME_UNKNOWN` 并在 5 秒后进入只读核单。真机显示两个微信候选的 Android 应用选择器时,#261 的严格识别没有命中:代码尝试启动 PDD,但选择器仍覆盖前台,最终以 `RECONCILE_ORDER_PAGE_TIMEOUT / PDD 正在从微信中间页恢复` 转人工。 现有识别依赖控件树主包至少出现 3 次、组合后的 `_label()` 精确等于标题或“微信”,容易被混合包名、`text` 与 `content-desc` 重复值、OEM Resolver 包名和标题差异破坏。 ## 做什么 / 不做什么 - 做:把选择器语义证据与前台包/Activity 证据分开采集;分别读取 `text` 和 `content-desc`;兼容确认过的 Android Resolver 包和标题变体;无法确认时输出明确诊断;保留一次返回门禁和回归测试。 - 不做:不修改提交订单和 `PURCHASE_OUTCOME_UNKNOWN` 语义;不选择任何微信;不点击“仅此一次”“始终”“去支付”或其他支付控件;不循环返回、不重新下单、不付款;不修改 Admin、数据库结构或存量任务。 ## 怎么做 - 修改 `client/src/pdd_u2_purchase_reconcile_adapter.py`: - 独立提取每个节点的 `text` / `content-desc`,不使用拼接标签判断选择器。 - 先检查白名单选择器标题及微信候选,再读取 `app_current()` 的 package/activity 作为前台证据;不再要求控件树中至少 3 个 `android` 节点。 - 包名只接受 Android 标准 Resolver 包;Activity 只接受 `ChooserActivity` / `ResolverActivity` 精确值或安全后缀。 - 语义像选择器但前台证据不可信时返回 `RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED`;一次返回后仍存在时返回 `RECONCILE_ANDROID_CHOOSER_STUCK`。 - 修改 `client/test/test_pdd_u2_purchase_reconcile_adapter.py`:增加混合包名、`text/content-desc` 重复、Resolver 包、标题变体、未知 Activity 和未知系统页面测试。 - 同步 `docs/client/06-quality-security.md` 中稳定的识别和一次返回规则;不记录原始控件树或账号信息。 ## 验收标准 - [ ] 两个微信候选且节点包名混合时,可信 package/activity 组合可以识别选择器并只按一次返回。 - [ ] `text` 与 `content-desc` 同时包含相同标题或微信名称时仍能正确识别。 - [ ] Android 标准 Resolver 包和确认过的标题变体通过。 - [ ] 语义像选择器但 package/activity 不可信时停止并返回明确错误,不按返回。 - [ ] 未知系统页面不会触发返回,普通微信外部跳转仍沿用原 PDD 恢复逻辑。 - [ ] 一次返回后仍是选择器时停止,不重复返回或启动 PDD。 - [ ] 不选择微信、不点击支付、不改变不可逆标记、不重新下单或付款。 - [ ] Python 3.10 定向测试、Client 回归、语法检查和离屏 UI 冒烟完成。 ## 怎么验证 从 `client/` 执行: ```powershell 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 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 $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` 真机只允许对已提交订单执行只读核单。需要手机重新确认 ADB 调试授权;不得为了验收再次提交订单或触发付款。 ## 风险和回退 风险是误把其他系统页面识别成选择器并按返回。必须同时具备标题、微信候选、可信前台 package/activity,且最多返回一次。回退时恢复 #261 的严格识别并安全转人工;不可清除不可逆标记或重启下单流程。
Author
Owner

实施完成,待用户验收

最终实现

  • 分别读取节点 text 与 content-desc,不再因拼接值导致标题或微信候选匹配失败。
  • 选择器语义与前台 package/activity 分开校验;支持 android、com.android.intentresolver 及 ChooserActivity / ResolverActivity 安全后缀。
  • 选择器判断提前到 PDD 控件树判断之前,支持系统选择器和底层 PDD 节点同时存在。
  • 微信候选名称允许“微信”开头,兼容分身名称差异。
  • 仍然最多按一次返回;未知系统组件和返回后仍存在的选择器都会安全停止。
  • 未修改订单提交、PURCHASE_OUTCOME_UNKNOWN、不可逆标记或存量任务。

验证结果

  • Python 语法检查:通过。
  • 核单 Adapter、采购恢复和采购服务定向测试:47 项通过。
  • 完整 Client 测试:513 项通过,2 项既有版本号断言失败,与本工单无关。
  • 离屏界面冒烟:输出 OK。
  • 真机未验证:ADB 服务因版本不一致自动重启后,设备需要重新确认调试授权;没有重新提交订单、触发支付或修改 cg46 数据。

提交与归档

  • 实现提交:2a0c17a
  • 归档提交:6fa23dc
  • 归档:docs/task/263-增强双微信系统选择器识别并安全返回PDD.md

当前运行中的 Client 启动于本提交之前,真机验收前必须确认 ADB 授权并重启 Client,再通过 #262 对 cg46 执行“继续核单”。

状态:待用户验收。

## 实施完成,待用户验收 ### 最终实现 - 分别读取节点 `text` 与 `content-desc`,不再因拼接值导致标题或微信候选匹配失败。 - 选择器语义与前台 package/activity 分开校验;支持 `android`、`com.android.intentresolver` 及 `ChooserActivity` / `ResolverActivity` 安全后缀。 - 选择器判断提前到 PDD 控件树判断之前,支持系统选择器和底层 PDD 节点同时存在。 - 微信候选名称允许“微信”开头,兼容分身名称差异。 - 仍然最多按一次返回;未知系统组件和返回后仍存在的选择器都会安全停止。 - 未修改订单提交、`PURCHASE_OUTCOME_UNKNOWN`、不可逆标记或存量任务。 ### 验证结果 - Python 语法检查:通过。 - 核单 Adapter、采购恢复和采购服务定向测试:47 项通过。 - 完整 Client 测试:513 项通过,2 项既有版本号断言失败,与本工单无关。 - 离屏界面冒烟:输出 `OK`。 - 真机未验证:ADB 服务因版本不一致自动重启后,设备需要重新确认调试授权;没有重新提交订单、触发支付或修改 `cg46` 数据。 ### 提交与归档 - 实现提交:`2a0c17a` - 归档提交:`6fa23dc` - 归档:`docs/task/263-增强双微信系统选择器识别并安全返回PDD.md` 当前运行中的 Client 启动于本提交之前,真机验收前必须确认 ADB 授权并重启 Client,再通过 #262 对 `cg46` 执行“继续核单”。 状态:待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#263