T34 Android 地址后缀、不可逆门禁与创建订单 #36

Closed
opened 2026-08-17 10:00:49 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:需求 / Android / 高风险真实订单动作
  • 所属总体设计:#32
  • 阶段:待实施(受 #32 QuantUX 原型审核门禁阻塞)

依赖与并行

  • 前置工单:#33、#34、#42
  • 是否允许并行:否;必须先证明规则驱动演练、Room任务记录和Outbox可靠
  • 原因:本工单只在已验收的安全执行基线上增加地址修改和一次性真实订单动作

子项目影响

  • 交付单元:android / shared-docs
  • 是否跨子项目:是
  • 验证:Android单元、APK构建、规则模拟,以及用户再次确认后的真机验收

做什么

  • 复用已验收的采购演练规则执行、Room任务/尝试记录和Outbox,不重复实现商品规格选择流程。
  • 仅live采购规则可以进入PDD确认订单和地址步骤;rehearsal在服务端和Agent双重拒绝。
  • 进入确认订单页后修改PDD App维护的固定收货地址。
  • 只清理末尾(?:-|_)cg\d+$旧后缀,追加_cg{task.id};禁止破坏真实地址主体。
  • 保存后返回确认页,验证当前后缀和基础地址均正确;失败时返回shipping_address_update_failed并禁止创建订单。
  • 最终再次复核商品、规格、数量、订单总价、目标包名/Activity和唯一创建订单按钮。
  • 点击创建订单前在本地事务持久化order_submit_started/irreversible_action_at及最终确认快照。
  • 创建订单按钮最多点击一次;无论点击结果是否明确,之后只能进入只读订单核对,绝不重新下单。
  • 只读核对获得唯一未付款PDD订单后保存订单号和下单时间,并通过既有Outbox幂等上报。
  • 进程重启后恢复核对/上报;零个或多个订单候选进入order_result_unknown并交由人工处理。
  • 同时遵守设备本地互斥和服务端PDD账号租约。

不做什么

  • 永不点击支付,不处理免密支付,不自动判断人工支付结果。
  • 不保存账号凭据、原始控件树或截图,不使用OCR/VLM。
  • 不实现物流采集或货运宝回填。
  • 不把PDD具体文字和控件ID重新硬编码进流程服务;页面证据优先由规则提供。

验收标准

  • 演练模式在任何规则组合下都不能调用地址和创建订单动作。
  • 地址保存后双重校验失败时绝不触发创建订单。
  • 数量1到N在同一个PDD订单中处理,不自动拆单。
  • 不可逆标记和最终确认快照先于唯一一次创建订单点击持久化。
  • Agent崩溃、重启和重复上报时只读核单或重发Outbox,不再次创建订单。
  • 登录失效、验证码、风控、人机验证、规格缺失、价格超限和结果未知均明确失败。
  • APK构建通过;真实下单测试必须单独获得用户确认且不支付。

风险和回退

本工单会修改真实PDD地址并创建真实待付款订单,属于高风险。真机阶段再次等待人工确认;可停用live采购能力并回退APK,演练和现有采集能力保持可用。

## 基本信息 - 类型:需求 / Android / 高风险真实订单动作 - 所属总体设计:#32 - 阶段:待实施(受 #32 QuantUX 原型审核门禁阻塞) ## 依赖与并行 - 前置工单:#33、#34、#42 - 是否允许并行:否;必须先证明规则驱动演练、Room任务记录和Outbox可靠 - 原因:本工单只在已验收的安全执行基线上增加地址修改和一次性真实订单动作 ## 子项目影响 - 交付单元:android / shared-docs - 是否跨子项目:是 - 验证:Android单元、APK构建、规则模拟,以及用户再次确认后的真机验收 ## 做什么 - 复用已验收的采购演练规则执行、Room任务/尝试记录和Outbox,不重复实现商品规格选择流程。 - 仅`live`采购规则可以进入PDD确认订单和地址步骤;`rehearsal`在服务端和Agent双重拒绝。 - 进入确认订单页后修改PDD App维护的固定收货地址。 - 只清理末尾`(?:-|_)cg\d+$`旧后缀,追加`_cg{task.id}`;禁止破坏真实地址主体。 - 保存后返回确认页,验证当前后缀和基础地址均正确;失败时返回`shipping_address_update_failed`并禁止创建订单。 - 最终再次复核商品、规格、数量、订单总价、目标包名/Activity和唯一创建订单按钮。 - 点击创建订单前在本地事务持久化`order_submit_started`/`irreversible_action_at`及最终确认快照。 - 创建订单按钮最多点击一次;无论点击结果是否明确,之后只能进入只读订单核对,绝不重新下单。 - 只读核对获得唯一未付款PDD订单后保存订单号和下单时间,并通过既有Outbox幂等上报。 - 进程重启后恢复核对/上报;零个或多个订单候选进入`order_result_unknown`并交由人工处理。 - 同时遵守设备本地互斥和服务端PDD账号租约。 ## 不做什么 - 永不点击支付,不处理免密支付,不自动判断人工支付结果。 - 不保存账号凭据、原始控件树或截图,不使用OCR/VLM。 - 不实现物流采集或货运宝回填。 - 不把PDD具体文字和控件ID重新硬编码进流程服务;页面证据优先由规则提供。 ## 验收标准 - [ ] 演练模式在任何规则组合下都不能调用地址和创建订单动作。 - [ ] 地址保存后双重校验失败时绝不触发创建订单。 - [ ] 数量1到N在同一个PDD订单中处理,不自动拆单。 - [ ] 不可逆标记和最终确认快照先于唯一一次创建订单点击持久化。 - [ ] Agent崩溃、重启和重复上报时只读核单或重发Outbox,不再次创建订单。 - [ ] 登录失效、验证码、风控、人机验证、规格缺失、价格超限和结果未知均明确失败。 - [ ] APK构建通过;真实下单测试必须单独获得用户确认且不支付。 ## 风险和回退 本工单会修改真实PDD地址并创建真实待付款订单,属于高风险。真机阶段再次等待人工确认;可停用`live`采购能力并回退APK,演练和现有采集能力保持可用。
ila changed title from T34 Android 采购规则、地址后缀与创建订单 to T34 Android 地址后缀、不可逆门禁与创建订单 2026-08-17 10:24:54 +08:00
Author
Owner

实施完成,等待代码验收与独立真机授权

#32、#33、#34、#42 前置门禁均已解除。本次只实施和自动化验证,没有在三星手机安装新 APK,没有修改真实 PDD 地址,没有点击真实“创建订单”,也没有执行任何支付动作。

实现结果

  • Android Agent 升级为 0.2.0,新增能力:purchase.live.v1、purchase.address-update.v1、purchase.order-create.v1;演练能力保持兼容。
  • 规则解析器接受受限正式动作 updateShippingAddress、createOrder、readOrderResult,正式动作禁止参数化;演练规则仍拒绝这些动作,任意支付动作继续拒绝。
  • 地址修改只在唯一地址入口、唯一修改按钮(多地址时只认唯一默认地址)和唯一详细地址输入框成立时执行;按首个 - 或 _ 截断旧后缀,追加任务 _cg{taskId},保存后回读完整地址。任何失败都停止在创建订单之前。
  • 地址全文只存在于本次执行内存,不写 SQLite、服务端、日志、控件树或截图。
  • 创建订单前先在 Android 本地 SQLite 事务保存 order_submit_started、不可逆时间、稳定请求 ID 和脱敏最终确认快照,再使用同一请求 ID 调用服务端 /order-submit-started;然后重新校验商品、规格、数量、单价、地址、PDD 包/Activity 和唯一创建订单按钮。
  • 最终创建订单按钮每次执行实例最多点击一次;进入不可逆边界后,点击异常、断网或重启只允许重放同一服务端标记、只读核单或上报 order_result_unknown,绝不再次点击。
  • 只读核单读取唯一未付款订单号和 PDD 下单时间;可以安全返回一次并做有限滚动,但不会点击任何支付控件。无法唯一确认时进入 order_result_unknown。
  • 本地采购数据库由 v1 升级到 v2,增加不可逆恢复字段;这是 Android 本地 SQLite 迁移,不涉及服务端 MySQL 迁移。

验证

  • ./scripts/verify.ps1 -Component android:Debug/Release 单元测试通过,Debug APK 构建通过。
  • go test ./app/goauto/purchase ./app/goauto/purchasecontract:通过,确认既有服务端状态机和规则契约兼容。
  • 新增测试覆盖:地址旧后缀覆盖、保存回读、最终按钮只点一次、订单号/下单时间读取、支付按钮不点击、live 规格探测在正式动作前返回、演练/支付规则拒绝。
  • python dev_scripts/harness.py sync --check:通过。
  • python dev_scripts/harness.py check --strict:通过。
  • git diff --check:通过。

构建与提交

  • 提交:6a0dfed feat(#36): add guarded Android live purchase,已推送 main。
  • APK:android/app/build/outputs/apk/debug/app-debug.apk
  • APK SHA-256:C088D7CDE3C202A3CC86A68A8B0E126341C02E7C7E410F58C6DAAE8CE3BA7692
  • APK 尚未安装到三星,避免设备上报 live 能力后自动领取正式任务。

Wiki

  • Project-Profile:b882c9ed3995bcafd103801a1893191b86cc3382
  • Architecture-and-Code-Map:a582b9ed5712d0c1fceeb5530f60a3d746cbbd24
  • Business-Rules-and-Glossary:f0e414f176cd42e0ec79fcabe46c5497e4294e9a
  • Android-Agent-API-Contract:440e5c2e9e6a67e532d09301d617849a3df05297
  • 任务归档:65537b7baac6d2257d0d3aa15db52993ab51c23d

未验证与下一门禁

  • 未验证三星/PDD 当前版本的真实地址页、保存流程、最终创建按钮和订单号页面控件树。
  • 未产生真实待付款订单,未验证真实订单号和下单时间回传。
  • 真机阶段必须由用户再次明确授权测试设备、商品和允许产生一个待付款订单;系统永不支付。

状态:代码待验收;真机创建订单待独立授权。工单暂不关闭。

## 实施完成,等待代码验收与独立真机授权 #32、#33、#34、#42 前置门禁均已解除。本次只实施和自动化验证,没有在三星手机安装新 APK,没有修改真实 PDD 地址,没有点击真实“创建订单”,也没有执行任何支付动作。 ### 实现结果 - Android Agent 升级为 `0.2.0`,新增能力:`purchase.live.v1`、`purchase.address-update.v1`、`purchase.order-create.v1`;演练能力保持兼容。 - 规则解析器接受受限正式动作 `updateShippingAddress`、`createOrder`、`readOrderResult`,正式动作禁止参数化;演练规则仍拒绝这些动作,任意支付动作继续拒绝。 - 地址修改只在唯一地址入口、唯一修改按钮(多地址时只认唯一默认地址)和唯一详细地址输入框成立时执行;按首个 `-` 或 `_` 截断旧后缀,追加任务 `_cg{taskId}`,保存后回读完整地址。任何失败都停止在创建订单之前。 - 地址全文只存在于本次执行内存,不写 SQLite、服务端、日志、控件树或截图。 - 创建订单前先在 Android 本地 SQLite 事务保存 `order_submit_started`、不可逆时间、稳定请求 ID 和脱敏最终确认快照,再使用同一请求 ID 调用服务端 `/order-submit-started`;然后重新校验商品、规格、数量、单价、地址、PDD 包/Activity 和唯一创建订单按钮。 - 最终创建订单按钮每次执行实例最多点击一次;进入不可逆边界后,点击异常、断网或重启只允许重放同一服务端标记、只读核单或上报 `order_result_unknown`,绝不再次点击。 - 只读核单读取唯一未付款订单号和 PDD 下单时间;可以安全返回一次并做有限滚动,但不会点击任何支付控件。无法唯一确认时进入 `order_result_unknown`。 - 本地采购数据库由 v1 升级到 v2,增加不可逆恢复字段;这是 Android 本地 SQLite 迁移,不涉及服务端 MySQL 迁移。 ### 验证 - `./scripts/verify.ps1 -Component android`:Debug/Release 单元测试通过,Debug APK 构建通过。 - `go test ./app/goauto/purchase ./app/goauto/purchasecontract`:通过,确认既有服务端状态机和规则契约兼容。 - 新增测试覆盖:地址旧后缀覆盖、保存回读、最终按钮只点一次、订单号/下单时间读取、支付按钮不点击、live 规格探测在正式动作前返回、演练/支付规则拒绝。 - `python dev_scripts/harness.py sync --check`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 - `git diff --check`:通过。 ### 构建与提交 - 提交:`6a0dfed feat(#36): add guarded Android live purchase`,已推送 `main`。 - APK:`android/app/build/outputs/apk/debug/app-debug.apk` - APK SHA-256:`C088D7CDE3C202A3CC86A68A8B0E126341C02E7C7E410F58C6DAAE8CE3BA7692` - APK 尚未安装到三星,避免设备上报 live 能力后自动领取正式任务。 ### Wiki - Project-Profile:`b882c9ed3995bcafd103801a1893191b86cc3382` - Architecture-and-Code-Map:`a582b9ed5712d0c1fceeb5530f60a3d746cbbd24` - Business-Rules-and-Glossary:`f0e414f176cd42e0ec79fcabe46c5497e4294e9a` - Android-Agent-API-Contract:`440e5c2e9e6a67e532d09301d617849a3df05297` - [任务归档](https://git.ilapage.cn/OPC/goauto/wiki/Task-36-Android%E5%9C%B0%E5%9D%80%E5%90%8E%E7%BC%80%E4%B8%8D%E5%8F%AF%E9%80%86%E9%97%A8%E7%A6%81%E4%B8%8E%E5%88%9B%E5%BB%BA%E8%AE%A2%E5%8D%95.-):`65537b7baac6d2257d0d3aa15db52993ab51c23d` ### 未验证与下一门禁 - 未验证三星/PDD 当前版本的真实地址页、保存流程、最终创建按钮和订单号页面控件树。 - 未产生真实待付款订单,未验证真实订单号和下单时间回传。 - 真机阶段必须由用户再次明确授权测试设备、商品和允许产生一个待付款订单;系统永不支付。 状态:代码待验收;真机创建订单待独立授权。工单暂不关闭。
Author
Owner

三星安装验证补充

  • 安装目标:三星 SM-G9700(服务端设备 ID 4)。
  • 安装前、安装后均确认活动正式采购任务数量为 0;本次没有修改 PDD 地址、没有创建订单、没有支付。
  • 首次覆盖安装发现离线设备启动时会在心跳前请求采购任务,服务端返回“设备离线”,造成心跳恢复死锁;已做最小修复为“先心跳恢复在线,再查询任务”。
  • 修复提交:f0cc0a5 fix(#36): recover heartbeat before task polling,已推送 main。
  • Android 全套单元测试与 Debug APK 构建重新通过。
  • 已重新覆盖安装 Agent 0.2.0;服务端确认设备 online,上报能力包含 purchase.live.v1、purchase.address-update.v1、purchase.order-create.v1、purchase.spec-probe.v1。
  • 最终 APK SHA-256:951E6148653719CD0732E09D3901224F4D31EE037DD3A47DB8A8A101B317DF9C。
  • App 进程重启后系统关闭了 GoAuto 无障碍服务;未使用 ADB 强制修改安全设置,需要用户在手机“无障碍”中手动重新开启。开启前 Agent 不会执行 PDD 自动化。

状态仍为待验收;真机创建待付款订单仍需独立授权。

## 三星安装验证补充 - 安装目标:三星 SM-G9700(服务端设备 ID 4)。 - 安装前、安装后均确认活动正式采购任务数量为 0;本次没有修改 PDD 地址、没有创建订单、没有支付。 - 首次覆盖安装发现离线设备启动时会在心跳前请求采购任务,服务端返回“设备离线”,造成心跳恢复死锁;已做最小修复为“先心跳恢复在线,再查询任务”。 - 修复提交:`f0cc0a5 fix(#36): recover heartbeat before task polling`,已推送 `main`。 - Android 全套单元测试与 Debug APK 构建重新通过。 - 已重新覆盖安装 Agent 0.2.0;服务端确认设备 `online`,上报能力包含 `purchase.live.v1`、`purchase.address-update.v1`、`purchase.order-create.v1`、`purchase.spec-probe.v1`。 - 最终 APK SHA-256:`951E6148653719CD0732E09D3901224F4D31EE037DD3A47DB8A8A101B317DF9C`。 - App 进程重启后系统关闭了 GoAuto 无障碍服务;未使用 ADB 强制修改安全设置,需要用户在手机“无障碍”中手动重新开启。开启前 Agent 不会执行 PDD 自动化。 状态仍为待验收;真机创建待付款订单仍需独立授权。
Author
Owner

关联缺陷 #66 已由用户明确验收并关闭:CG-12 已出现在 PDD「待付款订单」中,创建订单后的多微信选择器恢复与只读核单通过,未执行支付。

#36 保持开启,等待其整体验收,不因子缺陷关闭而自动关闭。

关联缺陷 #66 已由用户明确验收并关闭:CG-12 已出现在 PDD「待付款订单」中,创建订单后的多微信选择器恢复与只读核单通过,未执行支付。 #36 保持开启,等待其整体验收,不因子缺陷关闭而自动关闭。
Author
Owner

用户于 2026-08-22 明确确认:#36 验收通过。

验收事实:CG-12 已完成正式采购闭环,数据库状态为 order_created,PDD 订单号和下单时间均已保存;不可逆动作记录早于订单结果,未执行支付。关联缺陷 #66 已验收关闭。

用户于 2026-08-22 明确确认:#36 验收通过。 验收事实:CG-12 已完成正式采购闭环,数据库状态为 `order_created`,PDD 订单号和下单时间均已保存;不可逆动作记录早于订单结果,未执行支付。关联缺陷 #66 已验收关闭。
ila closed this issue 2026-08-22 11:36:26 +08:00
Author
Owner

验收归档已更新并在线回读确认:

  • Wiki 页面:Task-36-Android地址后缀不可逆门禁与创建订单
  • Wiki revision:fa28e93c231cc4cda48637efd7644d9e42cc00f9
  • 验收标记:已确认存在
  • python dev_scripts/harness.py sync --check:通过

工具说明:工单评论与关闭使用 Gitea MCP;MCP 读取中文 Wiki 页面时发生 % 二次编码并返回 404,因此仅 Wiki 归档读写回退 Gitea API。

验收归档已更新并在线回读确认: - Wiki 页面:`Task-36-Android地址后缀不可逆门禁与创建订单` - Wiki revision:`fa28e93c231cc4cda48637efd7644d9e42cc00f9` - 验收标记:已确认存在 - `python dev_scripts/harness.py sync --check`:通过 工具说明:工单评论与关闭使用 Gitea MCP;MCP 读取中文 Wiki 页面时发生 `%` 二次编码并返回 404,因此仅 Wiki 归档读写回退 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#36