修复 PDD 商品页误判超时及失败响应契约不一致 #35

Closed
opened 2026-08-07 17:50:36 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 关联:#32

问题

Client 执行采集任务 COL-2fd0ccb9c55e450b 时,手机已显示 PDD 商品页,控件树包含 220 个 com.xunmeng.pinduoduo 节点及“限时直降 免拼购买”,但 app_current() 返回 com.oplus.wirelesssettings。Client 因严格要求当前焦点包名为 PDD,等待 30 秒后报 PDD_PAGE_TIMEOUT,没有进入规格面板。

随后 Client 提交 task_failure。Admin 实际返回 200 且保存失败状态,但失败响应只有 accepted/task_status/accepted_at,没有 Client Gateway 统一要求的 result_id。Client 因此误报“Admin 拒绝:响应字段不完整”,并把 Outbox 标记为 failed。

同时,加载循环没有保存最后一份 XML,超时上报的 diagnostics 为空。

根因

  1. 商品页就绪判断把 app_current().package == PDD 当成前置条件,焦点包异常时完全不解析已经可用的 PDD 控件树。
  2. Admin SubmitFailure 响应和 SubmissionReceipt 契约不一致。
  3. _last_goods_xml 只在商品页被判定就绪后赋值,超时没有证据。
  4. Client 把“2xx 响应格式异常”描述成“Admin 拒绝”,语义错误。

方案

  • 每轮都 dump 控件树;使用 PDD 节点包名、页面就绪标记、非加载状态共同判断商品页就绪。app_current() 只作为辅助,不再独占否决。
  • 仍校验登录、验证码等特殊页面,避免误把其他页面当商品页。
  • 加载循环持续保留最后一份 XML,超时后写到 data/artifacts/ 并随失败 diagnostics 上报。
  • Admin 失败响应增加非空 result_id,与成功响应和 Mock Gateway 保持一致。
  • Client 对 2xx 但响应字段不完整的提示改为“响应格式异常,数据可能已接收”,不得显示“Admin 拒绝”。这类情况保留 Outbox,允许使用同一幂等键安全重试。

验收标准

  • app_current() 返回设置页、但控件树主要是 PDD 且包含就绪标记时,商品页判断通过。
  • 非 PDD 控件树即使包含相似文字也不能通过。
  • 登录、验证码、加载中页面仍不能通过。
  • 页面加载超时时 diagnostics 有本地 XML 路径和 SHA-256。
  • Admin SubmitFailure 返回 accepted/result_id/task_status/accepted_at。
  • Client 能正常解析真实失败响应。
  • 2xx 响应字段异常时 Outbox 不标记永久失败,提示不再写“Admin 拒绝”。
  • 原任务可重新执行,并能继续进入规格面板。
  • Client 与 Admin 全量测试通过。
  • 没有加购、下单或付款行为。

不做

  • 不放宽规格面板或 SKU 完整性校验。
  • 不增加自动循环领取。
  • 不修改采购流程。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 关联:#32 ## 问题 Client 执行采集任务 `COL-2fd0ccb9c55e450b` 时,手机已显示 PDD 商品页,控件树包含 220 个 `com.xunmeng.pinduoduo` 节点及“限时直降 免拼购买”,但 `app_current()` 返回 `com.oplus.wirelesssettings`。Client 因严格要求当前焦点包名为 PDD,等待 30 秒后报 `PDD_PAGE_TIMEOUT`,没有进入规格面板。 随后 Client 提交 `task_failure`。Admin 实际返回 200 且保存失败状态,但失败响应只有 `accepted/task_status/accepted_at`,没有 Client Gateway 统一要求的 `result_id`。Client 因此误报“Admin 拒绝:响应字段不完整”,并把 Outbox 标记为 failed。 同时,加载循环没有保存最后一份 XML,超时上报的 diagnostics 为空。 ## 根因 1. 商品页就绪判断把 `app_current().package == PDD` 当成前置条件,焦点包异常时完全不解析已经可用的 PDD 控件树。 2. Admin `SubmitFailure` 响应和 `SubmissionReceipt` 契约不一致。 3. `_last_goods_xml` 只在商品页被判定就绪后赋值,超时没有证据。 4. Client 把“2xx 响应格式异常”描述成“Admin 拒绝”,语义错误。 ## 方案 - 每轮都 dump 控件树;使用 PDD 节点包名、页面就绪标记、非加载状态共同判断商品页就绪。`app_current()` 只作为辅助,不再独占否决。 - 仍校验登录、验证码等特殊页面,避免误把其他页面当商品页。 - 加载循环持续保留最后一份 XML,超时后写到 `data/artifacts/` 并随失败 diagnostics 上报。 - Admin 失败响应增加非空 `result_id`,与成功响应和 Mock Gateway 保持一致。 - Client 对 2xx 但响应字段不完整的提示改为“响应格式异常,数据可能已接收”,不得显示“Admin 拒绝”。这类情况保留 Outbox,允许使用同一幂等键安全重试。 ## 验收标准 - [ ] `app_current()` 返回设置页、但控件树主要是 PDD 且包含就绪标记时,商品页判断通过。 - [ ] 非 PDD 控件树即使包含相似文字也不能通过。 - [ ] 登录、验证码、加载中页面仍不能通过。 - [ ] 页面加载超时时 diagnostics 有本地 XML 路径和 SHA-256。 - [ ] Admin `SubmitFailure` 返回 `accepted/result_id/task_status/accepted_at`。 - [ ] Client 能正常解析真实失败响应。 - [ ] 2xx 响应字段异常时 Outbox 不标记永久失败,提示不再写“Admin 拒绝”。 - [ ] 原任务可重新执行,并能继续进入规格面板。 - [ ] Client 与 Admin 全量测试通过。 - [ ] 没有加购、下单或付款行为。 ## 不做 - 不放宽规格面板或 SKU 完整性校验。 - 不增加自动循环领取。 - 不修改采购流程。
Author
Owner

实现进度:四项修复均已完成并通过回归。Client 现在每轮都会读取控件树;当 app_current 错报无线设置、但真实 XML 含 PDD 包节点和就绪标记时可继续,同时非 PDD 相似文字、登录/验证/加载中仍被拦截。超时会保存 XML 路径与 SHA-256。Admin failure 响应已补 result_id;Client 兼容已写入幂等表的旧响应,并把真正的 2xx 格式异常作为可安全重试,不再误报拒绝。Client 150 项测试、Admin go test ./...、离屏 UI 均通过。真机复验时 Wi-Fi ADB 已离线,未执行任何下单操作;已用本工单现场真实 XML 完成焦点错报回归。

实现进度:四项修复均已完成并通过回归。Client 现在每轮都会读取控件树;当 app_current 错报无线设置、但真实 XML 含 PDD 包节点和就绪标记时可继续,同时非 PDD 相似文字、登录/验证/加载中仍被拦截。超时会保存 XML 路径与 SHA-256。Admin failure 响应已补 result_id;Client 兼容已写入幂等表的旧响应,并把真正的 2xx 格式异常作为可安全重试,不再误报拒绝。Client 150 项测试、Admin go test ./...、离屏 UI 均通过。真机复验时 Wi-Fi ADB 已离线,未执行任何下单操作;已用本工单现场真实 XML 完成焦点错报回归。
Author
Owner

实现已提交,等待验收,工单保持 open。

  • 功能提交:c59b4b0 fix: 修复 PDD 页面误判与失败回执 (#35)
  • 归档提交:09b27ce docs: 归档任务 #35
  • Client:150 项测试通过,离屏 UI 冒烟通过
  • Admin:go test ./... 通过
  • 真实 XML:已复现并通过“app_current 为无线设置、无障碍树为 PDD”判定
  • 真机复验:ADB 在复验前离线,未进入规格面板;没有执行加购、下单或付款

原任务恢复方式:重启新版 Client 后,第一次点击会补交旧失败 Outbox,第二次点击重新采集 COL-2fd0ccb9c55e450b。详细记录见 docs/task/35-修复-pdd-商品页误判与失败响应.md。

实现已提交,等待验收,工单保持 open。 - 功能提交:c59b4b0 fix: 修复 PDD 页面误判与失败回执 (#35) - 归档提交:09b27ce docs: 归档任务 #35 - Client:150 项测试通过,离屏 UI 冒烟通过 - Admin:go test ./... 通过 - 真实 XML:已复现并通过“app_current 为无线设置、无障碍树为 PDD”判定 - 真机复验:ADB 在复验前离线,未进入规格面板;没有执行加购、下单或付款 原任务恢复方式:重启新版 Client 后,第一次点击会补交旧失败 Outbox,第二次点击重新采集 COL-2fd0ccb9c55e450b。详细记录见 docs/task/35-修复-pdd-商品页误判与失败响应.md。
Author
Owner

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

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