--- 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,并恢复、确认肉包无障碍服务。