Files
cmroubao/docs/tasks/T-219.md
T

6.5 KiB
Raw Blame History

id, title, phase, deps, status, created, context_ref, work_branch, write_paths
id title phase deps status created context_ref work_branch write_paths
T-219 Admin 待付款提醒与端到端验收 2
T-218
DOING 2026-07-28 a77d8be null
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 鉴权资源路由;不建立以订单号为参数的新路由。

验收要点

  • repository 按任务和 Admin subject 读取稳定排序的 submission,空值不报错。
  • Admin API 仅鉴权返回对账字段且 no-store,订单号不进 URL/日志。
  • SSR 正确区分 FENCED、MANUAL_REVIEW、RECONCILED 和历史未下单 SUCCEEDED。
  • RECONCILED 展示订单号、时间、SKU、数量、金额、截图及人工付款提醒。
  • Web/App 均没有付款按钮、重试提交或自动支付动作。
  • Go test/race/vet、Android test/Debug/Release、根验证与响应式 Playwright 通过。
  • 最小跨端 fixture 证明唯一 submission 和 Admin 提醒闭环。

边界

  • 不修改 T-218 单次提交和对账状态机,不创建第二个订单。
  • 不读取支付结果,不把任务自动改成“已付款/采购完成”。
  • 不实现付款跳转、支付方式选择、自动付款、验证码或风控绕过。
  • 不因生产真机缺少安全地址而伪造成功态。

执行记录

  • 2026-07-28:T-218 实现提交 a77d8be 后领取。冻结 Admin 三态展示、鉴权订单字段、 历史成功文案兼容、Roubao 终态提醒和隔离数据库端到端验收。