下单后核单失败:支付页等待窗口过短 + 待付款页未按需滑动 #325

Open
opened 2026-09-19 11:25:13 +08:00 by ila · 6 comments
Owner

原始需求

用户 2026-09-19:「can we get the purchase order number after create order in pdd app?」并现场创建采购任务(SYB 订单 260919DS5BSHR3)配合实测。

本工单的根因分析已于同日更正,更正说明见评论区。初版把主因写成「缺少滑动」,实测证明滑动逻辑是存在的,真正的主因是支付页等待窗口过短。

现场实测(任务 391,设备 8 = 192.168.0.173:38881,PDD 8.25.0)

用 dumpsys window 全程追踪 Activity 变化(不触碰无障碍层,避免干扰 Agent 自身执行):

11:21:41  app_address_lego.CreateLegoAddressActivity   改地址,停留 1 秒
11:21:42  activity.NewPageActivity                     订单确认页
11:21:43  (页面记录的下单时间=订单实际创建时刻)
11:21:44  com.tencent.mm/…wallet_index.ui.OrderHandlerUI   跳转微信
11:21:46  app_pay.core.PayActivity                     PDD 支付页,停留 2 秒
~11:21:47 Agent 报 PURCHASE_ORDER_PAYMENT_REPEATED 退出
11:21:48  activity.NewPageActivity                     待付款页(含订单号)
11:22:00  数据库写入失败状态

订单创建成功:260919-137457877324044,收货地址后缀 _cg391,与本任务一致。

Agent 是在待付款页出现前约 1 秒退出的,它根本没有看到那一页。

失败后抓取该页控件树(90 节点),订单号确实在页面上,但位于折叠线以下:

bounds 高度
滑动前 订单编号 [183,2328][861,2328] 0
滑动前 下单时间 [33,2328][1047,2328] 0
手动向下滑一屏后 订单编号 [183,1767][861,1827] 60
手动向下滑一屏后 下单时间 [33,1827][1047,1887] 60

屏幕高 2376。零高度节点 isVisibleToUser 为 false。用户实测需要向下滑动两次才能让订单号进入视野。

页面判定现状(决定走哪条分支)

  • 支付页只按 Activity 名判定:PDD_PAYMENT_ACTIVITIES = {com.xunmeng.pinduoduo.app_pay.core.PayActivity}
  • 待付款页的 Activity 是 NewPageActivity,与订单列表、订单详情、下单确认页完全相同,无法靠 Activity 区分,只能靠文字:UNPAID_MARKERS = [待付款, 待支付, 去支付]、ORDER_CONTEXT_MARKERS = [订单编号, 订单号, 下单时间, 创建时间]
  • 分支选择:paymentVisible = isKnownPddPaymentActivity && !orderContextVisible && !unpaidContextVisible

根因:两层叠加

第一层(主因):支付页等待窗口短于 PDD 的页面过渡时间

ORDER_RESULT_PAYMENT_POST_BACK_MAX_SAMPLES = 3
ORDER_RESULT_SAMPLE_INTERVAL_MS = 200L        // 合计 600ms

落到 PayActivity 后按一次返回键,再连续 3 帧(600ms)仍是 PayActivity 就报 PURCHASE_ORDER_PAYMENT_REPEATED。实测 PayActivity 停留 2 秒,600ms 必然用尽。

第二层:待付款页的滑动是固定节奏,不是按需

if (index > 0 && index % ORDER_RESULT_SCROLL_SAMPLE_INTERVAL == 0)   // 每 15 帧 = 3 秒
    driver.swipePurchase(SwipeDirection.UP, 400)                     // 400 是时长不是距离
  • 滑动确实存在,但只在固定节奏触发,不判断「订单号是否已在视野内」
  • index 是全局帧计数,与微信页、支付页的绕路共用;ORDER_RESULT_MAX_SAMPLES = 60(12 秒)中,本次绕路已消耗约 20 帧
  • 到达待付款页后预算不重新起算,剩余滑动机会可能不足所需的 2 次

生产影响:224 个 order_result_unknown 中 223 个的 error_code 是 PURCHASE_ORDER_PAYMENT_REPEATED;12 个 order_created 全部带订单号(读到就一定准)。

方案

  1. 放宽支付页等待窗口:实测 PayActivity→待付款页约需 2 秒,现有 600ms 不足;放宽到足以覆盖该过渡,仍保留上限以免无限等待。
  2. 待付款页改为按需滑动:识别到 UNPAID_MARKERS 但 parseOrderEvidence 仍无结果时,立即滑动并重读,有界重复(覆盖实测所需的 2 次并留余量),不再等固定节奏。
  3. 滑动预算与绕路解耦:到达待付款页后单独计数,不与微信页、支付页消耗的帧数共用。

[必须] 该分支只做滑动与读取,不得点击任何控件。支付、下单相关文字仅作只读识别信号,不得作为点击目标。

验收

  • 新增用例:PayActivity 持续约 2 秒后才出现待付款页,且订单号需滑动两次才可见——应当读到订单号与下单时间并以 order_created 结束,全程无点击。
  • 分别去掉「放宽等待窗口」与「按需滑动」后,对应用例必须变红。
  • 既有用例不受影响。
  • 真机验证:采购任务能以 order_created 结束并带回订单号。

风险与回退

  • 属于采购流程(创建订单相关),按 AGENTS.md 为高风险,实施前需人工确认。
  • 放宽等待窗口会延长单次核单耗时,需同时确认不超过 ORDER_RESULT_MAX_SAMPLES 与任务整体时限。
  • 支付页上滑动本身不产生支付动作;实现必须确保该分支无任何 click 调用。
  • 回退即还原三个常量与分支结构。

相关但不在本工单范围

本次任务地址后缀为 _cg391(正确),但同设备上另外 5 个历史订单的后缀全部是 _cg348(5 个不同商品、5 个不同订单号共用一个后缀)。说明地址改写会间歇性失败,会让依赖后缀匹配的回填把订单号挂到错误任务上。需另建工单核查。

追加范围:在待付款页一并读取应付金额并上报(用户 2026-09-19 确认)

既然订单号改为在待付款页当场获取、不再依赖遍历「我的订单」,同一次取帧里应当把应付金额一并带回。

实测页面证据(任务 391 失败后抓取的同一页):

节点文本 bounds 高度 是否需要滑动
已优惠3元使用3元平台无门槛券,应付:,13元,(免运费) [33,1182][1047,1281] 99 否,直接可见
应付 [33,1182][123,1245] 63 否
订单编号: 260919-137457877324044 [183,2328][861,2328] 0 是

应付金额位置高于订单号,只要能走到待付款页就已在视野内,不需要额外机制;本工单的等待窗口与按需滑动修复即可覆盖。

语义(用户确认):pdd_order_amount_cent 存应付金额。

该页同时存在 拼单价¥16、平台优惠-¥3、应付:13元 三个数。应付是「还需支付多少」;本项目从不支付,因此这些订单不会产生实付金额,该列按应付语义写入,不再区分实付。

改动链路:

  1. PurchaseLiveAutomation:新增应付金额解析(仅匹配 应付,不得匹配 拼单价/平台优惠/实付),与订单号、下单时间在同一批 labels 中解析;金额缺失或不唯一时只留空该字段,不影响订单号回报。
  2. PurchaseOrderEvidence 与 PurchaseExecutionOutcome:新增订单应付金额字段(现仅有 actualUnitPriceCent 单价,无订单总额)。
  3. Agent 上报:ResultRequest 新增 pddOrderAmountCent。
  4. 服务端 lifecycle.go:在写入 ActualUnitPriceCent 的同一处写入 PDDOrderAmountCent;该列已存在,不需要迁移。

与回填的写入冲突:pdd_order_amount_cent 此前只由回填写入(回填读的是 实付:)。按本次确认统一为应付语义后,两条写入路径需保持一致;回填侧是否同步调整,在本工单实施时一并确认。

追加验收:

  • 新增用例:待付款页含 拼单价/平台优惠/应付 三个数时,只取应付金额;金额不唯一或缺失时该字段为空且不影响订单号与下单时间的回报。
  • 服务端用例:pddOrderAmountCent 正确落库到 pdd_order_amount_cent。
  • 接口字段变化需同步 docs/08-agent-api-contract.md。

文档影响更正:本工单新增 Agent 上报字段 pddOrderAmountCent,属共享 API 契约变化,需更新 docs/08-agent-api-contract.md;正文「无长期文档影响」的结论相应作废。

## 原始需求 用户 2026-09-19:「can we get the purchase order number after create order in pdd app?」并现场创建采购任务(SYB 订单 260919DS5BSHR3)配合实测。 > 本工单的根因分析已于同日更正,更正说明见评论区。初版把主因写成「缺少滑动」,实测证明滑动逻辑是存在的,真正的主因是支付页等待窗口过短。 ## 现场实测(任务 391,设备 8 = 192.168.0.173:38881,PDD 8.25.0) 用 `dumpsys window` 全程追踪 Activity 变化(不触碰无障碍层,避免干扰 Agent 自身执行): ``` 11:21:41 app_address_lego.CreateLegoAddressActivity 改地址,停留 1 秒 11:21:42 activity.NewPageActivity 订单确认页 11:21:43 (页面记录的下单时间=订单实际创建时刻) 11:21:44 com.tencent.mm/…wallet_index.ui.OrderHandlerUI 跳转微信 11:21:46 app_pay.core.PayActivity PDD 支付页,停留 2 秒 ~11:21:47 Agent 报 PURCHASE_ORDER_PAYMENT_REPEATED 退出 11:21:48 activity.NewPageActivity 待付款页(含订单号) 11:22:00 数据库写入失败状态 ``` **订单创建成功**:`260919-137457877324044`,收货地址后缀 `_cg391`,与本任务一致。 **Agent 是在待付款页出现前约 1 秒退出的,它根本没有看到那一页。** 失败后抓取该页控件树(90 节点),订单号确实在页面上,但位于折叠线以下: | | bounds | 高度 | |---|---|---| | 滑动前 订单编号 | [183,2328][861,2328] | **0** | | 滑动前 下单时间 | [33,2328][1047,2328] | **0** | | 手动向下滑一屏后 订单编号 | [183,1767][861,1827] | 60 | | 手动向下滑一屏后 下单时间 | [33,1827][1047,1887] | 60 | 屏幕高 2376。零高度节点 `isVisibleToUser` 为 false。用户实测需要**向下滑动两次**才能让订单号进入视野。 ## 页面判定现状(决定走哪条分支) - **支付页**只按 Activity 名判定:`PDD_PAYMENT_ACTIVITIES = {com.xunmeng.pinduoduo.app_pay.core.PayActivity}` - **待付款页**的 Activity 是 `NewPageActivity`,与订单列表、订单详情、下单确认页**完全相同**,无法靠 Activity 区分,只能靠文字:`UNPAID_MARKERS = [待付款, 待支付, 去支付]`、`ORDER_CONTEXT_MARKERS = [订单编号, 订单号, 下单时间, 创建时间]` - 分支选择:`paymentVisible = isKnownPddPaymentActivity && !orderContextVisible && !unpaidContextVisible` ## 根因:两层叠加 **第一层(主因):支付页等待窗口短于 PDD 的页面过渡时间** ```kotlin ORDER_RESULT_PAYMENT_POST_BACK_MAX_SAMPLES = 3 ORDER_RESULT_SAMPLE_INTERVAL_MS = 200L // 合计 600ms ``` 落到 PayActivity 后按一次返回键,再连续 3 帧(600ms)仍是 PayActivity 就报 `PURCHASE_ORDER_PAYMENT_REPEATED`。实测 PayActivity 停留 **2 秒**,600ms 必然用尽。 **第二层:待付款页的滑动是固定节奏,不是按需** ```kotlin if (index > 0 && index % ORDER_RESULT_SCROLL_SAMPLE_INTERVAL == 0) // 每 15 帧 = 3 秒 driver.swipePurchase(SwipeDirection.UP, 400) // 400 是时长不是距离 ``` - 滑动确实存在,但只在固定节奏触发,不判断「订单号是否已在视野内」 - `index` 是全局帧计数,与微信页、支付页的绕路共用;`ORDER_RESULT_MAX_SAMPLES = 60`(12 秒)中,本次绕路已消耗约 20 帧 - 到达待付款页后预算不重新起算,剩余滑动机会可能不足所需的 2 次 生产影响:224 个 `order_result_unknown` 中 **223 个**的 error_code 是 `PURCHASE_ORDER_PAYMENT_REPEATED`;12 个 `order_created` 全部带订单号(读到就一定准)。 ## 方案 1. **放宽支付页等待窗口**:实测 PayActivity→待付款页约需 2 秒,现有 600ms 不足;放宽到足以覆盖该过渡,仍保留上限以免无限等待。 2. **待付款页改为按需滑动**:识别到 `UNPAID_MARKERS` 但 `parseOrderEvidence` 仍无结果时,立即滑动并重读,有界重复(覆盖实测所需的 2 次并留余量),不再等固定节奏。 3. **滑动预算与绕路解耦**:到达待付款页后单独计数,不与微信页、支付页消耗的帧数共用。 `[必须]` 该分支只做滑动与读取,不得点击任何控件。支付、下单相关文字仅作只读识别信号,不得作为点击目标。 ## 验收 - 新增用例:PayActivity 持续约 2 秒后才出现待付款页,且订单号需滑动两次才可见——应当读到订单号与下单时间并以 `order_created` 结束,全程无点击。 - 分别去掉「放宽等待窗口」与「按需滑动」后,对应用例必须变红。 - 既有用例不受影响。 - 真机验证:采购任务能以 `order_created` 结束并带回订单号。 ## 风险与回退 - 属于采购流程(创建订单相关),按 `AGENTS.md` 为高风险,实施前需人工确认。 - 放宽等待窗口会延长单次核单耗时,需同时确认不超过 `ORDER_RESULT_MAX_SAMPLES` 与任务整体时限。 - 支付页上滑动本身不产生支付动作;实现必须确保该分支无任何 click 调用。 - 回退即还原三个常量与分支结构。 ## 相关但不在本工单范围 本次任务地址后缀为 `_cg391`(正确),但同设备上另外 5 个历史订单的后缀全部是 `_cg348`(5 个不同商品、5 个不同订单号共用一个后缀)。说明地址改写会间歇性失败,会让依赖后缀匹配的回填把订单号挂到错误任务上。需另建工单核查。 ## 追加范围:在待付款页一并读取应付金额并上报(用户 2026-09-19 确认) 既然订单号改为在待付款页当场获取、不再依赖遍历「我的订单」,同一次取帧里应当把应付金额一并带回。 **实测页面证据(任务 391 失败后抓取的同一页)**: | 节点文本 | bounds | 高度 | 是否需要滑动 | |---|---|---|---| | `已优惠3元使用3元平台无门槛券,应付:,13元,(免运费)` | [33,1182][1047,1281] | 99 | **否,直接可见** | | `应付` | [33,1182][123,1245] | 63 | 否 | | `订单编号: 260919-137457877324044` | [183,2328][861,2328] | 0 | 是 | 应付金额位置高于订单号,只要能走到待付款页就已在视野内,不需要额外机制;本工单的等待窗口与按需滑动修复即可覆盖。 **语义(用户确认)**:`pdd_order_amount_cent` 存**应付**金额。 该页同时存在 `拼单价¥16`、`平台优惠-¥3`、`应付:13元` 三个数。应付是「还需支付多少」;本项目从不支付,因此这些订单不会产生实付金额,该列按应付语义写入,不再区分实付。 **改动链路**: 1. `PurchaseLiveAutomation`:新增应付金额解析(仅匹配 `应付`,不得匹配 `拼单价`/`平台优惠`/`实付`),与订单号、下单时间在同一批 `labels` 中解析;金额缺失或不唯一时只留空该字段,不影响订单号回报。 2. `PurchaseOrderEvidence` 与 `PurchaseExecutionOutcome`:新增订单应付金额字段(现仅有 `actualUnitPriceCent` 单价,无订单总额)。 3. Agent 上报:`ResultRequest` 新增 `pddOrderAmountCent`。 4. 服务端 `lifecycle.go`:在写入 `ActualUnitPriceCent` 的同一处写入 `PDDOrderAmountCent`;该列已存在,**不需要迁移**。 **与回填的写入冲突**:`pdd_order_amount_cent` 此前只由回填写入(回填读的是 `实付:`)。按本次确认统一为应付语义后,两条写入路径需保持一致;回填侧是否同步调整,在本工单实施时一并确认。 **追加验收**: - 新增用例:待付款页含 `拼单价`/`平台优惠`/`应付` 三个数时,只取应付金额;金额不唯一或缺失时该字段为空且不影响订单号与下单时间的回报。 - 服务端用例:`pddOrderAmountCent` 正确落库到 `pdd_order_amount_cent`。 - 接口字段变化需同步 `docs/08-agent-api-contract.md`。 **文档影响更正**:本工单新增 Agent 上报字段 `pddOrderAmountCent`,属共享 API 契约变化,需更新 `docs/08-agent-api-contract.md`;正文「无长期文档影响」的结论相应作废。
ila changed title from 下单后在待付款页向下滑动取订单号,替代按返回键 to 下单后核单失败:支付页等待窗口过短 + 待付款页未按需滑动 2026-09-19 11:33:29 +08:00
Author
Owner

根因更正(2026-09-19)

初版把主因写成「缺少向下滑动」。拿到完整 Activity 时间线后,这个判断不成立,已更正正文。

错在哪里:滑动逻辑是存在的——readOrderResult() 在识别到订单页/待付款页后,每 15 帧(3 秒)会 swipePurchase(UP, 400) 一次。初版只看了失败时的页面快照,没有追踪 Activity 序列,就推断成「代码没有滑动」。

实际主因:支付页的等待窗口短于 PDD 的页面过渡时间。

11:21:46  PayActivity 出现
          按一次返回 → 再看 3 帧(600ms)仍是 PayActivity
~11:21:47 报 PURCHASE_ORDER_PAYMENT_REPEATED 退出
11:21:48  待付款页才出现

PayActivity 实测停留 2 秒,600ms 的窗口必然用尽——Agent 在待付款页出现前约 1 秒就退出了,根本没走到有滑动逻辑的那个分支。

第二层问题仍然成立但不是主因:待付款页上订单号确实在折叠线以下(零高度、isVisibleToUser=false),现有滑动是固定节奏而非按需,且 index 与微信页、支付页的绕路共用预算,到达待付款页后不重新起算,剩余滑动次数可能不足用户实测所需的 2 次。

方案相应从「补充滑动」改为三点:放宽支付页等待窗口、待付款页按需滑动、滑动预算与绕路解耦。

状态:待人工确认后实施(采购流程,高风险)。

## 根因更正(2026-09-19) 初版把主因写成「缺少向下滑动」。拿到完整 Activity 时间线后,这个判断不成立,已更正正文。 **错在哪里**:滑动逻辑是存在的——`readOrderResult()` 在识别到订单页/待付款页后,每 15 帧(3 秒)会 `swipePurchase(UP, 400)` 一次。初版只看了失败时的页面快照,没有追踪 Activity 序列,就推断成「代码没有滑动」。 **实际主因**:支付页的等待窗口短于 PDD 的页面过渡时间。 ``` 11:21:46 PayActivity 出现 按一次返回 → 再看 3 帧(600ms)仍是 PayActivity ~11:21:47 报 PURCHASE_ORDER_PAYMENT_REPEATED 退出 11:21:48 待付款页才出现 ``` PayActivity 实测停留 2 秒,600ms 的窗口必然用尽——**Agent 在待付款页出现前约 1 秒就退出了,根本没走到有滑动逻辑的那个分支**。 **第二层问题仍然成立但不是主因**:待付款页上订单号确实在折叠线以下(零高度、`isVisibleToUser=false`),现有滑动是固定节奏而非按需,且 `index` 与微信页、支付页的绕路共用预算,到达待付款页后不重新起算,剩余滑动次数可能不足用户实测所需的 2 次。 方案相应从「补充滑动」改为三点:放宽支付页等待窗口、待付款页按需滑动、滑动预算与绕路解耦。 状态:待人工确认后实施(采购流程,高风险)。
Author
Owner

开始实施。用户明确要求按 #325 工单范围执行,不扩大范围。本次仅 Android PurchaseLiveAutomation 的支付页有界等待、待付款页独立预算/按需滑动,以及应付金额随采购结果上报、Server 接收与入库、相关测试/API契约。Agent我的订单回填、Chrome回填、Web展示和历史金额不改;既有路径仍为实付语义,因此统一旧路径/历史数据不是本单已完成能力,不将本次混合来源列宣称全局已统一。基线 origin/main 10be374;独立工作树 issue-325。用户实施指令授权代码实施,不执行真机创建订单、付款、迁移或线上发布。本会话未提供 Gitea MCP,回退 API。

开始实施。用户明确要求按 #325 工单范围执行,不扩大范围。本次仅 Android PurchaseLiveAutomation 的支付页有界等待、待付款页独立预算/按需滑动,以及应付金额随采购结果上报、Server 接收与入库、相关测试/API契约。Agent我的订单回填、Chrome回填、Web展示和历史金额不改;既有路径仍为实付语义,因此统一旧路径/历史数据不是本单已完成能力,不将本次混合来源列宣称全局已统一。基线 origin/main 10be374;独立工作树 issue-325。用户实施指令授权代码实施,不执行真机创建订单、付款、迁移或线上发布。本会话未提供 Gitea MCP,回退 API。
Author
Owner

实现完成,待验收(2026-09-19)

按用户“按照工单执行,不扩大范围”实施。无 Gitea MCP,按规则回退 API。

  • 代码提交 b76fb73,文档提交 741e4bf;分支 fix/325-order-result 已推送、工作区干净,未合并main/部署/安装。
  • PayActivity 一次既有 Back 后最多25次200ms采样(原3次),约5秒,不含捕获耗时。过渡最多60次;首次待付款页开始独立30次读取预算,总上限90次且不重复重置。缺少完整订单号/时间立即UP滑动,最多4次、400ms手势、500ms稳定等待;完整证据立即停止。新增待付款分支无任何控件点击;创建订单/支付边界不改。
  • PurchaseOrderEvidence、PurchaseExecutionOutcome、结果Outbox序列化(包括重启只读恢复)贯通可选pddOrderAmountCent。只读应付,父子同值去重、多值/缺失/格式不符/溢出省略;不读实付、单价或优惠。金额随唯一订单号/时间的order_created上报,不因金额缺失丢弃订单结果。
  • ResultRequest接受字段;成功且订单号无占用冲突时仅补空既有列,不清空或覆盖历史金额;负值及其他结果类型携带金额拒绝。字段纳入现有结果哈希、相同提交幂等,不同金额重放冲突;SYB仍仅订单号,不发送金额。无需迁移。

验证

  • Android相关 Purchase* 与 OrderBackfillTest 共156项,0失败;assembleDebug通过。
  • 按工单实际执行两次反向验证:支付页常量还原3次后综合场景失败;按需滑动次数置0后综合场景及立即滑动场景失败。随后恢复25/4,最终相关156项全绿。
  • Server go test -p 1 ./app/goauto/purchase ./app/goauto/clientapi 通过;go build通过。新增8组金额/缺失/零/历史保留/负值/结果类型与幂等测试。既有订单号/SYB入队回归通过。
  • Android全量测试尝试在既有 ImageSearchBackRecoveryTest.a back that does move the page does not count as stalled / PinduoduoImageSearchAutomation.awaitPage 运行3分多钟未结束(jstack定位),已停止本次测试进程,未改图搜范围;不宣称全量通过。
  • harness check --strict 发现既有未登记Wiki镜像 docs/evidence/pdd-home-35727-summary.md;已确认该文件在origin/main,本单未改,不扩展修复。
  • 唯一一轮Wiki sync及sync --check通过。在线回读revision:Architecture a0ad0d4ed6b71676b56276d84d713e85c6b206b8;Business 9320ce910ddb26881aafc4dfa4b497d62c144b5b;API 17d42cfee87b84a306bfd991b24ca3f3948f1354。Business镜像保留线上已存在的#307段落,未修改其内容/代码,避免直接编辑只读镜像。

APK与边界

  • APK:D:/OPC/goauto-worktrees/issue-325/android/app/build/outputs/apk/debug/app-debug.apk,6,378,011字节;SHA256 F343E731B1BF4390CDB3E24948AEAAEAFE612DBEE9A928E1F70370CD8754FB4E。仍为基线0.9.59/code72的本地审核构建,本单未登记正式Agent发布。
  • 未修改Agent人工回填、Chrome回填、Admin显示或历史金额,它们仍按原实付语义;新增采购结果入口按应付语义。不能宣称全局金额已统一。
  • 必须先发布支持新结果字段的Server,再升级Agent;旧Server严格解码会拒绝新字段。当前未发布或安装,不执行真实地址修改/下单/付款/回填。真机order_created验收尚未执行,工单保持开放待验收。
## 实现完成,待验收(2026-09-19) 按用户“按照工单执行,不扩大范围”实施。无 Gitea MCP,按规则回退 API。 - 代码提交 b76fb73,文档提交 741e4bf;分支 fix/325-order-result 已推送、工作区干净,未合并main/部署/安装。 - PayActivity 一次既有 Back 后最多25次200ms采样(原3次),约5秒,不含捕获耗时。过渡最多60次;首次待付款页开始独立30次读取预算,总上限90次且不重复重置。缺少完整订单号/时间立即UP滑动,最多4次、400ms手势、500ms稳定等待;完整证据立即停止。新增待付款分支无任何控件点击;创建订单/支付边界不改。 - PurchaseOrderEvidence、PurchaseExecutionOutcome、结果Outbox序列化(包括重启只读恢复)贯通可选pddOrderAmountCent。只读应付,父子同值去重、多值/缺失/格式不符/溢出省略;不读实付、单价或优惠。金额随唯一订单号/时间的order_created上报,不因金额缺失丢弃订单结果。 - ResultRequest接受字段;成功且订单号无占用冲突时仅补空既有列,不清空或覆盖历史金额;负值及其他结果类型携带金额拒绝。字段纳入现有结果哈希、相同提交幂等,不同金额重放冲突;SYB仍仅订单号,不发送金额。无需迁移。 ### 验证 - Android相关 Purchase* 与 OrderBackfillTest 共156项,0失败;assembleDebug通过。 - 按工单实际执行两次反向验证:支付页常量还原3次后综合场景失败;按需滑动次数置0后综合场景及立即滑动场景失败。随后恢复25/4,最终相关156项全绿。 - Server go test -p 1 ./app/goauto/purchase ./app/goauto/clientapi 通过;go build通过。新增8组金额/缺失/零/历史保留/负值/结果类型与幂等测试。既有订单号/SYB入队回归通过。 - Android全量测试尝试在既有 ImageSearchBackRecoveryTest.a back that does move the page does not count as stalled / PinduoduoImageSearchAutomation.awaitPage 运行3分多钟未结束(jstack定位),已停止本次测试进程,未改图搜范围;不宣称全量通过。 - harness check --strict 发现既有未登记Wiki镜像 docs/evidence/pdd-home-35727-summary.md;已确认该文件在origin/main,本单未改,不扩展修复。 - 唯一一轮Wiki sync及sync --check通过。在线回读revision:Architecture a0ad0d4ed6b71676b56276d84d713e85c6b206b8;Business 9320ce910ddb26881aafc4dfa4b497d62c144b5b;API 17d42cfee87b84a306bfd991b24ca3f3948f1354。Business镜像保留线上已存在的#307段落,未修改其内容/代码,避免直接编辑只读镜像。 ### APK与边界 - APK:D:/OPC/goauto-worktrees/issue-325/android/app/build/outputs/apk/debug/app-debug.apk,6,378,011字节;SHA256 F343E731B1BF4390CDB3E24948AEAAEAFE612DBEE9A928E1F70370CD8754FB4E。仍为基线0.9.59/code72的本地审核构建,本单未登记正式Agent发布。 - 未修改Agent人工回填、Chrome回填、Admin显示或历史金额,它们仍按原实付语义;新增采购结果入口按应付语义。不能宣称全局金额已统一。 - 必须先发布支持新结果字段的Server,再升级Agent;旧Server严格解码会拒绝新字段。当前未发布或安装,不执行真实地址修改/下单/付款/回填。真机order_created验收尚未执行,工单保持开放待验收。
Author
Owner

用户授权步骤1/2/3已执行(2026-09-19)

用户明确授权先合并main、更新线上Admin/API、再安装到192.168.0.173:38881。当前无Gitea MCP,回退API。

  1. main已快进并推送741e4bf680f72a4f7eda8e2daada5e32561ed901(实现b76fb73),工作区干净。包括之前已合并但因任务运行未发布的#316。
  2. 从main重新跑Server purchase/clientapi测试,通过;Linux amd64 Server及Web构建通过(Web既有CSS/chunk大小警告保留)。Server SHA256=d5af302b5bb239704ad951ba14d66e32fbd513d092c7fb1c9caa2cfbdc615840;Web包SHA256=4f4d9f52f3cf1dec0aa9007504c1d42816cc527d521108f688e1b2b12e126a93。
  3. 发布前采集/采购执行数0;新目录/home/goauto/releases/20260919-741e4bf-325,current原子切换,goauto.service重启、Nginx检查/reload成功。前版/home/goauto/releases/20260918-7e257ca-305完整保留用于回滚;static/var直接引用原真实数据目录,不复制/删除业务数据。53个迁移版本及sys_job启停状态前后相同,未执行迁移或启停任务。
  4. 公网首页200、10个JS/CSS资源均200、health200。未带凭据向不存在的任务ID发送含pddOrderAmountCent的合成结果,返回401 DEVICE_TOKEN_INVALID而非未知字段422,证明新增字段已通过解码、未发生业务写入;#316客户端回填接口无凭据返回401。两个systemd服务active,近期日志panic/fatal/1146/1054命中0。不宣称真实金额入库验收。
  5. 安装前线上设备8采集/采购pending/running/提交中等计数0,手机本地采购记录全部completed。adb install -r成功,未卸载/清数据。安装时间2026-09-19 14:08:31;手机base.apk SHA256=f343e731b1bf4390cdb3e24948aeaaeafe612dbee9a928e1f70370cd8754fb4e,与#325构建一致。版本字段仍0.9.59/code72,不据版本文字单独识别此次代码。

未发起真机采购、改地址、订单回填或付款,业务验收待用户发起采购。已有Wiki记录了本次契约;本轮复用既有部署拓扑/配置/命令与回滚方式,无新增长期运维方式变化,因此发布证据集中回写工单,不重复Wiki同步。工单保持待验收。

## 用户授权步骤1/2/3已执行(2026-09-19) 用户明确授权先合并main、更新线上Admin/API、再安装到192.168.0.173:38881。当前无Gitea MCP,回退API。 1. main已快进并推送741e4bf680f72a4f7eda8e2daada5e32561ed901(实现b76fb73),工作区干净。包括之前已合并但因任务运行未发布的#316。 2. 从main重新跑Server purchase/clientapi测试,通过;Linux amd64 Server及Web构建通过(Web既有CSS/chunk大小警告保留)。Server SHA256=d5af302b5bb239704ad951ba14d66e32fbd513d092c7fb1c9caa2cfbdc615840;Web包SHA256=4f4d9f52f3cf1dec0aa9007504c1d42816cc527d521108f688e1b2b12e126a93。 3. 发布前采集/采购执行数0;新目录/home/goauto/releases/20260919-741e4bf-325,current原子切换,goauto.service重启、Nginx检查/reload成功。前版/home/goauto/releases/20260918-7e257ca-305完整保留用于回滚;static/var直接引用原真实数据目录,不复制/删除业务数据。53个迁移版本及sys_job启停状态前后相同,未执行迁移或启停任务。 4. 公网首页200、10个JS/CSS资源均200、health200。未带凭据向不存在的任务ID发送含pddOrderAmountCent的合成结果,返回401 DEVICE_TOKEN_INVALID而非未知字段422,证明新增字段已通过解码、未发生业务写入;#316客户端回填接口无凭据返回401。两个systemd服务active,近期日志panic/fatal/1146/1054命中0。不宣称真实金额入库验收。 5. 安装前线上设备8采集/采购pending/running/提交中等计数0,手机本地采购记录全部completed。adb install -r成功,未卸载/清数据。安装时间2026-09-19 14:08:31;手机base.apk SHA256=f343e731b1bf4390cdb3e24948aeaaeafe612dbee9a928e1f70370cd8754fb4e,与#325构建一致。版本字段仍0.9.59/code72,不据版本文字单独识别此次代码。 未发起真机采购、改地址、订单回填或付款,业务验收待用户发起采购。已有Wiki记录了本次契约;本轮复用既有部署拓扑/配置/命令与回滚方式,无新增长期运维方式变化,因此发布证据集中回写工单,不重复Wiki同步。工单保持待验收。
Author
Owner

补充安装验证(2026-09-19):按用户授权将同一 #325 APK 覆盖安装至 192.168.0.9:33259。安装前线上设备7活动/待执行采购及采集计数均0,本地采购220条均completed。adb install -r 返回 Success;手机base.apk SHA256=f343e731b1bf4390cdb3e24948aeaaeafe612dbee9a928e1f70370cd8754fb4e,与上一台安装包一致。lastUpdateTime=2026-09-19 14:13:10,版本文字仍0.9.59/code72。未卸载或清数据,未发起采购、回填或付款;保持待验收。当前无Gitea MCP,沿用API回写。

补充安装验证(2026-09-19):按用户授权将同一 #325 APK 覆盖安装至 192.168.0.9:33259。安装前线上设备7活动/待执行采购及采集计数均0,本地采购220条均completed。adb install -r 返回 Success;手机base.apk SHA256=f343e731b1bf4390cdb3e24948aeaaeafe612dbee9a928e1f70370cd8754fb4e,与上一台安装包一致。lastUpdateTime=2026-09-19 14:13:10,版本文字仍0.9.59/code72。未卸载或清数据,未发起采购、回填或付款;保持待验收。当前无Gitea MCP,沿用API回写。
Author
Owner

2026-09-19按用户再次明确要求,两台设备重新adb install -r覆盖安装最新main对应#325 APK。安装前设备7/8线上pending/running等任务均0,本地采购记录全部completed。192.168.0.173:38881安装时间15:54:17;192.168.0.9:33259安装时间15:54:18;两台均Success,base.apk SHA256均f343e731b1bf4390cdb3e24948aeaaeafe612dbee9a928e1f70370cd8754fb4e。版本仍0.9.59/code72。当前main相对b76fb73无Android差异。未卸载/清数据,未触发采购或付款。无Gitea MCP,使用API回写。

2026-09-19按用户再次明确要求,两台设备重新adb install -r覆盖安装最新main对应#325 APK。安装前设备7/8线上pending/running等任务均0,本地采购记录全部completed。192.168.0.173:38881安装时间15:54:17;192.168.0.9:33259安装时间15:54:18;两台均Success,base.apk SHA256均f343e731b1bf4390cdb3e24948aeaaeafe612dbee9a928e1f70370cd8754fb4e。版本仍0.9.59/code72。当前main相对b76fb73无Android差异。未卸载/清数据,未触发采购或付款。无Gitea MCP,使用API回写。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#325