docs: import wiki at afc651f75a3a
+141
@@ -0,0 +1,141 @@
|
||||
<!-- docs-wiki-sync:docs/tasks/T-219.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
|
||||
> 同步来源:[`docs/tasks/T-219.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-219.md) · commit `afc651f75a3a`
|
||||
|
||||
---
|
||||
id: T-219
|
||||
title: Admin 待付款提醒与端到端验收
|
||||
phase: 2
|
||||
deps:
|
||||
- T-218
|
||||
status: DONE
|
||||
created: 2026-07-28
|
||||
context_ref: a77d8be
|
||||
work_branch: null
|
||||
write_paths:
|
||||
- docs/tasks/T-219.md
|
||||
- docs/00-ai-start-here.md
|
||||
- docs/02-requirements.md
|
||||
- docs/04-architecture.md
|
||||
- docs/06-tasks.md
|
||||
- docs/07-user-stories.md
|
||||
- docs/08-interaction-checklist.md
|
||||
- docs/api.md
|
||||
- docs/current-state.md
|
||||
- docs/routes.md
|
||||
- backend-api/internal/domain/**
|
||||
- backend-api/internal/repository/sqlite/**
|
||||
- backend-api/internal/transport/httpapi/**
|
||||
- backend-api/internal/transport/webui/**
|
||||
- android-buyer/app/src/main/**
|
||||
- android-buyer/app/src/test/**
|
||||
---
|
||||
|
||||
## 问题 / 背景
|
||||
|
||||
T-218 已把唯一对账成功的待付款订单保存到 `order_submissions`,但 Admin 任务详情尚未
|
||||
读取这张表;成功任务仍沿用旧文案“验证完成,未提交订单”。采购员因此无法从后台
|
||||
区分“未提交”“提交后正在对账”“需要人工对账”和“已有待付款订单”。
|
||||
|
||||
本任务把 T-215 至 T-218 的结果收敛到一个可核对的 Admin 终点,并在 Roubao 端显示
|
||||
同一结果。提醒只要求人员打开拼多多订单列表复核并付款,不提供支付跳转、自动付款或
|
||||
任何支付凭证处理。
|
||||
|
||||
## 关联需求与交互
|
||||
|
||||
- `FR-22`:一个授权最多创建一个订单,未知结果禁止重提。
|
||||
- `FR-23`:唯一回读后 Admin 展示待付款提醒,付款由人员完成。
|
||||
- `US-010` / `IX-011`:展示订单号、下单时间、SKU、数量、金额和证据。
|
||||
|
||||
## 冻结合约
|
||||
|
||||
### 详情读取与鉴权
|
||||
|
||||
1. `TaskDetail` 在原任务、execution、report 和 authorization 之外读取该任务全部
|
||||
`order_submissions`,按 `fenced_at ASC, id ASC` 稳定排序;不存在时返回空数组。
|
||||
2. repository 必须同时限定 task creator subject,不能先按 submission ID 读取再由
|
||||
handler 判断。Admin JSON 与 SSR 页面继续使用现有 ADMIN session/bearer 鉴权。
|
||||
3. `GET /api/v1/tasks/{task_id}` 新增 `order_submissions`。每项包含围栏状态、预期
|
||||
标题/SKU/数量/单价/总额、围栏时间;仅 `RECONCILED` 包含订单号、平台下单时间、
|
||||
`PENDING_PAYMENT` 和对账 evidence 引用。
|
||||
4. 响应使用 `Cache-Control: no-store`。订单号不能进入 URL、页面标题、日志、事件
|
||||
message、VLM 请求、埋点或截图文件名;404/403 不泄露订单是否存在。
|
||||
|
||||
### Admin 状态与提醒
|
||||
|
||||
1. `FENCED` 显示“订单提交结果正在对账,禁止重复提交”,不显示成功或付款提醒。
|
||||
2. `MANUAL_REVIEW` 显示“需要人工核对订单,仍禁止重复提交”,同时显示稳定中文理由;
|
||||
不提供“重试提交”操作。
|
||||
3. `RECONCILED` 在任务详情标题之后、原始要求之前显示醒目的
|
||||
“待人工确认付款”状态区,并展示完整订单号、平台下单时间、待付款状态、已授权
|
||||
商品标题、SKU、数量、单价、总额和受控对账截图。
|
||||
4. 旧的 `SUCCEEDED -> 验证完成,未提交订单` 只适用于没有 reconciled submission
|
||||
且 `execution_outcome.order_submitted=false` 的历史流程;有 reconciled submission
|
||||
时不得出现该文案。
|
||||
5. 提醒文案固定为“请采购员打开拼多多订单列表,核对商品、规格、数量和金额后人工
|
||||
付款”。页面不提供付款按钮、深链、二维码、自动跳转或可执行的订单操作。
|
||||
6. 状态不能只靠颜色;订单字段用 `dl`,平台时间使用带 RFC3339 `datetime` 的
|
||||
`time` 元素,截图有可访问替代文本。360 px、390 px 和 1440 px 宽度不横向溢出。
|
||||
|
||||
### Roubao 终态
|
||||
|
||||
1. 本地 `RECONCILED` 使用 Keystore-backed submission 展示订单号、平台下单时间、
|
||||
待付款状态和核验总额,并提示“请到拼多多订单列表人工确认付款”。
|
||||
2. `MANUAL_REVIEW` 继续显示原因并明确禁止重新提交;App 不增加付款按钮或自动打开
|
||||
支付页。
|
||||
3. 订单号只在已有鉴权会话和当前加密任务状态中展示;清理任务时随 submission 一起
|
||||
清除。
|
||||
|
||||
### 端到端验收
|
||||
|
||||
1. 自动化 fixture 覆盖
|
||||
`Admin create -> device claim/start -> candidates -> Admin authorize ->
|
||||
command ACK -> dry-run READY -> submission FENCED -> RECONCILED ->
|
||||
Admin API/Web reminder`,并断言同一 authorization 只有一个 submission。
|
||||
2. 同一 fixture 验证 `FENCED`、`MANUAL_REVIEW` 和 `RECONCILED` 三种 SSR 文案,
|
||||
`RECONCILED` 不再显示“未提交订单”,所有页面都没有支付表单或付款链接。
|
||||
3. Playwright 在桌面和两种手机宽度检查真实 SSR 页面:无脚本错误、横向溢出或文字/
|
||||
控件重叠,对账截图请求成功且受 ADMIN session 保护。
|
||||
4. 生产真机没有受控收货地址时继续沿用 T-218 的 fail-closed 结果,不为制造演示订单
|
||||
添加地址或跨过“立即支付/先用后付”边界;端到端成功态使用隔离测试数据库。
|
||||
|
||||
## 数据与 API
|
||||
|
||||
- 不新增 migration;复用 v11 `order_submissions` 和
|
||||
`reconciliation_evidence_asset_id`。
|
||||
- `domain.TaskDetail.OrderSubmissions []OrderSubmission` 是读取模型。
|
||||
- Admin `GET /api/v1/tasks/{task_id}` 增加 `order_submissions` 数组。
|
||||
- SSR `Task` 增加只读 `OrderSubmissions`,证据 URL 使用现有 task/execution-scoped
|
||||
鉴权资源路由;不建立以订单号为参数的新路由。
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [x] repository 按任务和 Admin subject 读取稳定排序的 submission,空值不报错。
|
||||
- [x] Admin API 仅鉴权返回对账字段且 `no-store`,订单号不进 URL/日志。
|
||||
- [x] SSR 正确区分 FENCED、MANUAL_REVIEW、RECONCILED 和历史未下单 SUCCEEDED。
|
||||
- [x] RECONCILED 展示订单号、时间、SKU、数量、金额、截图及人工付款提醒。
|
||||
- [x] Web/App 均没有付款按钮、重试提交或自动支付动作。
|
||||
- [x] Go test/race/vet、Android test/Debug/Release、根验证与响应式 Playwright 通过。
|
||||
- [x] 最小跨端 fixture 证明唯一 submission 和 Admin 提醒闭环。
|
||||
|
||||
## 边界
|
||||
|
||||
- 不修改 T-218 单次提交和对账状态机,不创建第二个订单。
|
||||
- 不读取支付结果,不把任务自动改成“已付款/采购完成”。
|
||||
- 不实现付款跳转、支付方式选择、自动付款、验证码或风控绕过。
|
||||
- 不因生产真机缺少安全地址而伪造成功态。
|
||||
|
||||
## 执行记录
|
||||
|
||||
- 2026-07-28:T-218 实现提交 `a77d8be` 后领取。冻结 Admin 三态展示、鉴权订单字段、
|
||||
历史成功文案兼容、Roubao 终态提醒和隔离数据库端到端验收。
|
||||
- 2026-07-28:文档合约提交为 `c2ec98d`。`TaskDetail`、Admin API 和 SSR 已读取
|
||||
submission;管理详情区分 `FENCED`、`MANUAL_REVIEW`、`RECONCILED`,唯一对账后
|
||||
展示完整订单号、平台时间、授权快照、受控证据和人工付款提醒。Roubao 同步展示
|
||||
对账终态,未增加付款或重复提交动作。
|
||||
- 2026-07-28:设备到 Admin 的自动化 fixture 已覆盖创建、领取、候选、授权、命令
|
||||
确认、dry-run、围栏、唯一对账和提醒,断言每个授权只有一个 submission。真实 SSR
|
||||
使用隔离数据库在 1440x900、390x844、360x800 验证,无脚本错误、横向溢出或付款
|
||||
操作,证据请求成功;生产数据库未修改,未创建真实拼多多订单。
|
||||
- 2026-07-28:`go test ./...`、`go test -race ./...`、`go vet ./...`、Android
|
||||
Debug/Release 单元测试与构建、根 `init.ps1` 全部通过。Debug APK
|
||||
`1.4.16 (21)` 已覆盖安装到 PKG110,并恢复、确认肉包无障碍服务。
|
||||
Reference in New Issue
Block a user