修复慢速前台查询导致 PDD 页面和规格面板误超时 #115

Closed
opened 2026-08-10 18:28:47 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:MVP 后续 / PDD 页面识别与采购安全
  • 阶段:uiautomator2 页面等待稳定性
  • 关联工单:#75、#109、#110、#111

要解决什么

采购任务 PUR-6b402f22021e546f 已成功打开商品页,但在 purchase_select_options 以 PURCHASE_PANEL_TIMEOUT 失败。数据库确认未进入不可逆阶段、未提交订单,失败 Outbox 已成功发送。

真机诊断发现:

  • 设备 app_current() 单次约耗时 10.688 秒,并错误报告前台包名为 com.android.settings;
  • 采购规格面板等待上限为 10 秒,每轮先读取控件树、再调用 app_current();
  • 首次控件树可能仍是点击后的过渡状态,随后慢速 app_current() 耗完整个超时,来不及重新读取已加载完成的面板;
  • 失败后只读检查确认规格面板已打开,控件树包含“增加数量”和“提交订单”,共享分类器可正确分类;
  • 采集规格面板等待不调用 app_current(),但采集和采购的商品页等待均存在每轮调用慢速 app_current() 的风险,可能影响慢加载和 #111 的首页受控重开。

做什么 / 不做什么

做

  • 采集和采购商品页等待优先使用最新控件树中的 PDD 包名与共享页面分类,不在每轮依赖慢速焦点查询。
  • 采购规格面板等待优先使用控件树判断;只有控件树不足以判断时才有限调用前台包名查询。
  • 保证页面判断使用慢调用之后的最新控件树,不用慢调用之前的过渡 XML 作最终结论。
  • 超时预算覆盖一次设备调用耗时,且所有循环仍有明确截止时间和取消检查。
  • 规格面板超时时保存最后一次脱敏控件树诊断引用,能区分“未打开”和“已打开但未识别”。
  • 覆盖慢速、错误前台包名、面板延迟加载、失效链接一次重开等测试。
  • 保持采集与采购共用 #111 的页面分类规则。

不做

  • 不修改 Admin API、数据库结构、pdd_data 或任务状态枚举。
  • 不改变颜色、尺码和价格业务规则。
  • 不自动重跑本次采购任务。
  • 不打开真实下单默认开关,不执行下单或付款。
  • 不绕过登录、验证码或风控。

怎么做

  1. 扩展共享页面分类入口,使调用方可仅凭 PDD 控件树进行可靠分类;前台包名只作为辅助信息。
  2. 调整采集和采购商品页等待:首次或必要时查询前台状态,后续轮询以新控件树为准,避免每轮 10 秒阻塞;保留外部应用、登录、验证码、风控和网络分类。
  3. 调整采购规格面板等待:每轮先读取并解析最新控件树,满足“提交前面板 + 数量控件”等组合特征即成功,不为已确认的 PDD 控件树再调用慢速 app_current()。
  4. 对单次控件树读取做耗时友好的截止检查;操作返回后仍分析本次最新结果,再决定成功或超时。
  5. 在采购 Adapter 中保留最后页面 XML,并在面板超时错误诊断中保存脱敏 artifact(使用现有 data/artifacts 路径机制或最小复用,不写凭据和个人数据)。
  6. 增加采集、采购和共享分类器测试;完成 Client 全量测试和离屏启动。

预计修改文件:

  • client/src/pdd_page_classifier.py
  • client/src/pdd_collect_service.py
  • client/src/pdd_u2_purchase_adapter.py
  • 必要的诊断辅助代码
  • client/test/test_pdd_collect_service.py
  • client/test/test_pdd_u2_purchase_adapter.py
  • client/test/test_pdd_page_classifier.py
  • docs/client/06-quality-security.md

验收标准

  • app_current() 耗时超过规格面板超时时,已加载完成的面板仍能被识别,不误报 PURCHASE_PANEL_TIMEOUT。
  • 前台包名错误报告为设置页时,PDD 控件树仍能确认商品页和规格面板。
  • 采购规格面板等待不在每轮调��� app_current()。
  • 采集和采购商品页等待不会因每轮慢速 app_current() 耗尽 #111 的受控重开流程。
  • 点击后真正未打开面板仍会在明确超时后安全失败,不选择规格、不创建订单。
  • 面板超时诊断包含最后页面类型、读取次数和脱敏 XML artifact 引用。
  • 登录、验证码、风控、网络及外部应用仍保持独立分类。
  • 相关专项测试和 Client 全量测试通过。
  • 真实下单默认开关保持关闭,未执行下单或付款。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_page_classifier.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_collect_service.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_u2_purchase_adapter.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_purchase_task_service.py"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"

真机只读/dry_run 验证:

  1. 使用已保存 Wi-Fi 设备确认焦点 API 仍可错误报告设置页。
  2. 打开有效商品并进入规格面板,确认面板能在不下单的情况下识别。
  3. 使用延迟加载或夹具验证超时诊断。
  4. 不点击最终提交,不付款。

风险和回退

  • 风险:完全忽略前台包名可能把覆盖在 PDD 上的外部页面误认为 PDD;过宽面板条件可能过早进入规格选择。
  • 控制:仅在控件树含足够数量的 PDD 包节点和组合语义时绕过前台包名;规格面板必须同时满足面板语义与数量控件。
  • 回退:本工单不涉及数据库和接口迁移,可按实现提交整体回退到原轮询逻辑;回退后本次超时问题会恢复。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:MVP 后续 / PDD 页面识别与采购安全 - 阶段:uiautomator2 页面等待稳定性 - 关联工单:#75、#109、#110、#111 ## 要解决什么 采购任务 `PUR-6b402f22021e546f` 已成功打开商品页,但在 `purchase_select_options` 以 `PURCHASE_PANEL_TIMEOUT` 失败。数据库确认未进入不可逆阶段、未提交订单,失败 Outbox 已成功发送。 真机诊断发现: - 设备 `app_current()` 单次约耗时 10.688 秒,并错误报告前台包名为 `com.android.settings`; - 采购规格面板等待上限为 10 秒,每轮先读取控件树、再调用 `app_current()`; - 首次控件树可能仍是点击后的过渡状态,随后慢速 `app_current()` 耗完整个超时,来不及重新读取已加载完成的面板; - 失败后只读检查确认规格面板已打开,控件树包含“增加数量”和“提交订单”,共享分类器可正确分类; - 采集规格面板等待不调用 `app_current()`,但采集和采购的商品页等待均存在每轮调用慢速 `app_current()` 的风险,可能影响慢加载和 #111 的首页受控重开。 ## 做什么 / 不做什么 ### 做 - 采集和采购商品页等待优先使用最新控件树中的 PDD 包名与共享页面分类,不在每轮依赖慢速焦点查询。 - 采购规格面板等待优先使用控件树判断;只有控件树不足以判断时才有限调用前台包名查询。 - 保证页面判断使用慢调用之后的最新控件树,不用慢调用之前的过渡 XML 作最终结论。 - 超时预算覆盖一次设备调用耗时,且所有循环仍有明确截止时间和取消检查。 - 规格面板超时时保存最后一次脱敏控件树诊断引用,能区分“未打开”和“已打开但未识别”。 - 覆盖慢速、错误前台包名、面板延迟加载、失效链接一次重开等测试。 - 保持采集与采购共用 #111 的页面分类规则。 ### 不做 - 不修改 Admin API、数据库结构、`pdd_data` 或任务状态枚举。 - 不改变颜色、尺码和价格业务规则。 - 不自动重跑本次采购任务。 - 不打开真实下单默认开关,不执行下单或付款。 - 不绕过登录、验证码或风控。 ## 怎么做 1. 扩展共享页面分类入口,使调用方可仅凭 PDD 控件树进行可靠分类;前台包名只作为辅助信息。 2. 调整采集和采购商品页等待:首次或必要时查询前台状态,后续轮询以新控件树为准,避免每轮 10 秒阻塞;保留外部应用、登录、验证码、风控和网络分类。 3. 调整采购规格面板等待:每轮先读取并解析最新控件树,满足“提交前面板 + 数量控件”等组合特征即成功,不为已确认的 PDD 控件树再调用慢速 `app_current()`。 4. 对单次控件树读取做耗时友好的截止检查;操作返回后仍分析本次最新结果,再决定成功或超时。 5. 在采购 Adapter 中保留最后页面 XML,并在面板超时错误诊断中保存脱敏 artifact(使用现有 data/artifacts 路径机制或最小复用,不写凭据和个人数据)。 6. 增加采集、采购和共享分类器测试;完成 Client 全量测试和离屏启动。 预计修改文件: - `client/src/pdd_page_classifier.py` - `client/src/pdd_collect_service.py` - `client/src/pdd_u2_purchase_adapter.py` - 必要的诊断辅助代码 - `client/test/test_pdd_collect_service.py` - `client/test/test_pdd_u2_purchase_adapter.py` - `client/test/test_pdd_page_classifier.py` - `docs/client/06-quality-security.md` ## 验收标准 - [ ] `app_current()` 耗时超过规格面板超时时,已加载完成的面板仍能被识别,不误报 `PURCHASE_PANEL_TIMEOUT`。 - [ ] 前台包名错误报告为设置页时,PDD 控件树仍能确认商品页和规格面板。 - [ ] 采购规格面板等待不在每轮调��� `app_current()`。 - [ ] 采集和采购商品页等待不会因每轮慢速 `app_current()` 耗尽 #111 的受控重开流程。 - [ ] 点击后真正未打开面板仍会在明确超时后安全失败,不选择规格、不创建订单。 - [ ] 面板超时诊断包含最后页面类型、读取次数和脱敏 XML artifact 引用。 - [ ] 登录、验证码、风控、网络及外部应用仍保持独立分类。 - [ ] 相关专项测试和 Client 全量测试通过。 - [ ] 真实下单默认开关保持关闭,未执行下单或付款。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_page_classifier.py" C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_collect_service.py" C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_u2_purchase_adapter.py" C:/Python310/python.exe -m unittest discover -s test -p "test_purchase_task_service.py" C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" ``` 真机只读/dry_run 验证: 1. 使用已保存 Wi-Fi 设备确认焦点 API 仍可错误报告设置页。 2. 打开有效商品并进入规格面板,确认面板能在不下单的情况下识别。 3. 使用延迟加载或夹具验证超时诊断。 4. 不点击最终提交,不付款。 ## 风险和回退 - 风险:完全忽略前台包名可能把覆盖在 PDD 上的外部页面误认为 PDD;过宽面板条件可能过早进入规格选择。 - 控制:仅在控件树含足够数量的 PDD 包节点和组合语义时绕过前台包名;规格面板必须同时满足面板语义与数量控件。 - 回退:本工单不涉及数据库和接口迁移,可按实现提交整体回退到原轮询逻辑;回退后本次超时问题会恢复。
Author
Owner

状态:进行中。已完成真机只读诊断和本地数据库核对,开始按工单方案实施。当前采购任务未进入不可逆阶段,实施与测试均不重新执行该任务、不点击最终提交、不付款。

状态:**进行中**。已完成真机只读诊断和本地数据库核对,开始按工单方案实施。当前采购任务未进入不可逆阶段,实施与测试均不重新执行该任务、不点击最终提交、不付款。
Author
Owner

状态更新为 待验收(准备提交)。

实现结果:

  • 采集与采购商品页轮询不再每轮调用慢速 app_current(),仅复用连接时一次结果作为辅助;后续以最新控件树和共享分类器为准。
  • 采购规格面板等待完全移除轮询内的 app_current(),直接校验“提交前页面 + 增加数量”等组合特征。
  • 单次控件树读取即使跨过截止时间,仍先分析本次返回结果。
  • 规格面板真正未打开时仍安全返回 PURCHASE_PANEL_TIMEOUT,诊断包含最后页面类型、控件树读取次数和脱敏 XML artifact。
  • 生产采购 Adapter 的 artifact 写入现有 data/artifacts/purchase/<goods_id>/;商品、账号、收货等文字会替换为“[已脱敏]”。
  • 未修改 Admin API、数据库、pdd_data、颜色尺码价格规则和不可逆安全门禁。

验证:

  • 专项:采集 33、采购 Adapter 12、采购服务 11,全部通过。
  • Client 全量:330 个测试通过。
  • 离屏主窗口:通过(OK)。
  • 真机只读:不调用 app_current(),仅用控件树约 860 ms 将当前规格面板识别为 order_confirmation。
  • 未重新执行 PUR-6b402f22021e546f,未点击规格或最终提交,未下单、未付款。
状态更新为 **待验收(准备提交)**。 实现结果: - 采集与采购商品页轮询不再每轮调用慢速 `app_current()`,仅复用连接时一次结果作为辅助;后续以最新控件树和共享分类器为准。 - 采购规格面板等待完全移除轮询内的 `app_current()`,直接校验“提交前页面 + 增加数量”等组合特征。 - 单次控件树读取即使跨过截止时间,仍先分析本次返回结果。 - 规格面板真正未打开时仍安全返回 `PURCHASE_PANEL_TIMEOUT`,诊断包含最后页面类型、控件树读取次数和脱敏 XML artifact。 - 生产采购 Adapter 的 artifact 写入现有 `data/artifacts/purchase/<goods_id>/`;商品、账号、收货等文字会替换为“[已脱敏]”。 - 未修改 Admin API、数据库、pdd_data、颜色尺码价格规则和不可逆安全门禁。 验证: - 专项:采集 33、采购 Adapter 12、采购服务 11,全部通过。 - Client 全量:330 个测试通过。 - 离屏主窗口:通过(`OK`)。 - 真机只读:不调用 `app_current()`,仅用控件树约 860 ms 将当前规格面板识别为 `order_confirmation`。 - 未重新执行 `PUR-6b402f22021e546f`,未点击规格或最终提交,未下单、未付款。
Author
Owner

实现与归档已提交,#115 进入 待用户验收,暂不关闭。

提交:

  • 24f4ad1:采购商品页/规格面板轮询移除慢速前台查询,增加脱敏超时诊断
  • 8942385:采集商品页轮询移除慢速前台查询并补充质量基线
  • bff9d75:归档 docs/task/115-修复PDD页面和规格面板误超时.md

验证:

  • Client 全量 330 个测试通过
  • 离屏主窗口通过(OK)
  • 真机只读控件树约 860 ms,正确分类当前规格面板为 order_confirmation
  • 未重新执行原采购任务,未点击规格或最终提交,未下单、未付款

待用户验收通过后关闭 #115,并把父工单 #1 的清单更新为完成。

实现与归档已提交,#115 进入 **待用户验收**,暂不关闭。 提交: - `24f4ad1`:采购商品页/规格面板轮询移除慢速前台查询,增加脱敏超时诊断 - `8942385`:采集商品页轮询移除慢速前台查询并补充质量基线 - `bff9d75`:归档 `docs/task/115-修复PDD页面和规格面板误超时.md` 验证: - Client 全量 330 个测试通过 - 离屏主窗口通过(`OK`) - 真机只读控件树约 860 ms,正确分类当前规格面板为 `order_confirmation` - 未重新执行原采购任务,未点击规格或最终提交,未下单、未付款 待用户验收通过后关闭 #115,并把父工单 #1 的清单更新为完成。
Author
Owner

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

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