Files
docs/头程到尾程分阶段流程/阶段一-客户准入与头程下单.md
T

465 lines
20 KiB
Markdown
Raw Normal View History

2026-09-18 16:48:32 +08:00
# 阶段一:客户准入与头程下单
> 对应全景流程:F01~F07。
> 阶段起点:企业已注册并可以登录。
> 阶段终点:平台审核通过,Order 为 `APPROVED`,Firstleg 已创建正式国内入库单并沿用固定入仓码,统一主状态进入 `WAIT_MEASURE`。
> 本文只记录现状流程;易用性问题先登记,不在本文直接改状态、接口或页面。
## 1. 阶段目标和边界
本阶段解决六件事:
1. 确认“谁可以代表哪个客户下单”;
2. 确认客户是否具备提交资格;
3. 冻结订单的国内收货仓、目的仓、渠道、地址和货物申报;
4. 生成客户可见的订单号和全局唯一入仓码;
5. 由平台审核订单并建立正式国内入库单;
6. 把权威订单和申报快照交给下一阶段的国内收货、测量和计费。
本阶段不负责:货物是否已经到仓、实际尺寸重量、费用最终确认、分柜、装柜、出仓和海外履约。
## 2. 角色、终端与权限
| 角色 | 终端 | 可做操作 | 不可做操作 |
|---|---|---|---|
| 企业成员 | Client | 按权限查看本企业订单 | 查看其他客户、平台内部备注和成本 |
| 企业订单操作员 | Client | 新建、编辑草稿、批量导入、提交、按规则取消 | 指定客户 ID、修改审核状态、维护公共仓库/渠道 |
| 企业管理员 | Client | 管理本企业成员角色,并拥有获授权的订单操作 | 配置平台后台权限、跨企业授权 |
| 平台订单运营 | Admin | 查询授权数据、审核、维护允许的申报字段 | 修改客户归属、订单号、入仓码或实测事实 |
| 平台超级管理员 | Admin | 在平台权限范围内处理全部订单 | 绕过服务端状态机、直接指定任意目标状态 |
| Order 服务 | 后端 | 保存订单、货物、快照、状态、入仓码、审计和 Outbox | 拥有测量、仓位、柜次或海外库存 |
| Firstleg 服务 | 后端 | 审核后创建国内入库单,接收版本化申报更新 | 成为订单交易状态权威 |
客户数据范围必须来自已认证身份。页面传入的 `tenantId/customerId` 不能单独形成授权。
## 3. F02 基础资料准备
### 3.1 企业和账号
- 企业注册完成,可以用中文邮箱/手机号和密码登录;
- 企业基本资料、联系信息和资质文件已填写;
- 平台已经人工审核企业资料;
- 当前成员拥有 `order:first-leg:create`、`order:first-leg:submit` 等对应权限;
- 当前客户 Finance 资金账户存在且提交时可用。
注册成功不等于具备提交资格。资料未审核通过时仍可登录、补资料和保存草稿,但提交订单必须失败关闭。
### 3.2 下单主数据
| 主数据 | 权威来源 | 下单使用方式 |
|---|---|---|
| 国内收货仓 | Warehouse | 只能选 `ACTIVE` 且具备对应收货能力的公共仓 |
| FBA/海外目的仓 | Warehouse | 按目的类型返回匹配且启用的公共仓 |
| 私人目的地址 | Order 客户地址簿 | 只能选择本客户 `PRIVATE_DESTINATION`,或保存本单临时快照 |
| 平台提货地址 | Order 客户地址簿 | `PICKUP` 时选择本客户 `PICKUP` 地址 |
| 运输渠道与价格 | Firstleg 价格/渠道目录 | 先选国内收货仓,再加载当前有效渠道 |
| 企业资格 | IAM | 提交时实时校验 |
| 资金账户 | Finance | 提交时校验实际余额不小于 0 |
下拉列表只负责选择,提交时服务端必须重新查询权威主数据。Warehouse、IAM 或 Finance 无法返回可信结果时提交失败,不回退前端旧缓存。
## 4. F01 企业资料与下单资格流程
### 4.1 客户维护企业资料
入口:Client → 公司信息。
现状操作:
1. 填写企业名称、统一社会信用代码、企业类型和注册地址等基本信息;
2. 填写联系人、手机、邮箱、微信和联系地址;
3. 上传营业执照;法人身份证为可选资料;
4. 保存后等待平台审核。
数据归属:企业和成员属于 IAM。公司联系电话/邮箱是企业资料,不等于成员登录标识;成员手机号修改走账号链路。
### 4.2 平台审核企业资料
入口:Admin → 客户管理/企业资料审核。
1. 平台查看企业资料和资质;
2. 资料正确时点击审核通过;
3. 资料不正确时联系客户修改,不在头程订单流程伪造通过;
4. 审核通过后,客户获得订单提交资格。
### 4.3 提交资格实时检查
客户打开订单页时可以看到企业资料审核提示,但页面提示不是最终门禁。点击提交时服务端重新检查:
- 当前客户身份和成员权限;
- 企业资料审核状态;
- Finance 资金账户有效响应;
- 实际余额是否小于 0;
- 仓库、渠道、目的仓和地址是否仍有效。
草稿保存不触发资金门禁,因此“能保存”不能解释成“能提交”。
## 5. F03 客户单票下单详细操作
入口:Client → 头程订单 → 创建订单。
### 5.1 选择履约类型
当前主要履约形态:
| 履约形态 | 业务含义 | 关键限制 |
|---|---|---|
| 普通头程 | 普通 FBA、海外仓或私人仓货物 | 按箱码进入后续测量和装柜 |
| `ONE_CLICK_DROPSHIP` 一件代发 | 国内清点 SKU、组托后跨境,海外按 SKU/箱唛出库 | 每个货物明细必须有 SKU;目的类型固定走海外仓能力,不允许靠货名推导 SKU |
### 5.2 选择交货方式
| 交货方式 | 页面值 | 必填数据 | 后续含义 |
|---|---|---|---|
| 快递自送 | `SELF_EXPRESS` | 国内收货仓;快递信息按页面当前要求维护 | 客户自行寄到国内仓 |
| 平台上门提货 | `PICKUP` | 本企业提货地址、联系人、电话、城市、详细地址、预约提货时间 | 订单冻结客户要求的提货事实;不等于订舱级拖车 |
| 卡车自送 | `SELF_TRUCK` | 国内收货仓和本单自送信息 | 客户自行送到国内仓 |
`PICKUP` 地址可从地址簿选择,也可保存当前地址。停用地址不能用于新订单,但历史订单继续显示已冻结快照。
### 5.3 选择国内收货仓和渠道
1. 从平台有效国内收货仓单选;
2. 选择仓库后加载该仓可用运输渠道;
3. 选择渠道,保存稳定 `channelCode` 和服务端名称快照;
4. 选择报价包税方式;
5. 选择买单或退税;
6. 选择整柜 `FCL` 或散货 `LCL`;
7. 木制品货物要求商检时,页面和服务端必须校验。
渠道编码是业务校验依据,不能从渠道中文名称反推。
### 5.4 选择目的类型和目的地
| 目的类型 | 页面操作 | 服务端规则 |
|---|---|---|
| `FBA` | 选择平台维护的有效 FBA 仓 | 仓库类型必须匹配;货物行要求货件编号和跟踪编号 |
| `OVERSEAS` | 选择平台维护的有效海外目的仓 | 不允许用私人地址或国内仓冒充 |
| `PRIVATE` | 选择/保存本企业私人地址,填写名称、联系人、电话、国家、城市、地址和邮编 | 地址属于本客户;不创建伪公共仓 |
一件代发页面不开放 FBA/私人仓选择,使用海外仓路径承接后续海外库存。
### 5.5 录入货物明细
每张订单至少一条货物明细。当前页面覆盖:
| 分类 | 字段 |
|---|---|
| 识别 | SKU、中文品名、英文品名、产品图片、混箱组合 |
| 包装 | 包装类型(纸箱/托盘/木箱)、材质、箱数、每箱数量、总数量 |
| 申报尺寸重量 | 长宽高、总毛重、总净重、总体积 |
| 海关申报 | 报关 HS CODE、清关 HS CODE、申报单价、申报金额 |
| FBA | 货件编号、跟踪编号、UPC |
| 产品属性 | 用途、型号、品牌、产品规格、危险品、木制品 |
| 辅助 | 备注 |
关键计算和校验:
- 总数量、总重量和总体积由明细汇总,不能另传一套冲突合计;
- 箱数、件数、重量和体积必须满足正数/非负规则;
- FBA 货物必须填写货件编号和跟踪编号;
- 木制品必须满足商检选择;
- 一件代发 SKU 强制存在,同一箱可通过混箱组合保存多个 SKU;
- 图片只保存经 File 校验的文件引用,Order 不长期保存图片二进制。
### 5.6 订单级其他信息
- 期望出货日期:客户期望,不等于平台确认 ETD;
- 客户备注:客户和平台可见;
- 客户参考号/跟踪编号:用于客户内部定位,不替代平台订单号;
- 费用预估:下单阶段只作当前规则下的估算,不能当成最终费用或客户确认版本。
### 5.7 保存草稿
客户点击“保存草稿”:
- Order 保存主表、Party 快照和货物明细;
- 状态保持 `DRAFT`;
- 不生成入仓码;
- 不创建 Firstleg 正式入库单;
- 不触发资金账户校验;
- 后续可继续编辑或取消。
## 6. F04 客户批量导入详细流程
入口:Client → 头程订单 → 批量导入订单。
### 6.1 下载模板
模板按当前登录客户动态生成:
- 本客户有效提货地址和私人地址;
- 全部有效国内收货仓;
- 匹配目的类型的有效目的仓;
- 当前有效渠道和中文下拉项;
- 日期、数字和枚举校验。
模板目录必须读取全部分页候选,不能只生成第一页选项。
### 6.2 填写和上传
- 文件只接受 `.xlsx`;
- 最大 5MB;
- 最多 50 行有效数据;
- 直接选择中文下拉值,不填写内部 ID;
- 平台上门提货必须填写预约时间和提货地址;
- 木制品必须选择商检;
- 一件代发必须填写 SKU。
### 6.3 两种导入模式
| 模式 | 行失败时行为 |
|---|---|
| `PARTIAL` | 成功行创建草稿,失败行返回行号、字段和原因 |
| `ATOMIC` | 任一行失败时整批不创建订单 |
导入时服务端重新加载仓库、渠道、地址和客户归属,不信任模板隐藏页。成功结果只创建 `DRAFT`,客户仍需检查并提交。
## 7. F05 订单提交和入仓码
### 7.1 提交前检查
客户端进行表单校验后,服务端再次校验:
1. 当前订单属于登录客户且版本一致;
2. 状态允许提交;
3. 当前成员有提交权限;
4. 企业资料已审核通过;
5. Finance 账户响应有效且实际余额不小于 0;
6. 国内收货仓、目的仓和渠道仍启用并类型匹配;
7. 地址属于本客户且类型正确;
8. 货物字段、FBA 条件、木制品商检和一件代发 SKU 完整。
### 7.2 提交事务结果
成功后:
- Order 状态 `DRAFT → SUBMITTED`;
- 统一主状态展示为 `PENDING_REVIEW`;
- 生成并固定全局唯一入仓码;
- 写提交历史、操作者和服务端时间;
- 发布后续协作所需的可靠消息/内部事实;
- 同一幂等请求重放返回原结果,不产生第二个入仓码。
入仓码是订单、国内入库、箱码、装柜和海外尾程之间的稳定业务关联码。页面不得用内部订单 ID 替代。
### 7.3 F06 草稿编辑与取消
- 草稿允许有权限的企业操作员继续修改并保存;
- 已提交订单不得再通过草稿入口覆盖审核中的权威版本;
- 只有服务端当前状态允许时才能取消,页面按钮不是最终授权;
- 取消携带当前版本和幂等键,并记录操作人、时间和原因;
- 已进入不可逆履约的订单不能取消,需进入后续阶段异常流程;
- 请求超时后先查询当前状态,不换新幂等键盲目重试。
## 8. F07 平台审核和申报修订
入口:Admin → 统一订单 → 待审核。
### 8.1 单票审核
1. 按订单号、入仓码、客户、仓库、渠道或状态定位订单;
2. 核对客户、交货方式、预约时间、国内收货仓、目的类型、目的仓、货物和申报;
3. 查看平台可见内部信息和服务端返回的下一动作;
4. 必要时修改允许的客户申报字段;
5. 点击审核通过。
### 8.2 批量审核
1. 选择同一操作范围内的待审核订单;
2. 一次调用批量审核预览,不逐票循环拉详情;
3. 预览按请求顺序返回中文货物摘要、渠道、目的仓、入仓码、`canApprove` 和 `blockReason`;
4. 操作员只提交可审核项;
5. 服务端再次校验状态和版本后逐票处理。
### 8.3 平台申报修订边界
平台可在 `DRAFT/REJECTED/SUBMITTED/APPROVED` 范围内按版本修改客户原始申报,但:
- 不得修改客户归属、国内收货仓、订单号、入仓码和状态;
- 不得增删或重排货物行,使用稳定 `itemNo` 定位;
- 不得覆盖设备/仓库实测、测量审核和计费事实;
- 国内收货仓或中转仓要变化时必须重新下单;
- 只有渠道变化时才检查 Firstleg 履约可逆性和重新计价门禁;
- 内部校验不可用时失败关闭,不能只改 Order 留下跨服务不一致;
- 成功后通过 `ORDER_DECLARATION_UPDATED_V1` 向 Firstleg 同步完整申报快照和字段变化。
### 8.4 审核通过结果
- Order 状态 `SUBMITTED → APPROVED`;
- Firstleg 幂等创建正式国内入库单;
- 正式入库单沿用提交时生成的入仓码;
- 生成/补齐后续测量和 PDA 使用的稳定箱码映射;
- 统一主状态进入 `WAIT_MEASURE`;
- 审核动作和建单结果写入时间线。
审核通过不代表货物到仓,也不代表测量、计费或入库完成。
## 9. 客户订单列表和详情
### 9.1 列表筛选
当前客户可按订单号、国内收货仓、渠道、入仓码/SKU、创建时间、当前状态、目的仓类型和快递单号查询本企业订单。
### 9.2 列表核心展示
列表包含订单号、入仓码、状态、渠道、运输方式、交货方式、预约提货时间、国内收货仓、目的仓、目的类型、箱数、SKU、重量、体积、费用摘要、货件编号、跟踪编号、柜次和船期摘要等。
数据可能来自 Order 申报和 Firstleg 履约聚合;Order 为 `SUBMITTED` 时必须优先展示待审核,不能因 Firstleg 预投影显示成待测量。
### 9.3 详情和可用操作
详情展示:
- 订单主信息和客户/地址快照;
- 货物明细和图片;
- 入仓码业务关系;
- 服务端时间线;
- 当前履约摘要;
- 当前允许的编辑、提交、费用确认、报关资料等动作。
平台内部备注、成本、其他客户数据和内部事件字段不能进入客户响应。
## 10. 状态机和动作
### 10.1 Order 交易状态
```text
DRAFT --提交--> SUBMITTED --平台审核通过--> APPROVED
└--取消--> CANCELLED
APPROVED --后续全部履约可信回写--> COMPLETED
```
当前产品不以“审核驳回”作为正常业务路径;历史 `REJECTED` 数据在客户侧仍按待补充/待审核兼容展示,不能据此新增一套驳回流程。
### 10.2 统一订单主状态交接
| Order/Firstleg 事实 | 统一显示 | 下一责任人 |
|---|---|---|
| Order `DRAFT` | 草稿 | 客户 |
| Order `SUBMITTED` | `PENDING_REVIEW` | 平台订单运营 |
| Order `APPROVED` + 正式入库单 | `WAIT_MEASURE` | 国内仓/测量人员 |
交易状态和履约主状态是两个维度。平台审核后不应把 Order 交易状态继续当成仓库作业状态。
## 11. 数据流转和权威归属
```text
Auth/IAM
├─ 当前客户、成员、角色、企业审核资格
↓
Client 下单
├─ Warehouse:实时校验国内仓、目的仓和仓库快照
├─ Firstleg:读取有效渠道/价格目录
├─ Finance:提交时校验资金账户
↓
Order 本地事务
├─ 订单主表、Party快照、货物明细
├─ 状态、版本、入仓码、时间线、幂等结果
└─ Outbox/内部调用事实
↓ 审核通过
Firstleg
├─ 正式国内入库单
├─ 稳定箱码/箱唛来源
└─ 下一阶段 WAIT_MEASURE
```
### 11.1 Order 权威数据
- 客户归属、订单号、入仓码;
- 客户原始申报和货物明细;
- 下单时 Party/地址和仓库必要快照;
- 订单交易状态、版本、幂等和时间线。
### 11.2 Order 不拥有的数据
- 实际尺寸、重量和测量审核;
- 国内仓位、托盘和装柜事实;
- 柜次、船节点、海外库存和出库;
- Finance 钱包和结算主账。
### 11.3 关键编号
| 编号 | 生成时点 | 是否可改 | 用途 |
|---|---|---|---|
| `orderNo` | 创建/提交规则生成 | 否 | 客户订单定位 |
| `inboundCode` | 首次成功提交 | 否 | 国内入库至海外尾程稳定关联 |
| 客户参考号 | 客户填写 | 按状态 | 客户内部检索,不替代平台编号 |
| 货物 `itemNo` | 订单明细创建 | 不重排 | 申报更新和箱码来源定位 |
## 12. 正常流、分支和异常恢复
| 场景 | 系统行为 | 操作员处理 |
|---|---|---|
| 企业资料未审核 | 可保存草稿,提交拒绝 | 补资料并等待平台审核 |
| 资金余额小于 0 | 提交拒绝 | 充值或联系财务处理 |
| Finance/IAM/Warehouse 不可用 | 提交失败关闭 | 保留草稿,服务恢复后原单重试 |
| 仓库/渠道在草稿后停用 | 提交时拒绝 | 重新选择有效项 |
| 私人地址归属不符 | 拒绝且不泄露其他客户数据 | 选择本企业地址或新建 |
| 木制品未选商检 | 表单/服务端拒绝 | 补充商检选项 |
| FBA 缺货件号/跟踪号 | 提交拒绝 | 补齐对应货物行 |
| 一件代发缺 SKU | 保存/提交按当前门禁拒绝 | 为每个物理箱内货物补 SKU |
| 版本冲突 | 当前写入失败且不覆盖新版本 | 刷新订单后重新编辑 |
| 请求超时 | 不能换新幂等键盲重试 | 先查询订单/幂等结果,再用原操作处理 |
| 批量导入部分失败 | `PARTIAL` 只建成功行;`ATOMIC` 整批不建 | 按行号和字段修正后重新导入 |
| 审核时 Firstleg 建单失败 | 不能宣称阶段完成 | 查看服务端结果,受控重试或修复依赖 |
| 渠道变更不允许 | Order 和 Firstleg 都不写 | 根据阻断原因新建订单或处理下游占用 |
## 13. 阶段完成判定
每张进入阶段二的订单必须同时满足:
- [ ] Order 属于正确客户且状态为 `APPROVED`
- [ ] 客户可见订单号存在
- [ ] 全局唯一入仓码存在且未变化
- [ ] 国内收货仓、渠道、目的类型和目的地快照完整
- [ ] 货物明细行集合、箱数、SKU/申报字段符合订单类型
- [ ] Firstleg 正式国内入库单已创建并沿用同一入仓码
- [ ] 一件代发稳定箱码与 SKU 来源可用
- [ ] 统一主状态为 `WAIT_MEASURE`
- [ ] 审核和建单时间线可查
- [ ] 重放提交/审核不会生成重复入仓码或重复入库单
任何一项缺失都不能把订单交给国内仓作为正式测量任务。
## 14. 本阶段评审问题
这些问题不阻断现状记录,但需要业务评审确认后才能进入优化:
1. 平台上门提货当前在订单中冻结地址和预约时间,但是否存在独立派车、接单、到仓回执流程?若没有,阶段二只能从“货物实际到仓”开始,不能假设提货已被系统履约。
2. 客户是否仍需要平台代创建订单;若保留,代创建时客户授权、数据来源和通知方式需单列。
3. 当前产品不设订单审核驳回,但代码兼容 `REJECTED` 历史状态;业务是否确认继续采用“平台修改或联系客户修改、保持待审核”。
4. 旧系统入仓码模式是否仍会在任何环境启用;若不会,应从正式流程和页面移除。
5. 下单页的费用预估对客户应如何命名,避免被理解成最终账单。
6. 一件代发混箱 SKU 的实际填报责任人和现场纠错责任是否已明确。
## 15. 阶段二交接包
交给阶段二“国内到仓、测量、计费与组托”的输入应只有以下权威数据:
- 客户和订单业务身份;
- 订单号、入仓码、货物 `itemNo`;
- 交货方式和预约提货事实;
- 国内收货仓快照;
- 渠道与目的仓/私人地址快照;
- 客户申报箱数、SKU、尺寸、重量、体积和报关资料;
- 一件代发箱内 SKU 关系;
- 审核通过时间、版本和幂等历史。
阶段二新增实测和计费事实,不反向覆盖本阶段客户原始申报。
## 16. 事实来源
- `docs/订单与客户/README.md`
- `docs/订单与客户/订单与客户头程订单闭环设计.md`
- `docs/统一订单主状态与操作契约.md`
- `docs/业务快速索引.md`
- `apps/client-web/AGENTS.md`
- `apps/client-web/src/modules/first-leg/views/FirstLegOrdersView.vue`
- `apps/client-web/src/modules/first-leg/api/firstLeg.ts`
- `apps/admin-web/AGENTS.md`
- `apps/admin-web/src/modules/unified-orders/pages/UnifiedOrdersView.vue`
- `baiyue-firstleg/order/AGENTS.md`
- `baiyue-firstleg/order/src/main/resources/openapi/order-v1.yaml`