Files
cmbuyer/docs/routes.md
T

152 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 路由与页面结构
> 本文约定 web 端页面路由、页面职责和组件归属,以及 desk 端的界面结构。
> 具体交互行为以[交互清单](08-interaction-checklist.md)为准,接口形状以 [API 合约](api.md) 为准。
## 一、web 端页面路由
| 路由 | 页面 | 职责 | 用户故事 | 交互 |
| --- | --- | --- | --- | --- |
| `/login` | 登录 | 建立管理会话 | US-007 | IX-001 |
| `/tasks` | 采购任务 | 传统表格查询、创建弹窗、批量开始试选、进入详情抽屉 | US-001、US-002、US-010 | IX-002、IX-003、IX-004、IX-012 |
| `/tasks/new` | 手工建单直达页 | 复用创建表单,作为无脚本和直接访问的完整页兜底 | US-001 | IX-002 |
| `/tasks/{id}` | 任务详情 | 从列表进入时显示右侧详情抽屉;直接访问时显示完整页;承载试选确认、授权与待付款核对 | US-002、US-004、US-005 | IX-004、IX-005、IX-006 |
> `/tasks/import`(Excel)与 `/freight*`(ERP)随 F-002 / F-003 推迟到 V2。
登录后默认进入 `/tasks`。未登录访问受保护页面时跳转 `/login` 并携带站内返回路径;
**只接受 `/tasks` 及其子路径**,拒绝绝对 URL、`//` 和反斜杠。
## 二、web 端页面职责
### 采购任务 `/tasks`
采用采购人员熟悉的传统表格,默认按创建时间倒序。固定列为:选择、标题、颜色、尺码、
价格上限、数量、采购结果、状态、创建时间;不设置操作列。
- 标题链接在新标签打开拼多多商品页;标题下方任务编号链接打开内部任务详情。
- “采购结果”由结构化字段在展示层格式化为“阶段:颜色 | 尺码 | 单价 | 数量”;未产生
试选或下单结果时显示 `—`,不得把试选写成已下单。
- 双击行非控件区域,或聚焦行后按 Enter,打开 `/tasks/{id}` 的右侧详情抽屉。关闭抽屉、
按 Esc 或浏览器返回后,保留筛选、选择、滚动位置并把焦点还给原行。
- 直接访问 `/tasks/{id}` 或在抽屉中选择“在完整页面打开”时,使用完整详情页;关键路由可
深链接,不能只有无法复制地址的弹层状态。
- 第一工具行:导入(MVP 禁用占位并说明原因)、创建。创建打开模态表单;保存后任务以
`DRAFT` 状态出现在第一行。`/tasks/new` 保留为同表单的直达兜底。
- 第二工具行默认显示标题关键词、筛选、清除;状态和创建时间放在默认折叠的“更多条件”中,
保留 F-004 查询范围而不挤占常用操作。勾选 `DRAFT` 后切换成上下文批量栏,显示已选数量、
开始试选、清除选择;全选只覆盖当前筛选结果中的 `DRAFT`。
- “开始试选”把所选任务原子转为 `PENDING`,只进入第一趟试选队列;不签发授权、不创建
订单、不付款。其他状态复选框禁用并说明原因。
- 窄屏允许表格容器内部横向滚动,但页面本身不得横向溢出;选择列与标题列保持可见。
### 任务详情 `/tasks/{id}`
按任务当前状态呈现不同主区块,同一时刻只出现一个主动作:
| 状态 | 主区块 |
| --- | --- |
| `WAITING_CONFIRMATION` | **试选确认卡** + 确认 / 退回 |
| `AUTHORIZED` / 未围栏的 `ORDERING` | 授权摘要 + **放弃授权**入口 |
| 已围栏的 `ORDERING` / `RECONCILIATION_REQUIRED` | 提交围栏摘要 + 「订单可能已创建」提示 + 人工核查入口;**无重试 / 放弃按钮** |
| `WAITING_PAYMENT` | 待付款核对卡(订单截图、商品、规格、数量、授权金额)+ 标记完成 |
| `NEEDS_MANUAL` | 原因说明 + 处理入口 |
| 终态 | 结果摘要 + 执行证据 |
**试选确认卡**是 MVP 的核心交互。人只回答一个问题:**机器选对了吗**。
```text
你要的: 白色 · XL · 2 件 · 上限 ¥80
机器选到: 白色 · XL ✓ 一致
单价 ¥32.50 × 2 = ¥65.00 ✓ 没超
[规格面板截图]
商品标题:2026夏季新款纯棉圆领短袖T恤…
[ 确认下单(不付款) ] [ 退回,不买 ]
```
- 这是**轻量确认,不是对照台**——只有一个商品,不需要并排比较多个候选。
多候选对照台随 B 路径推迟到 V2。
- 不需要「选择理由 / 拒绝理由」下拉,保留一个可选备注即可。
- 机器选到的值与需求不一致时(✗),确认按钮**默认禁用**,需先退回或转人工。
- **不提供列表页一键确认。** 确认前必须看过截图,这道闸不能省。
### 授权卡住时的出口
`AUTHORIZED` / 未建立提交围栏的 `ORDERING` 必须提供「放弃授权」入口;放弃后进入
`PENDING_RETRIAL`,重新跑第一趟。围栏建立后不得放弃,页面改为提供「进入人工核查」入口,
并明确禁止再次提交。**每个状态都必须给出安全且可执行的下一步**——这是验收项。
### 建单页
`/tasks` 的创建弹窗与 `/tasks/new` 直达页复用同一表单:任务名称、拼多多链接、颜色分类、
尺码、数量、价格上限。链接无法解析出 `goods_id` 时明确报错并保留已填内容;保存成功后
任务为 `DRAFT`,尚未进入设备领取队列。
## 三、desk 端界面结构
桌面端产品名为“采购工具”,不是网页;使用顶部固定两页签,不做多级导航,默认打开采购执行:
| 页签 | 职责 | 用户故事 | 交互 |
| --- | --- | --- | --- |
| 采购执行 | 连接与会话状态、当前任务与可选图片、滚动日志、执行记录 | US-003、US-008 | IX-007、IX-008 |
| 配置 | 设备档案、ADB 路径与 serial、常用超时参数、连接检查 | US-003 | IX-007 |
### 采购执行页
- 顶部状态区:web、设备、拼多多 App 实际 / 已取证版本和会话状态;开始 / 停止轮询固定在
最右侧且只控制轮询会话。版本不一致时 fail closed 并提示重新取证。
- 宽屏三块工作区:左上当前任务,左下滚动日志,右侧执行记录;窄屏按此顺序改为单列。
- 当前任务左侧显示商品、规格、数量、**当前是第一趟还是第二趟**、步骤和剩余租约;右侧约
1/3 显示可选商品 / 证据预览。无可信图片时保持空态,有图必须标来源与采集时间。
- 滚动日志标题区同时显示下次轮询、连续失败和本次完成,不再使用独立会话卡或底部控制条。
- 执行记录只显示标题、状态两列,任务编号与时间放在标题次行,按采集时间倒序。单击选择;
双击、Enter、可见“查看所选记录”或右键打开详情。
- 记录详情上部左侧显示原始文字、右侧显示图片证据,下部显示结构化采购结果;关闭后焦点
返回原行。图片缺失不使用其他来源凑合。
- **待人工时整页显著变色并说明缺什么**,不要让执行员盯着一个静止画面猜。
- 关闭窗口即停止轮询;连续失败达阈值自动停止并显示原因。
### 配置页
- 设备档案必须**显式填写 serial**,不允许留空自动选——同一手机 USB + WiFi 同时在线时
自动选会失败(见[架构设计](04-architecture.md)第六节)。
- 连接检查只做连接和确认拼多多已安装,**不打开商品、不选规格、不创建订单**。
- 运行中冻结设备切换与参数保存。
## 四、导航规则
- web 端从路由化详情抽屉返回工作台时不重新加载列表;完整详情页返回时保留原筛选条件。
- desk 端启动时若服务端有本设备的活跃任务,优先恢复该任务,不允许直接领取下一条。
- 第一趟试选完成后**必须退出商品页**再进入下一轮轮询,不停在规格面板等人。
- desk 端在真机步骤执行期间禁用硬取消和关闭窗口,避免留下无法判定的中间态。
- 任何进入外部支付页的情形,desk 端立即停止并跳回待人工,**不提供「继续」按钮**。
- dry-run 与真实下单必须使用不同的醒目标识;dry-run 不得出现可触发真实提交的控件。
- 已建立提交围栏后,不提供重新领取、重新提交或放弃授权,只能恢复同一提交记录并调和。
## 五、组件归属
| 组件 | 归属 | 说明 |
| --- | --- | --- |
| `AppShell` | web 全局 | 导航、登录态、CSRF 注入 |
| `TaskTable` | 采购任务 | 任务表格、创建时间倒序、选择状态与结构化采购结果格式化 |
| `QueryBar` | 采购任务 | 标题关键词、筛选与清除 |
| `BulkTrialBar` | 采购任务 | `DRAFT` 批量选择与开始第一趟试选 |
| `CreateTaskDialog` | 采购任务 / 建单直达页 | 复用手工建单表单与字段错误 |
| `TaskDetailDrawer` | 采购任务 | `/tasks/{id}` 路由驱动的右侧详情容器与焦点恢复 |
| `SpecTrialCard` | 任务详情 | 试选确认卡(MVP 签名组件) |
| `AuthorizePanel` | 任务详情 | 确认 / 退回 / 放弃授权 |
| `PaymentCheckCard` | 任务详情 | 待付款核对与标记完成 |
| `DeviceStatusBar` | desk 采购执行页 | web、设备与 App 版本三项就绪状态 |
| `PollControls` | desk 采购执行页 | 顶部固定的轮询开关与会话状态;日志标题区承载倒计时、失败和完成计数 |
| `CurrentTaskPanel` | desk 采购执行页 | 当前任务文字、步骤与带来源的可选图片证据 |
| `ExecutionLog` | desk 采购执行页 | 最新在上的滚动日志与假诊断导出 |
| `ExecutionRecordTable` | desk 采购执行页 | 标题 / 状态两列、时间倒序和稳定记录 ID |
| `ExecutionRecordDialog` | desk 采购执行页 | 原始文字、图片证据、采购结果与焦点恢复 |
## 六、原型
低保真原型放 `docs/design/`,约定见 [`design/README.md`](design/README.md)。
原型只回答「页面上有什么」,行为权威是[交互清单](08-interaction-checklist.md);
实现时按真实框架重写,**不复制原型代码**。