Agent读取PDD订单实付价格并补写Admin #306

Open
opened 2026-09-18 09:07:05 +08:00 by ila · 3 comments
Owner

原始需求摘要

  • 来源:用户于 2026-09-18 提出,在 Agent 遍历 PDD「我的订单 → 订单详情」取得订单号和下单时间时,同时读取页面显示的“实付”价格并保存到 Admin。
  • 用户确认:不判断是否付款;没有实付价格时跳过金额、不报错,订单号和下单时间仍正常回填;采购员可之后再次人工执行“回填”补齐金额。
  • 用户确认:实付价格仅保存到 Admin,不上传 SYB;#305 仍只把 PDD 订单号回写 SYB。

本会话未提供可调用的 Gitea MCP 工具,按仓库规则回退 Gitea API 建单;凭据仅从本机安全环境读取,未输出或写入仓库/工单。

目标

  1. 扩展 #242 的 PDD 订单详情扫描,在读取订单号、下单时间时尝试读取唯一“实付”金额。
  2. 扩展 #241 的 Agent 回填契约,把可选金额以人民币分提交并保存到 Admin。
  3. 允许对已经回填订单号的任务再次扫描,补齐此前缺失的实付金额。
  4. Admin 采购任务详情展示实付价格,空值明确显示“尚未获取”。

非目标

  • 不判断订单是否已付款,不读取或改变支付状态。
  • 不识别“需付款”“应付款”或页面任意人民币数字;首版只认真机已确认的“实付”标签。
  • 金额缺失、歧义或格式异常不导致订单回填失败。
  • 不把实付价格上传、同步或映射到 SYB;不得映射到 updateDetailPurchaseCode 的 cost 参数。
  • 不修改 #305 的订单号回写目标,不执行付款、确认收货、退款、取消订单等操作。
  • 不保存原始无障碍控件树、整屏截图、地址全文、手机号、姓名或真实订单数据。
  • 首版不修改正常采购结束时 readOrderResult 的提交契约;本单只扩展人工“我的订单”回填链路,控制改动范围。

当前事实与证据

代码事实

核验基线:本地 main 提交 9194fd6,其中:

  • #242 已实现 Agent 采购记录页“回填”入口、PDD 我的订单有界扫描和 BackfillDetailReader;当前 BackfillItem 只有 addressSuffix、pddOrderNo、orderSubmittedAt。
  • #241 已实现 POST /api/agent/v1/purchase-tasks/order-backfill;当前只更新 pdd_order_no、order_submitted_at 和必要状态元数据。
  • purchase_task.actual_unit_price_cent 已存在,语义是下单前规格面板观察到的商品单价,不能复用为订单实付总额。
  • purchase_task 尚无独立的 PDD 订单实付金额字段。
  • #241/#242 原工单明确将金额列为非目标,本需求必须独立建单,不能悄悄扩大旧工单验收范围。

2026-09-18 真机脱敏结构证据

设备 192.168.0.173:38881,PDD 订单详情已展开地址和订单信息。使用标准输出临时读取并当场脱敏,未保存原始 XML。

  • 页面存在唯一可见、不可点击的 TextView;金额与标签在同一节点。
  • 脱敏文字形态:实付:,##.##元,(免运费)。
  • 订单编号位于另一个独立节点。
  • 页面同时存在多组只含 ¥##.## 的商品价格节点,证明不能抓取任意人民币数字。
  • 当前视口未出现下单时间节点,原有有限滚动与跨视口累积逻辑必须保留。

由此确认首版金额识别必须限定“实付”标签,并兼容标签与数字之间的 ASCII/中文冒号、逗号和空白。建议等价规则:

实付[\s::,,]*(\d+(?:\.\d{1,2})?)\s*元

前置依赖与并行性

  • 依赖 #241/#242 已有回填接口和订单扫描实现;只在其现有代码上增量修改,不重做扫描器。
  • 与 #305 可并行设计,但 #305 不得读取或上传本工单金额字段。
  • 涉及数据库追加迁移;实施迁移前必须再次取得用户明确授权。
  • 真机读取为只读,但构建安装及真机验收仍需按用户后续指令执行。

影响范围

  • Android:订单详情金额解析、回填请求 DTO、结果缓存/展示测试。
  • Server:采购任务字段、追加迁移、Agent 回填契约、幂等补写、Admin 查询。
  • Web:采购任务详情复用现有订单信息展示区域增加“实付价格”。
  • SYB 客户端与 #305:无金额数据流变化。

数据与接口设计

数据字段

在 purchase_task 增加可空字段:

pdd_order_amount_cent BIGINT NULL
  • JSON:pddOrderAmountCent。
  • 单位:人民币分,使用整数,不使用浮点数。
  • 语义:PDD 订单详情中带“实付”标签的整单金额;不是商品单价。
  • 与 actual_unit_price_cent 分离;不通过“单价 × 数量”推导。
  • 旧数据保持 NULL。

Agent 回填请求

扩展现有条目,保持向后兼容:

{
  "addressSuffix": "_cg123",
  "pddOrderNo": "...",
  "orderSubmittedAt": "...",
  "pddOrderAmountCent": 2298
}

pddOrderAmountCent 可省略。旧 Agent 和金额不可见的订单继续按原契约工作。

Android 解析规则

  1. BackfillDetailReader 在同一订单详情、同一临时累积器内收集金额;进入下一订单必须清空。
  2. 只识别包含“实付”标签且匹配已确认结构的节点;不使用裸 ¥、商品价格、优惠、运费或页面第一个数字。
  3. 金额使用十进制定点转换为分,最多两位小数;禁止 Double/Float 直接换算。
  4. 同一订单详情:
    • 唯一合法实付金额:随订单条目提交;
    • 没有实付金额:省略字段,不报错;
    • 多个不同实付金额或格式无效:省略字段,不报错;
    • 多个相同实付金额:可去重为一个值。
  5. 金额解析失败不得影响地址后缀、订单号、下单时间、扫描进度和已有安全终止规则。
  6. 不扩大安全点击集合,仍只允许订单卡片、“展开”和返回。

服务端更新规则

服务端继续以设备鉴权、地址后缀、任务归属、订单号冲突规则为准。对金额采用:

  • 本次金额缺失:保持数据库原值,订单回填照常完成。
  • 数据库为空、本次有合法金额:写入金额。
  • 数据库已有相同金额:幂等成功,不增加状态版本。
  • 数据库已有不同金额:不覆盖金额;该条返回稳定的金额冲突信息,但不得撤销或清空已经正确的订单号/下单时间。
  • 已为 order_created 且订单号相同的任务不能在“already_backfilled”分支提前返回;必须先执行上述缺失金额补写判断。
  • 金额补写成功不改变支付、物流、SYB 回填状态,不伪造新的采购 attempt。
  • 同一个 PDD 订单号不得借金额补写路径关联到其他任务。

Admin 展示

复用采购任务详情现有订单信息/el-descriptions 样式,不新增页面或复杂操作:

  • 标签:实付价格;
  • 有值:按人民币格式显示;
  • 空值:尚未获取。

列表页首版不新增金额列,避免增加密度;采购员通过既有 Agent“回填”按钮再次扫描补齐。

此为现有详情区的小范围字段复用,设计证据采用上述明确复用规范与真机脱敏结构证据,不要求完整 QuantUX 新页面原型。若实施时改变列表结构、增加独立入口或金额冲突交互,则必须先补标注截图并重新确认。

#305 边界

  • #305 只使用 pdd_order_no 调用 SYB 订单号回写接口。
  • pdd_order_amount_cent 不进入 SYB 请求,不映射 cost,也不作为 #305 自动回写前置条件。
  • 实付金额缺失或冲突不得阻止 PDD 订单号回写 SYB。

验收标准

  • 真机已确认的 实付:,金额元,(免运费) 结构能够准确解析为人民币分。
  • 页面存在多个商品价格时只取“实付”金额。
  • 无实付、格式异常或多个冲突金额时省略金额且不报错,订单号/下单时间仍正常回填。
  • 已回填相同订单号、Admin 金额为空时,再次扫描能够补齐金额。
  • 相同金额重复提交幂等;不同金额不静默覆盖。
  • Admin 详情正确显示实付价格或“尚未获取”。
  • actual_unit_price_cent 语义和数据不受影响。
  • #305/SYB 请求完全不包含该金额,金额缺失不阻塞订单号回写。
  • 未保存原始控件树、地址全文、手机号、姓名或真实订单数据。

测试要求

  • Android 单测:已确认标点结构、整数/一位/两位小数、多个相同值、多个冲突值、无金额、裸人民币价格干扰、跨视口累积及下一订单清空。
  • Server 单测:旧请求兼容、空值补写、同值幂等、异值冲突、已有订单号的金额补写、混合批次部分成功、设备归属与订单号唯一约束。
  • 数据库迁移测试:旧记录为 NULL、约束和回滚/重复执行策略符合项目迁移规范。
  • Web 最小测试:金额格式化和空值展示。
  • 执行受影响 Android、Server、Web 验证;真实真机扫描不得以单测替代。

风险

  • PDD 文案和标点可能变化,因此只采用已确认结构并让金额失败独立降级。
  • “实付”是页面展示金额,不代表 GoAuto 已执行或确认支付;字段不得驱动支付状态。
  • 已回填订单的补写路径若提前返回会导致金额永远无法补齐,必须覆盖该回归测试。
  • 数据库迁移属于高风险动作,未经授权不得执行。

文档影响

实施后属于长期数据/API 契约变化,需要更新线上 Wiki、回读 revision,再同步本地镜像:

  • Android-Agent-API-Contract:可选 pddOrderAmountCent 与降级规则;
  • Business-Rules-and-Glossary:实付价格与实际单价的区别、只存 Admin、不上传 SYB;
  • Architecture-and-Code-Map:订单扫描和服务端字段路径;
  • #305 实施依据中明确金额不进入 SYB 请求。
## 原始需求摘要 - 来源:用户于 2026-09-18 提出,在 Agent 遍历 PDD「我的订单 → 订单详情」取得订单号和下单时间时,同时读取页面显示的“实付”价格并保存到 Admin。 - 用户确认:不判断是否付款;没有实付价格时跳过金额、不报错,订单号和下单时间仍正常回填;采购员可之后再次人工执行“回填”补齐金额。 - 用户确认:实付价格仅保存到 Admin,不上传 SYB;#305 仍只把 PDD 订单号回写 SYB。 > 本会话未提供可调用的 Gitea MCP 工具,按仓库规则回退 Gitea API 建单;凭据仅从本机安全环境读取,未输出或写入仓库/工单。 ## 目标 1. 扩展 #242 的 PDD 订单详情扫描,在读取订单号、下单时间时尝试读取唯一“实付”金额。 2. 扩展 #241 的 Agent 回填契约,把可选金额以人民币分提交并保存到 Admin。 3. 允许对已经回填订单号的任务再次扫描,补齐此前缺失的实付金额。 4. Admin 采购任务详情展示实付价格,空值明确显示“尚未获取”。 ## 非目标 - 不判断订单是否已付款,不读取或改变支付状态。 - 不识别“需付款”“应付款”或页面任意人民币数字;首版只认真机已确认的“实付”标签。 - 金额缺失、歧义或格式异常不导致订单回填失败。 - 不把实付价格上传、同步或映射到 SYB;不得映射到 `updateDetailPurchaseCode` 的 `cost` 参数。 - 不修改 #305 的订单号回写目标,不执行付款、确认收货、退款、取消订单等操作。 - 不保存原始无障碍控件树、整屏截图、地址全文、手机号、姓名或真实订单数据。 - 首版不修改正常采购结束时 `readOrderResult` 的提交契约;本单只扩展人工“我的订单”回填链路,控制改动范围。 ## 当前事实与证据 ### 代码事实 核验基线:本地 `main` 提交 `9194fd6`,其中: - #242 已实现 Agent 采购记录页“回填”入口、PDD 我的订单有界扫描和 `BackfillDetailReader`;当前 `BackfillItem` 只有 `addressSuffix`、`pddOrderNo`、`orderSubmittedAt`。 - #241 已实现 `POST /api/agent/v1/purchase-tasks/order-backfill`;当前只更新 `pdd_order_no`、`order_submitted_at` 和必要状态元数据。 - `purchase_task.actual_unit_price_cent` 已存在,语义是下单前规格面板观察到的商品单价,不能复用为订单实付总额。 - `purchase_task` 尚无独立的 PDD 订单实付金额字段。 - #241/#242 原工单明确将金额列为非目标,本需求必须独立建单,不能悄悄扩大旧工单验收范围。 ### 2026-09-18 真机脱敏结构证据 设备 `192.168.0.173:38881`,PDD 订单详情已展开地址和订单信息。使用标准输出临时读取并当场脱敏,未保存原始 XML。 - 页面存在唯一可见、不可点击的 `TextView`;金额与标签在同一节点。 - 脱敏文字形态:`实付:,##.##元,(免运费)`。 - 订单编号位于另一个独立节点。 - 页面同时存在多组只含 `¥##.##` 的商品价格节点,证明不能抓取任意人民币数字。 - 当前视口未出现下单时间节点,原有有限滚动与跨视口累积逻辑必须保留。 由此确认首版金额识别必须限定“实付”标签,并兼容标签与数字之间的 ASCII/中文冒号、逗号和空白。建议等价规则: ```regex 实付[\s::,,]*(\d+(?:\.\d{1,2})?)\s*元 ``` ## 前置依赖与并行性 - 依赖 #241/#242 已有回填接口和订单扫描实现;只在其现有代码上增量修改,不重做扫描器。 - 与 #305 可并行设计,但 #305 不得读取或上传本工单金额字段。 - 涉及数据库追加迁移;实施迁移前必须再次取得用户明确授权。 - 真机读取为只读,但构建安装及真机验收仍需按用户后续指令执行。 ## 影响范围 - Android:订单详情金额解析、回填请求 DTO、结果缓存/展示测试。 - Server:采购任务字段、追加迁移、Agent 回填契约、幂等补写、Admin 查询。 - Web:采购任务详情复用现有订单信息展示区域增加“实付价格”。 - SYB 客户端与 #305:无金额数据流变化。 ## 数据与接口设计 ### 数据字段 在 `purchase_task` 增加可空字段: ```text pdd_order_amount_cent BIGINT NULL ``` - JSON:`pddOrderAmountCent`。 - 单位:人民币分,使用整数,不使用浮点数。 - 语义:PDD 订单详情中带“实付”标签的整单金额;不是商品单价。 - 与 `actual_unit_price_cent` 分离;不通过“单价 × 数量”推导。 - 旧数据保持 `NULL`。 ### Agent 回填请求 扩展现有条目,保持向后兼容: ```json { "addressSuffix": "_cg123", "pddOrderNo": "...", "orderSubmittedAt": "...", "pddOrderAmountCent": 2298 } ``` `pddOrderAmountCent` 可省略。旧 Agent 和金额不可见的订单继续按原契约工作。 ## Android 解析规则 1. `BackfillDetailReader` 在同一订单详情、同一临时累积器内收集金额;进入下一订单必须清空。 2. 只识别包含“实付”标签且匹配已确认结构的节点;不使用裸 `¥`、商品价格、优惠、运费或页面第一个数字。 3. 金额使用十进制定点转换为分,最多两位小数;禁止 `Double/Float` 直接换算。 4. 同一订单详情: - 唯一合法实付金额:随订单条目提交; - 没有实付金额:省略字段,不报错; - 多个不同实付金额或格式无效:省略字段,不报错; - 多个相同实付金额:可去重为一个值。 5. 金额解析失败不得影响地址后缀、订单号、下单时间、扫描进度和已有安全终止规则。 6. 不扩大安全点击集合,仍只允许订单卡片、“展开”和返回。 ## 服务端更新规则 服务端继续以设备鉴权、地址后缀、任务归属、订单号冲突规则为准。对金额采用: - 本次金额缺失:保持数据库原值,订单回填照常完成。 - 数据库为空、本次有合法金额:写入金额。 - 数据库已有相同金额:幂等成功,不增加状态版本。 - 数据库已有不同金额:不覆盖金额;该条返回稳定的金额冲突信息,但不得撤销或清空已经正确的订单号/下单时间。 - 已为 `order_created` 且订单号相同的任务不能在“already_backfilled”分支提前返回;必须先执行上述缺失金额补写判断。 - 金额补写成功不改变支付、物流、SYB 回填状态,不伪造新的采购 attempt。 - 同一个 PDD 订单号不得借金额补写路径关联到其他任务。 ## Admin 展示 复用采购任务详情现有订单信息/`el-descriptions` 样式,不新增页面或复杂操作: - 标签:`实付价格`; - 有值:按人民币格式显示; - 空值:`尚未获取`。 列表页首版不新增金额列,避免增加密度;采购员通过既有 Agent“回填”按钮再次扫描补齐。 此为现有详情区的小范围字段复用,设计证据采用上述明确复用规范与真机脱敏结构证据,不要求完整 QuantUX 新页面原型。若实施时改变列表结构、增加独立入口或金额冲突交互,则必须先补标注截图并重新确认。 ## #305 边界 - #305 只使用 `pdd_order_no` 调用 SYB 订单号回写接口。 - `pdd_order_amount_cent` 不进入 SYB 请求,不映射 `cost`,也不作为 #305 自动回写前置条件。 - 实付金额缺失或冲突不得阻止 PDD 订单号回写 SYB。 ## 验收标准 - [ ] 真机已确认的 `实付:,金额元,(免运费)` 结构能够准确解析为人民币分。 - [ ] 页面存在多个商品价格时只取“实付”金额。 - [ ] 无实付、格式异常或多个冲突金额时省略金额且不报错,订单号/下单时间仍正常回填。 - [ ] 已回填相同订单号、Admin 金额为空时,再次扫描能够补齐金额。 - [ ] 相同金额重复提交幂等;不同金额不静默覆盖。 - [ ] Admin 详情正确显示实付价格或“尚未获取”。 - [ ] `actual_unit_price_cent` 语义和数据不受影响。 - [ ] #305/SYB 请求完全不包含该金额,金额缺失不阻塞订单号回写。 - [ ] 未保存原始控件树、地址全文、手机号、姓名或真实订单数据。 ## 测试要求 - Android 单测:已确认标点结构、整数/一位/两位小数、多个相同值、多个冲突值、无金额、裸人民币价格干扰、跨视口累积及下一订单清空。 - Server 单测:旧请求兼容、空值补写、同值幂等、异值冲突、已有订单号的金额补写、混合批次部分成功、设备归属与订单号唯一约束。 - 数据库迁移测试:旧记录为 NULL、约束和回滚/重复执行策略符合项目迁移规范。 - Web 最小测试:金额格式化和空值展示。 - 执行受影响 Android、Server、Web 验证;真实真机扫描不得以单测替代。 ## 风险 - PDD 文案和标点可能变化,因此只采用已确认结构并让金额失败独立降级。 - “实付”是页面展示金额,不代表 GoAuto 已执行或确认支付;字段不得驱动支付状态。 - 已回填订单的补写路径若提前返回会导致金额永远无法补齐,必须覆盖该回归测试。 - 数据库迁移属于高风险动作,未经授权不得执行。 ## 文档影响 实施后属于长期数据/API 契约变化,需要更新线上 Wiki、回读 revision,再同步本地镜像: - `Android-Agent-API-Contract`:可选 `pddOrderAmountCent` 与降级规则; - `Business-Rules-and-Glossary`:实付价格与实际单价的区别、只存 Admin、不上传 SYB; - `Architecture-and-Code-Map`:订单扫描和服务端字段路径; - #305 实施依据中明确金额不进入 SYB 请求。
Author
Owner

2026-09-18 开始实施:用户指定 gpt-5.6-sol 子代理开发、主代理独立审核。基于包含 #241/#242 的本地 main 9194fd6 建立隔离分支。按本单既定详情展示规范复用组件;金额缺失不影响订单号/时间回填,金额仅存 Admin。编写并在隔离测试库验证追加迁移,本机业务库/线上迁移、发布和安装未授权,不执行。当前无可调用 Gitea MCP,沿用 API 回退。

2026-09-18 开始实施:用户指定 gpt-5.6-sol 子代理开发、主代理独立审核。基于包含 #241/#242 的本地 main 9194fd6 建立隔离分支。按本单既定详情展示规范复用组件;金额缺失不影响订单号/时间回填,金额仅存 Admin。编写并在隔离测试库验证追加迁移,本机业务库/线上迁移、发布和安装未授权,不执行。当前无可调用 Gitea MCP,沿用 API 回退。
Author
Owner

实现与主代理审核完成(待验收,2026-09-18)

按用户要求,由 gpt-5.6-sol 子代理实施,主代理独立逐文件审核、回归测试与截图复核。范围仍为人工“我的订单”回填,不改正常采购的 readOrderResult,不上传金额到 SYB,不判断或执行支付。

实现

  • Android:同节点“实付”定点解析,兼容真机标点结构;多个相同值去重,缺失/坏格式/溢出/不同值冲突只省略金额,不影响订单号和下单时间。跨订单清空,不保存原始树/地址全文。
  • Server:可空非负 purchase_task.pdd_order_amount_cent,与原实际单价独立;旧请求兼容,已 order_created 同号任务允许补空金额。同值不增加版本,异值保留原值并返回 PURCHASE_BACKFILL_AMOUNT_CONFLICT 警告。负整数局部忽略;类型/小数/溢出 JSON 仍为原解码器批级422,Agent不会发送这些异常值。
  • Android 采用 Server 已保存金额,成功warning单独缓存和提示,不写成任务失败errorCode。
  • Admin:复用现有订单 state-card,显示 CNY 实付价格或“尚未获取”;不增加列表列或新操作。
  • 迁移 1789800100000_purchase_order_amount.go 使用局部 purchase_task 模型,不运行全域 AutoMigrate。
  • #305 边界:本次没有变更 SYB 客户端或写回实现,金额不映射 cost,也不成为订单号回写前提;不宣称 #305 已实现。

主代理审核修正

要求并复核:异常金额不能阻塞回填;迁移限于目标表;冲突warning与失败字段分离;补充旧回执兼容、同reader清空、零金额、溢出、迁移重跑保留业务值/非负约束测试。恢复了子代理一度放宽的既有Web布局断言,改用独立金额测试,不以降低旧断言取得通过。

验证

  • Server purchase 115项、version-local migration 17项通过(SQLite隔离测试库);主代理复跑相关包通过,Server go build通过。
  • 主代理 go test ./app/goauto/... ./cmd/migrate/migration/version-local:除sybimport的12个旧测试失败外通过;在未修改main基线复跑sybimport,同12项失败,未混入本单修复。
  • Android OrderBackfillTest 18项通过;assembleDebug通过。
  • Web build:prod通过;隔离19527端口静态加载本次dist,金额专项Playwright 2项通过。主代理实际查看有值/空值完整截图,字段清晰可见。
  • Web全量lint仍有既有27 errors;原采购管理测试的筛选控件同排布局断言仍失败,保留原断言,未宣称全量Web测试通过。9527服务未更改,临时19527服务已停止。
  • git diff --check通过。
  • harness check --strict被既有未登记 docs/evidence/pdd-home-35727-summary.md 阻塞;main基线同样失败。本单未修改该历史文件。
  • 没有执行业务数据库迁移、MySQL真库验证、真机回填扫描、创建订单、付款或线上发布。端到端回填仍待授权迁移/服务端更新后验收。

用户追加授权的真机安装

用户本轮追加授权“after build new apk,install apk to 192.168.0.173:38881”。已再次assembleDebug并通过 adb install -r 覆盖安装,保留应用数据,未启动回填或采购。

  • 包:cn.ilapage.goauto.agent;versionName 0.9.59 / versionCode 72(既有版本标签未改,以本次hash区分)。
  • 设备lastUpdateTime:2026-09-18 09:27:49。
  • 本地与设备安装APK SHA-256一致:bd5f97a0190911f2ee7e45dd8911ca3c0fc16baad3ae39a9ec0ce18cd267070b。
  • 安装不代表Server已更新:旧Server严格拒绝新字段,使用金额回填前必须另行授权执行追加迁移并发布新Server;当前请勿向旧Server执行带金额回填。

文档、提交与交付

三个Wiki均显式保留标题写入并回读正文/revision,随后完成一轮sync和一轮sync --check,全部镜像一致:

  • Android-Agent-API-Contract:05441afb3c22828b8d17d4b9dcf2592075092076
  • Business-Rules-and-Glossary:d11ff945f559869ad638de2c0da198cbf6f31d7e
  • Architecture-and-Code-Map:d192f3976c44b15a53221211eaed903bdec4fcd6

已提交并推送分支 feat/306-order-paid-amount:

  • 8c01329:实现及Android/Server测试
  • d35d735:Wiki镜像
  • 07a3817:Admin金额专项测试

未合并main、未发布。代码审核通过,保留工单打开待验收;真实业务库迁移与端到端验证尚未完成。Gitea继续使用API回退,原因同开始实施记录。

## 实现与主代理审核完成(待验收,2026-09-18) 按用户要求,由 gpt-5.6-sol 子代理实施,主代理独立逐文件审核、回归测试与截图复核。范围仍为人工“我的订单”回填,不改正常采购的 readOrderResult,不上传金额到 SYB,不判断或执行支付。 ### 实现 - Android:同节点“实付”定点解析,兼容真机标点结构;多个相同值去重,缺失/坏格式/溢出/不同值冲突只省略金额,不影响订单号和下单时间。跨订单清空,不保存原始树/地址全文。 - Server:可空非负 purchase_task.pdd_order_amount_cent,与原实际单价独立;旧请求兼容,已 order_created 同号任务允许补空金额。同值不增加版本,异值保留原值并返回 PURCHASE_BACKFILL_AMOUNT_CONFLICT 警告。负整数局部忽略;类型/小数/溢出 JSON 仍为原解码器批级422,Agent不会发送这些异常值。 - Android 采用 Server 已保存金额,成功warning单独缓存和提示,不写成任务失败errorCode。 - Admin:复用现有订单 state-card,显示 CNY 实付价格或“尚未获取”;不增加列表列或新操作。 - 迁移 1789800100000_purchase_order_amount.go 使用局部 purchase_task 模型,不运行全域 AutoMigrate。 - #305 边界:本次没有变更 SYB 客户端或写回实现,金额不映射 cost,也不成为订单号回写前提;不宣称 #305 已实现。 ### 主代理审核修正 要求并复核:异常金额不能阻塞回填;迁移限于目标表;冲突warning与失败字段分离;补充旧回执兼容、同reader清空、零金额、溢出、迁移重跑保留业务值/非负约束测试。恢复了子代理一度放宽的既有Web布局断言,改用独立金额测试,不以降低旧断言取得通过。 ### 验证 - Server purchase 115项、version-local migration 17项通过(SQLite隔离测试库);主代理复跑相关包通过,Server go build通过。 - 主代理 go test ./app/goauto/... ./cmd/migrate/migration/version-local:除sybimport的12个旧测试失败外通过;在未修改main基线复跑sybimport,同12项失败,未混入本单修复。 - Android OrderBackfillTest 18项通过;assembleDebug通过。 - Web build:prod通过;隔离19527端口静态加载本次dist,金额专项Playwright 2项通过。主代理实际查看有值/空值完整截图,字段清晰可见。 - Web全量lint仍有既有27 errors;原采购管理测试的筛选控件同排布局断言仍失败,保留原断言,未宣称全量Web测试通过。9527服务未更改,临时19527服务已停止。 - git diff --check通过。 - harness check --strict被既有未登记 docs/evidence/pdd-home-35727-summary.md 阻塞;main基线同样失败。本单未修改该历史文件。 - 没有执行业务数据库迁移、MySQL真库验证、真机回填扫描、创建订单、付款或线上发布。端到端回填仍待授权迁移/服务端更新后验收。 ### 用户追加授权的真机安装 用户本轮追加授权“after build new apk,install apk to 192.168.0.173:38881”。已再次assembleDebug并通过 adb install -r 覆盖安装,保留应用数据,未启动回填或采购。 - 包:cn.ilapage.goauto.agent;versionName 0.9.59 / versionCode 72(既有版本标签未改,以本次hash区分)。 - 设备lastUpdateTime:2026-09-18 09:27:49。 - 本地与设备安装APK SHA-256一致:bd5f97a0190911f2ee7e45dd8911ca3c0fc16baad3ae39a9ec0ce18cd267070b。 - 安装不代表Server已更新:旧Server严格拒绝新字段,使用金额回填前必须另行授权执行追加迁移并发布新Server;当前请勿向旧Server执行带金额回填。 ### 文档、提交与交付 三个Wiki均显式保留标题写入并回读正文/revision,随后完成一轮sync和一轮sync --check,全部镜像一致: - Android-Agent-API-Contract:05441afb3c22828b8d17d4b9dcf2592075092076 - Business-Rules-and-Glossary:d11ff945f559869ad638de2c0da198cbf6f31d7e - Architecture-and-Code-Map:d192f3976c44b15a53221211eaed903bdec4fcd6 已提交并推送分支 feat/306-order-paid-amount: - 8c01329:实现及Android/Server测试 - d35d735:Wiki镜像 - 07a3817:Admin金额专项测试 未合并main、未发布。代码审核通过,保留工单打开待验收;真实业务库迁移与端到端验证尚未完成。Gitea继续使用API回退,原因同开始实施记录。
Author
Owner

已授权合并、迁移与线上发布完成(2026-09-18)

  • 用户明确授权合并main、迁移、部署线上。#305及#306已快进合并main并推送;运行代码7e257ca,发布记录提交65d1f34(仅文档,未改变运行产物)。
  • 线上185.216.248.75新目录/home/goauto/releases/20260918-7e257ca-305;旧目录/home/goauto/releases/20260916-03647dd保留。服务器内数据库备份/home/goauto/backups/20260918-305/database.sql,39,879,933字节,文件0600;没有下载或输出生产数据。
  • 迁移核验:原51项,仅缺1789800100000、1789800200000;现两项均执行成功,金额nullable BIGINT、回填三表及单例租约已回读。没有批量排入历史订单,验证时队列0条。
  • 既有启动权限对账已登记新POST接口与purchaser权限。任务1/2的status=1、3/4/5的status=2保持不变;没有修改Cron、主动触发同步、创建采购订单或执行付款。
  • 新release只修正自身的资源链接:static直接引用20260907-29ba16e-236/static,var直接引用20260903-2d6d244-r1/var,均为确认存在的真实目录。旧release之间已有static/var循环,不再继承;不删除或覆盖历史资源。旧代码回滚路径保留,但其原循环问题仍须注意。
  • GoAuto服务重启、Nginx配置检查与reload完成;两服务active。公网Admin首页与10项JS/CSS资源HTTP200,/api/v1/health HTTP200。未认证采购接口业务码401;已登录采购列表200并含orderWriteback;新接口空批次422(无业务写入)。最近结构日志检查无panic/fatal/1146/1054。
  • main合并后重新运行受影响Server测试通过,Linux amd64二进制及Web生产构建通过。二进制本地与线上SHA256一致:4833d779843f0613455ea2b56cadff6efd88d2b96c13e00cb4423cac02e72cb7。
  • Deployment-and-Operations已更新并在线回读revision 26ff59a7203d84dfe1a8e929fda24204960f1d7c;随后一次sync与一次sync --check,17个镜像一致,镜像提交65d1f34已推送main。本次未改变其他长期契约。
  • #306已有APK可使用新服务端;本次无Android构建/安装或升级发布操作。没有以真实采购任务手动验证SYB写入,不把健康检查冒充回填端到端成功;后续正常上报可自动入队,历史订单仍需手动勾选补偿。
  • 当前代码、迁移及部署完成,工单保留open待用户验收。Gitea使用API回退,原因同前述记录。
## 已授权合并、迁移与线上发布完成(2026-09-18) - 用户明确授权合并main、迁移、部署线上。#305及#306已快进合并main并推送;运行代码7e257ca,发布记录提交65d1f34(仅文档,未改变运行产物)。 - 线上185.216.248.75新目录/home/goauto/releases/20260918-7e257ca-305;旧目录/home/goauto/releases/20260916-03647dd保留。服务器内数据库备份/home/goauto/backups/20260918-305/database.sql,39,879,933字节,文件0600;没有下载或输出生产数据。 - 迁移核验:原51项,仅缺1789800100000、1789800200000;现两项均执行成功,金额nullable BIGINT、回填三表及单例租约已回读。没有批量排入历史订单,验证时队列0条。 - 既有启动权限对账已登记新POST接口与purchaser权限。任务1/2的status=1、3/4/5的status=2保持不变;没有修改Cron、主动触发同步、创建采购订单或执行付款。 - 新release只修正自身的资源链接:static直接引用20260907-29ba16e-236/static,var直接引用20260903-2d6d244-r1/var,均为确认存在的真实目录。旧release之间已有static/var循环,不再继承;不删除或覆盖历史资源。旧代码回滚路径保留,但其原循环问题仍须注意。 - GoAuto服务重启、Nginx配置检查与reload完成;两服务active。公网Admin首页与10项JS/CSS资源HTTP200,/api/v1/health HTTP200。未认证采购接口业务码401;已登录采购列表200并含orderWriteback;新接口空批次422(无业务写入)。最近结构日志检查无panic/fatal/1146/1054。 - main合并后重新运行受影响Server测试通过,Linux amd64二进制及Web生产构建通过。二进制本地与线上SHA256一致:4833d779843f0613455ea2b56cadff6efd88d2b96c13e00cb4423cac02e72cb7。 - Deployment-and-Operations已更新并在线回读revision 26ff59a7203d84dfe1a8e929fda24204960f1d7c;随后一次sync与一次sync --check,17个镜像一致,镜像提交65d1f34已推送main。本次未改变其他长期契约。 - #306已有APK可使用新服务端;本次无Android构建/安装或升级发布操作。没有以真实采购任务手动验证SYB写入,不把健康检查冒充回填端到端成功;后续正常上报可自动入队,历史订单仍需手动勾选补偿。 - 当前代码、迁移及部署完成,工单保留open待用户验收。Gitea使用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#306