接入正式 uiautomator2 采购演练 Adapter #75

Closed
opened 2026-08-10 00:47:32 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷 / 需求补全
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP)
  • 阶段:5. 采购演练与恢复
  • 依赖:#71、#72、#73
  • 状态:进行中

要解决什么

Admin 中已指派给当前 Client 的采购任务仍无法领取。实际检查确认 Client 启动入口没有注入正式 PddPurchaseAdapter,因此 TaskDispatcher.purchase_ready 为 false,claim 只声明 supported_types: ["collect"],Admin 按类型过滤后返回 204。

做什么 / 不做什么

做

  • 实现正式 uiautomator2 采购演练 Adapter,复用现有设备会话、商品页等待、规格面板定位和精确规格选择能力。
  • 支持打开并确认 PDD 商品页、打开规格面板、按完整 options 选择当前 Admin 已支持的颜色与尺码、读取选中规格/数量/人民币分价格、进入最终提交前确认状态并停止。
  • 将 Adapter 工厂注入 Client 正式启动装配,使设备和 Adapter 就绪时 claim 声明 collect,purchase。
  • 页面不确定、目标规格不可用、价格或数量无法可靠读取、验证码、登录失效、风控或设备断开时结构化失败并停止。
  • 使用 Fake Device 和脱敏 XML 测试领取能力、页面操作顺序、结果结构与安全停止。
  • 更新 Client 架构和质量安全基线。

不做

  • 不点击提交订单,不创建真实订单,不付款。
  • 不增加 submit_order、付款或绕过验证码/风控的方法。
  • 不实现真实下单模式;purchase_mode 继续固定为 dry_run。
  • 不把 demo 脚本的硬编码设备、商品或文件输出带入正式服务。
  • 不保证所有未来 PDD A/B 页面;无法可靠识别时转人工。

已确认的实现方案

  • 新建生产级 uiautomator2 Adapter;应用层继续只依赖 #71 定义的窄接口。
  • 设备连接通过 PddDeviceService,会话由采购工作线程独占。
  • Adapter 每次 read_state 都重新读取当前包名和无障碍控件树;不复用旧 XML 坐标。
  • 规格按 options 的完整键值精确匹配。当前 Admin 实际下发 color、size;遇到不支持的动态维度明确拒绝,不做相似匹配。
  • “进入确认”只执行规格面板底部进入下一页/下一状态的动作;到达任何可能提交订单的按钮后立即停止,不点击最终提交。
  • 正式装配只注入 dry-run Adapter 工厂;能力门禁仍由 TaskDispatcher 集中判断。

预计修改:client/src 下生产 Adapter、启动装配、必要解析辅助;对应测试;docs/client 基线。

验收标准

  • 正式 Client 启动入口注入采购演练 Adapter,已保存 Android 设备时 claim 声明 collect,purchase。
  • Admin 指派给当前 Client 的合法采购任务可以领取并先写入 SQLite。
  • Adapter 通过正式 PddDeviceService 独占连接设备。
  • 商品、规格、数量和人民币分价格均使用最新页面状态核对。
  • 只支持精确规格匹配,不支持的维度或不确定页面安全停止。
  • 演练最多到最终提交前,代码没有提交订单和付款入口。
  • 验证码、登录失效、风控、设备断开等保留稳定错误和诊断。
  • purchase_mode=live 继续被拒绝。
  • 专项测试、全量 unittest、语法检查和离屏 UI 冒烟通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_adapter.py src/ui_main.py
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_u2_purchase_adapter.py" -v
C:/Python310/python.exe -m unittest discover -s test -p "test_task_dispatcher.py" -v
C:/Python310/python.exe -m unittest discover -s 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

真机验收单独执行:确认任务领取和演练停在最终提交前;不得点击提交订单或付款。

风险和回退

  • PDD 页面结构可能变化;无法可靠确认时转人工,不扩大点击范围。
  • 采购演练属于安全关键代码,回退时撤销 Adapter 注入即可恢复为只声明 collect,保留任务、运行历史和 Outbox。
  • 本工单不代表真实下单安全门禁放行。
## 基本信息 - 类型:缺陷 / 需求补全 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP) - 阶段:5. 采购演练与恢复 - 依赖:#71、#72、#73 - 状态:进行中 ## 要解决什么 Admin 中已指派给当前 Client 的采购任务仍无法领取。实际检查确认 Client 启动入口没有注入正式 `PddPurchaseAdapter`,因此 `TaskDispatcher.purchase_ready` 为 false,claim 只声明 `supported_types: ["collect"]`,Admin 按类型过滤后返回 204。 ## 做什么 / 不做什么 ### 做 - 实现正式 uiautomator2 采购演练 Adapter,复用现有设备会话、商品页等待、规格面板定位和精确规格选择能力。 - 支持打开并确认 PDD 商品页、打开规格面板、按完整 options 选择当前 Admin 已支持的颜色与尺码、读取选中规格/数量/人民币分价格、进入最终提交前确认状态并停止。 - 将 Adapter 工厂注入 Client 正式启动装配,使设备和 Adapter 就绪时 claim 声明 `collect,purchase`。 - 页面不确定、目标规格不可用、价格或数量无法可靠读取、验证码、登录失效、风控或设备断开时结构化失败并停止。 - 使用 Fake Device 和脱敏 XML 测试领取能力、页面操作顺序、结果结构与安全停止。 - 更新 Client 架构和质量安全基线。 ### 不做 - 不点击提交订单,不创建真实订单,不付款。 - 不增加 `submit_order`、付款或绕过验证码/风控的方法。 - 不实现真实下单模式;`purchase_mode` 继续固定为 `dry_run`。 - 不把 demo 脚本的硬编码设备、商品或文件输出带入正式服务。 - 不保证所有未来 PDD A/B 页面;无法可靠识别时转人工。 ## 已确认的实现方案 - 新建生产级 uiautomator2 Adapter;应用层继续只依赖 #71 定义的窄接口。 - 设备连接通过 `PddDeviceService`,会话由采购工作线程独占。 - Adapter 每次 `read_state` 都重新读取当前包名和无障碍控件树;不复用旧 XML 坐标。 - 规格按 options 的完整键值精确匹配。当前 Admin 实际下发 `color`、`size`;遇到不支持的动态维度明确拒绝,不做相似匹配。 - “进入确认”只执行规格面板底部进入下一页/下一状态的动作;到达任何可能提交订单的按钮后立即停止,不点击最终提交。 - 正式装配只注入 dry-run Adapter 工厂;能力门禁仍由 `TaskDispatcher` 集中判断。 预计修改:`client/src` 下生产 Adapter、启动装配、必要解析辅助;对应测试;`docs/client` 基线。 ## 验收标准 - [ ] 正式 Client 启动入口注入采购演练 Adapter,已保存 Android 设备时 claim 声明 `collect,purchase`。 - [ ] Admin 指派给当前 Client 的合法采购任务可以领取并先写入 SQLite。 - [ ] Adapter 通过正式 `PddDeviceService` 独占连接设备。 - [ ] 商品、规格、数量和人民币分价格均使用最新页面状态核对。 - [ ] 只支持精确规格匹配,不支持的维度或不确定页面安全停止。 - [ ] 演练最多到最终提交前,代码没有提交订单和付款入口。 - [ ] 验证码、登录失效、风控、设备断开等保留稳定错误和诊断。 - [ ] `purchase_mode=live` 继续被拒绝。 - [ ] 专项测试、全量 unittest、语法检查和离屏 UI 冒烟通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_adapter.py src/ui_main.py C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_u2_purchase_adapter.py" -v C:/Python310/python.exe -m unittest discover -s test -p "test_task_dispatcher.py" -v C:/Python310/python.exe -m unittest discover -s 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 ``` 真机验收单独执行:确认任务领取和演练停在最终提交前;不得点击提交订单或付款。 ## 风险和回退 - PDD 页面结构可能变化;无法可靠确认时转人工,不扩大点击范围。 - 采购演练属于安全关键代码,回退时撤销 Adapter 注入即可恢复为只声明 collect,保留任务、运行历史和 Outbox。 - 本工单不代表真实下单安全门禁放行。
Author
Owner

????:?? uiautomator2 ???? Adapter ?????? MainWindow????????????????????????/??????????????/??/??/??;??????????,?????????????????????????????????????????

????:

  • Client ??????:211 ???
  • py_compile:??
  • ?????? XML:????????,?????????
  • ??????????????,?????????
????:?? uiautomator2 ???? Adapter ?????? MainWindow????????????????????????/??????????????/??/??/??;??????????,????????????????????????????????????????? ????: - Client ??????:211 ??? - py_compile:?? - ?????? XML:????????,????????? - ??????????????,?????????
Author
Owner

????,???????

????:7e90af0 feat: ??????????? (#75)
????:93bbca8 docs: ???? #75
????:docs/task/75-???????????.md

????:Client ?? 211 ?????,??????,?????? XML ?????????? Android ????????;?????????????,????????????

????,??????? ????:`7e90af0 feat: ??????????? (#75)` ????:`93bbca8 docs: ???? #75` ????:`docs/task/75-???????????.md` ????:Client ?? 211 ?????,??????,?????? XML ?????????? Android ????????;?????????????,????????????
Author
Owner

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

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