docs: import wiki at afc651f75a3a
+88
@@ -0,0 +1,88 @@
|
||||
<!-- docs-wiki-sync:docs/tasks/T-279.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
|
||||
> 同步来源:[`docs/tasks/T-279.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-279.md) · commit `afc651f75a3a`
|
||||
|
||||
---
|
||||
id: T-279
|
||||
title: 跑通确认商品后的规格选择与待支付下单
|
||||
phase: 2
|
||||
deps:
|
||||
- T-272
|
||||
- T-275
|
||||
- T-278
|
||||
status: DONE
|
||||
created: 2026-08-01
|
||||
context_ref: 54debcd
|
||||
work_branch: null
|
||||
write_paths:
|
||||
- docs/tasks/T-279.md
|
||||
- docs/current-state.md
|
||||
- docs/04-architecture.md
|
||||
- docs/05-coding-rules.md
|
||||
- docs/api.md
|
||||
- android-buyer/app/src/main/**
|
||||
- android-buyer/app/src/test/**
|
||||
- backend-api/migrations/**
|
||||
- backend-api/internal/**
|
||||
---
|
||||
|
||||
## 问题 / 背景
|
||||
|
||||
Admin 人工确认候选后,App 已能领取包含规范商品 URL/goods_id 的命令,但订单 dry-run
|
||||
仍有三个断点:拼多多商品详情无障碍树通常不暴露 goods_id,导致定向打开后被错误拒绝;
|
||||
订单链路没有复用 T-272/T-277 的节点 JSON + 本机 VLM 规格/价格兜底;确定性失败只在
|
||||
手机本地反复重试,后台长期显示执行中,界面也停留在拼多多。
|
||||
|
||||
## 行为契约
|
||||
|
||||
1. App 只执行后台已确认且通过 command hash 的 canonical Pinduoduo 商品;定向打开后,
|
||||
标题必须匹配,并用当前页 goods_id、已授权详情指纹或当前页分享链接解析出的 goods_id
|
||||
至少一项复核商品身份。分享解析必须复用受限剪贴板/网络策略,失败时不能放宽到只看标题。
|
||||
2. 颜色、尺码和当前组合价仍先走确定性无障碍规则。缺少唯一目标、选中状态、摘要或价格时,
|
||||
复用 T-272/T-277 当前节点 JSON、截图、本机模型和 node ID 复核;最多三次模型调用,
|
||||
每次点击后重新取根节点,金额仍由代码拼接节点并解析。
|
||||
3. 规格最终证据必须同时证明目标颜色、目标尺码和唯一价格;再按 T-278 冻结总额上限、
|
||||
数量和订单确认页总额复核。模型不能点击确认订单、提交订单或支付。
|
||||
4. dry-run 的确定性终态失败必须立即幂等回传后台:授权变为 `FAILED`,记录稳定 failure code,
|
||||
任务保留在等待人工重新选择/重新授权的可恢复状态;瞬时无障碍/网络错误最多保留一次短重试。
|
||||
5. 后端已确认 dry-run READY 后才允许现有 T-218 单次提交围栏继续;只点击一次“提交订单”,
|
||||
绝不点击支付。订单号/下单时间回传后,Admin 提醒采购员到拼多多确认并付款。
|
||||
6. 成功、终态失败或安全停止后都切回 Roubao;App 不得留在拼多多继续循环。
|
||||
|
||||
## 方案
|
||||
|
||||
1. 将当前页商品身份解析抽成 dry-run driver 能调用的受限 resolver,并为 direct 路径实现
|
||||
goods_id/详情指纹/分享解析三选一的严格复核。
|
||||
2. 给 order dry-run driver 接入现有 `PinduoduoSpecificationVlmAssistant` 和同一安全快照,
|
||||
将候选链路的逐项选择及最终价格证明复用于确认商品链路。
|
||||
3. 增加设备 dry-run failure API、数据库失败状态/审计字段和 Android 加密 outbox;区分
|
||||
`IDENTITY_MISMATCH`、`SKU_UNRESOLVED`、`PRICE_UNVERIFIED`、`BUDGET_EXCEEDED`、
|
||||
`TRANSIENT_AUTOMATION` 等稳定代码。
|
||||
4. 调整执行调度:终态错误一次上报后停止本地重试并返回 Roubao;仅瞬时错误允许一次重试。
|
||||
5. 增加无 goods_id 但分享链接一致、VLM 选择/拆分价格、伪造节点、终态失败幂等上报、
|
||||
单次提交与返回 App 的回归测试。
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [x] canonical 链接打开的详情页即使节点树没有 goods_id,也能经指纹或分享链接严格确认。
|
||||
- [x] 确定性规格/价格失败时本机 VLM 可选择正确颜色和尺码,并由代码解析真实价格。
|
||||
- [x] 未知 node ID、结构变化、低置信度、身份不一致和价格超额全部失败关闭。
|
||||
- [x] 终态 dry-run 失败以固定幂等键上报,后台不再长期显示执行中,手机切回 Roubao。
|
||||
- [x] dry-run READY 后复用现有单次下单围栏,最终只生成待支付订单并回传订单信息。
|
||||
- [x] Go 全量测试/vet、Android 双变体单测、lint 和构建通过。
|
||||
|
||||
## 边界
|
||||
|
||||
- 不自动付款,不选择或修改收货地址,不处理验证码/风控绕过。
|
||||
- 不把模型配置迁移到 Admin;使用 Roubao 设置中已经测试通过的本机模型配置。
|
||||
- 不允许仅凭标题、截图相似度或模型陈述替代商品 ID/授权指纹复核。
|
||||
|
||||
## 执行记录
|
||||
|
||||
- 2026-08-01:按“严格商品身份 + 本机 VLM 规格/价格兜底 + 终态失败回传”的方案创建任务,
|
||||
状态 `TODO`。
|
||||
- 2026-08-01:direct dry-run 增加 goods_id、授权详情指纹、当前分享链接三选一严格身份
|
||||
复核;复用裁剪节点 JSON 和 Roubao 本机模型兜底颜色、尺码和当前组合价。
|
||||
- 2026-08-01:新增设备 failure API 和五类稳定失败代码;失败先写加密本地状态,再使用
|
||||
固定幂等键重传。瞬时自动化只重试一次,确定性失败停止操作并切回 Roubao。
|
||||
- 2026-08-01:完成商品身份、VLM node-ID 选择/价格解析、失败接口和两次尝试上限回归
|
||||
测试;全量 Go/Android 验收通过,状态改为 `DONE`。
|
||||
Reference in New Issue
Block a user