Files
medical-mall/pages/mall/delivery/doc/需求文档/配送模块需求文档.md
2026-02-09 16:53:20 +08:00

318 lines
23 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.
# 配送模块需求文档(模拟三通一达后台 / Mock 承运方 Server
本文定位:定义 Mock 承运方 Server 的目标、范围、流程、故障注入与验收标准;接口与字段细节以 `接口规范.md``前端字段清单.md` 为准。
口径说明:本目录文档作为联调、验收与实现的唯一口径;如与口头沟通或临时讨论结论不一致,以本文档及其关联文档(接口/字段/映射)为准,并通过文档更新同步。
关联文档:
- `README.md`:阅读入口与联调路径
- `接口规范.md`Webhook 推送规范 + Mock 控制面 API
- `状态映射表.md`event_code/event_text -> 平台 status_code
- `前端字段清单.md`:安卓/Web 时间线字段契约
## 1. 背景
当前配送链路依赖第三方承运方(常见为“三通一达”等快递公司或聚合平台)。在真实承运方接口尚未签约/联调完成前,需要一个**可控的模拟承运方后台服务Mock Server**用于开发与测试平台侧的Webhook 接收、验签、幂等入库、时间线展示、异常处理与监控告警。
系统定位与边界:
- 本模块属于平台系统的一部分,最终呈现在“订单详情页”的物流区块,并同时服务客服/履约/对接排障。
- 平台端需要查看订单的履约详情(至少包括:`order_no``tracking_no``carrier`、物流时间线 `status_history`、异常与处理记录)。
- 但本需求不覆盖商品明细、支付、营销等订单业务域的展示与流程;这里聚焦“物流轨迹对接、入库与展示”。
多端归属与页面边界(统一口径):
- 本需求产出的“物流能力”不是一个独立的骑手/配送员端 App而是作为同一套物流模块能力分别嵌入到三个端按权限展示不同颗粒度
1) 消费者端C 端):订单详情的物流时间线/物流详情(只读为主,展示 `status_code` + 轨迹文案;可在“派送中”等末端环节提供“联系配送”能力,但涉及手机号等敏感信息需脱敏/虚拟号策略,且仅对收件人可见;不展示 `raw_payload`)。
2) 商家端B 端):发货与运单绑定(选择承运方、录入/回填 `tracking_no`+ 查看物流概览(以“到达某地/中转/派送/签收/异常”等大致进度为主;不展示配送员手机号等个人敏感信息;不包含对接配置与敏感调试信息)。
3) 管理端(平台后台:客服/履约/对接运维):订单/运单查询、Webhook 接收日志、接入配置、(可选)监控告警与审计能力。
- 三端展示字段口径以统一事件模型与前端字段契约为准(见 `接口规范.md``前端字段清单.md`),避免出现“不同端展示不一致/状态口径不一致”。
- 若未来要做“自营配送/同城骑手端”(接单、导航、到店取货、送达签收等),需单独立项与另写需求文档,不在本需求范围内。
敏感信息展示差异(必须遵循):
- 轨迹事件以同一份“事实数据源”入库与治理(`event_code/event_text/status_code` 等同源),但不同端的展示需按角色过滤与脱敏。
- 配送员/快递员手机号:
- 商家端:不展示。
- 消费者端:仅在末端环节(如 `OUT_FOR_DELIVERY`)按需提供,并必须脱敏(如 138****8000或采用虚拟号/中转号方案;避免把第三方 `event_text` 原文中的手机号明文直接透传到推送消息或页面。
## 2. 目标
- 适用阶段:主要用于真实第三方承运方未签约/未联调/不可控时的替代数据源;即便后续已接入真实承运方,也保留用于回归测试、故障注入与排障复现(生产环境默认关闭)。
- 提供一个可配置的 Mock 承运方服务,模拟多承运方(圆通/韵达/中通/申通)轨迹事件与签收凭证。
- 支持将轨迹事件按既定规范推送到平台 Webhook模拟承运方 -> 平台)。
- 支持主动查询轨迹(平台轮询场景)与“预置场景脚本”快速生成整条物流生命周期。
- 支持故障注入:延迟、重复推送、乱序、签名错误、时间戳偏移、缺字段等,用于验证平台鲁棒性。
## 2.1 配送合作模式(不同解决方案)
说明:以下方案是“商城履约/配送合作关系”的产品与工程取舍;无论选哪一种,只要前端要展示稳定一致的物流时间线,平台都建议建设统一的轨迹模型与查询接口(见 `接口规范.md` 与数据库 Schema。本 Mock 体系用于在第三方未就绪或不可控时,替代外部系统快速联调与做故障注入回归。
### 方案 A平台统一配送平台与第三方合作 / 统采统接)
适用:希望提供强一致的履约体验、统一客服口径、统一监控与统计;平台愿意承担对接与运维成本。
平台职责:
- 统一签约/选择承运方或聚合平台;提供平台侧发货能力(下单、订阅/回调、轨迹查询与回单能力按合同)。
- 平台统一事件模型入库(幂等去重、乱序处理、状态不回退),对客户端输出统一 `status_history`
商家职责:
- 在平台内选择配送方案并发货;不需要自行对接承运方轨迹接口(或仅提供必要发货信息)。
优点:体验一致,平台可观测性强;扩展新承运方主要改 Adapter不影响前端契约。
风险/成本:平台对接与运维成本高;履约兜底责任更集中在平台侧。
与 Mock 的关系:
- Mock 用于第三方未联通阶段的替代数据源与故障注入;生产环境默认关闭。
### 方案 B商家自选配送商家自选承运商并发货 / 平台负责运单绑定与轨迹展示)
适用:平台招商、品类/区域差异大、平台希望给商家“选择承运方”的灵活性;平台不承担“实际配送执行”,但需要提供统一的运单绑定入口与轨迹展示底座。
重要说明(商家只是平台商户的常见情况):
- 默认不要求商家自建系统或自行对接第三方 API。
- “商家自选”指商家在平台提供的承运方/聚合平台范围内进行选择,第三方对接、验签、幂等、入库与前端展示由平台统一承担。
平台职责(建议至少做到“统一展示底座”):
- 提供统一轨迹查询接口给前端;平台内部仍建议使用统一事件模型入库。
- 平台负责与第三方承运方/聚合平台对接:订阅/回调Webhook或轨迹查询轮询补偿、验签、防重放、幂等去重、乱序处理与统一入库。
- 平台提供“发货与运单绑定”的入口(承运方选择、运单号录入/回填/打单),把差异收敛在平台 Adapter/映射规则,避免前端直接适配多家第三方。
商家职责:
- 商家在平台的订单列表/订单详情页点击“发货/绑定运单”,选择承运方并录入/回填 `tracking_no``order_no` 由平台订单上下文自动带入,不要求商家手工输入订单号。
- `ORDER_PLACED`(已下单)阶段允许 `tracking_no` 为空(前端展示“暂无运单号”);完成发货绑定后进入 `SHIPPED`,此时必须具备 `carrier + tracking_no`
- 若商家坚持使用“商家与第三方的独立合同/账号”,可向平台提交第三方对接所需材料,由平台统一配置与代接入(不要求商家自建回调服务)。
可选增强:商家在平台内“自助对接第三方”(无需商家开发)
- 定位:可选增强能力,非一期必做。
- 目标:让商家在平台后台完成第三方账号授权/配置,从而在平台内完成下单打单、获取运单号、查询/订阅轨迹;平台仍统一入库与展示。
- 常见两种形态(可二选一,也可并存):
1) 聚合平台授权开通(推荐优先):平台统一对接一家聚合服务商;商家在平台内完成开通/授权后即可使用多家快递能力。
2) 商家自带第三方账号BYO Account商家已与某快递/聚合平台签约;在平台后台录入密钥或走 OAuth 授权,平台代为调用第三方 API。
- 商家后台最小页面/流程建议:
- 【物流渠道管理】:选择渠道类型(聚合/直连)、开启/停用
- 【授权与密钥】:录入/更新 `appKey/appSecret/token` 或 OAuth 绑定;展示“最后一次连通性检测”结果
- 【回调配置提示】:展示平台 Webhook 地址与白名单要求(若第三方需要配置回调)
- 【测试与排障】:一键“连通性测试/拉取一条轨迹/模拟下单”,失败给出可读错误
- 安全要求(必须):
- 第三方密钥加密存储、最小权限、变更审计;仅商家管理员可配置。
- 不在前端暴露密钥;平台服务端代调用第三方接口。
- 轨迹/运单数据仍写入平台统一表结构与事件模型,避免不同渠道把差异带到前端。
是否需要做(决策建议):
- 暂不需要(建议先不做)的场景:一期目标仅是“商家回填运单号 + 平台展示第三方轨迹关键节点”,且商家规模不大/对接资源有限。
- 建议需要(做了收益明显)的场景:商家量大且运单号回填错误率高、客服投诉“查不到物流/不更新”多;或明确要上“电子面单/平台一键下单”。
- 推荐分期:
- Phase 1回填运单号 + 轨迹接入与统一展示底座(本项目当前优先级)。
- Phase 2先接入 1 家聚合平台做统一下单/面单/轨迹(降低多家直连成本)。
- Phase 3再开放 BYO Account商家自带账号自助配置安全与运维成本最高
优点:相对方案 A 平台责任更轻、商家更灵活。
风险/成本:体验碎片化风险大;如果不强制回传规范,平台客服/前端会被迫处理多样差异,长期维护成本更高。
#### 商家自选配送需要提供的内容(接入清单)
基础信息(发货侧最小闭环):
- `carrier`:承运方标识(可为直连承运方或聚合平台,如 YUNDA/YTO/ZTO/STO/KDN 等)。
- `tracking_no`:运单号生成与回传方式(商家生成/第三方返回/平台生成)。
- 订单关联信息:`order_no`(或平台侧可解析的业务单号),用于把轨迹绑定到订单详情页;通常由平台在“订单发货/绑定运单”操作中自动带入,不要求商家手工录入。
运单号(`tracking_no`)获取方式(两种常见落地,二选一或并存):
1) 回填运单号(最小模式,推荐先上线):
- 商家在线下/快递官方系统/聚合平台完成下单与交接,获得运单号。
- 商家在平台后台“发货/绑定运单”时选择承运商并回填 `tracking_no`(订单号无需手填,平台自动关联当前订单)。
- 平台不需要调用第三方“下单/面单”接口只需后续接入轨迹Webhook/轮询)用于展示。
2) 电子面单 / 在线下单(增强模式,体验更好):
- 平台(或平台集成的服务商)需要对接第三方提供的“下单/面单”接口,向第三方提交发货所需信息(收件人/地址/重量/件数等),并获得:运单号 `tracking_no` + 面单文件/面单号等。
- 第三方可以是:
- 直连快递公司接口(每家快递一套协议);或
- 快递聚合平台接口(一套协议覆盖多家快递)。
- 兜底策略建议:若第三方下单失败/超时,允许商家改为“手工回填运单号”完成发货闭环。
轨迹数据接入方式(平台统一接入,推荐第一种):
1) 第三方 -> 平台 Webhook 推送(推荐):
- 平台与第三方完成订阅/回调配置;第三方直接回调平台 Webhook。
- 平台统一完成:验签、防重放、字段映射、状态映射、幂等去重、乱序入库。
2) 平台 -> 第三方 轮询拉取(可选补偿):
- 平台按承运方策略轮询“长时间无更新”的运单,补齐轨迹。
- 适用于第三方不稳定、回调丢失或仅提供查询能力的场景,但平台运维成本更高。
(高级模式,可选,适用于有自建系统的大商家)
- 商家系统 -> 平台:商家按平台统一事件模型回传轨迹事件;平台仍执行幂等/乱序入库与审计。
对接材料(按商家选择的接入方式提供):
- 若商家仅在“平台已接入承运方范围内自选”,通常无需商家提供第三方接口材料。
- 若商家使用“独立合同/账号”并要求平台代接入,则需要商家提供或协助申请:
- 鉴权信息:`appKey/appSecret``token`、证书、公网 IP 白名单等(因第三方而异)。
- 回调能力:是否支持订阅 + Webhook以及重试策略、签名算法、回调白名单
- 能力说明:是否提供 `event_id`、是否提供 POD/签收凭证、是否需要手机号后四位参与查询等。
映射配置(用于消除差异化,平台侧必须落库为配置或代码映射):
- 事件码/文案 -> 平台 `status_code` 的映射(至少覆盖:揽收/在途/派送中/签收/异常/退回)。
- 幂等去重策略:优先 `event_id`;缺失时使用组合键(见 `接口规范.md` 的入库层建议)。
#### 平台统一配送状态(`status_code`,必须遵循)
说明:平台内部与对外输出统一使用同一套 `status_code`三端C/B/管理端)按需展示,不得随意改写状态口径。
状态枚举(当前统一口径):
- `ORDER_PLACED`:已下单(平台侧订单已创建;通常不是第三方快递事件;此阶段允许 `tracking_no` 为空)
- `SHIPPED`:已发货(已绑定运单/待揽收)
- `IN_TRANSIT`:运输中(所有中转/分拨/到达节点统一归类为运输中)
- `OUT_FOR_DELIVERY`:派送中
- `READY_FOR_PICKUP`:待取件(驿站/自提柜等)
- `DELIVERED`:已签收
- `EXCEPTION`:异常
- `RETURNED`:退回/退件
展示规范:
- 为保证用户体验,应真实展示第三方回传的物流轨迹文案(如“到达北京分拨中心”、“离开上海网点”等),不做脱敏处理。
- 前端时间线展示 `event_text` 原文,状态标签对应 `status_code`
说明:本项目不维护“发货前”的配送状态;在未绑定运单阶段属于订单域状态,不纳入物流轨迹状态枚举。
补充约束(与页面展示相关):
-`tracking_no` 为空时,前端仅展示订单的配送状态为 `ORDER_PLACED` 与“暂无运单号”,不展示可查询的第三方物流时间线;待商家完成“发货/绑定运单”后,再展示轨迹时间线。
#### 差异化来源与平台收敛策略
差异化来源(商家自选必然存在):
- 鉴权差异Token/HMAC/证书/IP 白名单等。
- 字段差异:时间格式、地点粒度、是否有 `event_id`、异常字段命名等。
- 状态差异:同一状态不同叫法/码值,甚至“派送/签收/退回”的边界不同。
- 交互差异:仅查询(轮询)/订阅回调Webhook/两者并存;重试与乱序程度不同。
平台收敛策略(避免差异扩散到前端与数据库):
- 前端只消费平台统一查询接口与统一字段(见 `前端字段清单.md`),不得直接依赖第三方字段。
- 平台统一入库模型与幂等/乱序规则(见 `接口规范.md`),第三方差异仅在 Adapter/配置映射层处理。
- 分级能力与降级:
- 达标(可回传轨迹或可稳定拉取 + 通过验收)-> 展示完整时间线 + 可做告警统计。
- 不达标(仅能提供运单号或字段缺失严重)-> 降级为“仅展示运单号/跳转外部查询”,不承诺完整时间线。
验收建议(商家自配准入):
- 必测:重复推送、乱序、延迟、验签失败、缺字段(对应本 Mock 的故障注入项)。
- 通过后才允许全量展示/告警统计;未通过仅允许降级展示。
与 Mock 的关系:
- Mock 可作为“平台对接与回归”的验收工具:在第三方未就绪或不可控时,先用 Mock 场景验证幂等/乱序/缺字段容错等;接入真实第三方后也可用于故障注入回归。
### 方案 C混合模式平台默认合作 + 允许商家自配)【推荐】
适用:既要平台可控的默认体验,又要给大商家/特殊品类保留弹性。
规则建议:
- 默认:商家走平台合作承运方(覆盖大多数订单,保证体验一致)。
- 例外:允许商家自配,但必须满足平台回传规范(至少事件时间/文案/状态映射可得);否则只提供降级展示能力。
- 前端:永远只消费平台统一查询接口,不直接依赖第三方字段。
落地建议(最小闭环):
- 平台统一事件表与查询 API 先上线Mock 先跑通联调与回归。
- Phase 1接 1 家聚合或 1 家主力承运方(平台统一配送)。
- Phase 2开放商家自配按准入与验收清单接入
## 3. 范围
### 3.1 包含
- Mock Server 对外提供控制面 API创建/查询运单、追加事件、运行场景、触发推送、配置回调目标。
- Mock Server 向平台推送 Webhook按统一事件模型、支持 HMAC 验签头。
- 事件与场景数据本地持久化(最小可用可内存;建议支持文件落盘,便于复现)。
### 3.2 不包含
- 真实承运方业务能力(计费、真实网点、真实 POD 获取)
- 配送员实时定位与地图
- 平台侧业务实现(本需求仅定义 Mock Server 的接口与行为)
## 4. 目标用户
- 平台后端开发:联调 Webhook、验签、幂等与入库。
- 平台前端开发:使用固定运单/事件数据验证时间线展示。
- QA 测试:用故障注入覆盖异常链路与回归。
- 运维/对接:用于排查“回调未到/重复到/乱序到”等问题。
## 4.1 使用端(主要投放端)
- 安卓端App订单详情页展示物流时间线、签收凭证预览、异常上报。
- Web 端H5/PC 管理后台或用户 Web同样展示物流时间线提供更完整的原始事件/审计信息(按权限)。
## 4.2 平台后台展示建议(客服/履约/对接运维最小集)
说明:本节定义“平台侧管理后台”在物流模块上建议具备的最小展示与排障能力(不等同于完整订单后台)。
1) 订单详情页(物流区块)
- 基础信息:`order_no``carrier``tracking_no`、当前 `status_code``last_synced_at`
- 物流时间线:`status_history`(按 `event_time` 排序,展示 `event_text`,标签使用 `status_code`
- 异常提示:长时间无更新、签收失败、退回等(按 `status_code` 与规则触发)
2) 运单/轨迹查询页(排障入口)
- 支持按 `tracking_no/order_no/carrier/status_code` 查询
- 展示最近 N 条事件与来源mock/承运方/聚合),便于快速定位
3) 对接日志与审计(运维/对接用)
- Webhook 接收日志:验签结果、去重命中、入库结果/错误原因(按权限)
- 原始回文:`raw_payload` 折叠展示(仅客服/运维可见,记录访问审计)
4) 配置中心(对接运维用)
- 承运方/聚合平台配置、Webhook 目标与密钥/证书、轮询补偿开关与频率
- 测试环境 Mock 开关(默认关闭,需显式开启)
(可选增强)一致性回查/纠偏入口:按需触发第三方回查,补采缺失事件并保留审计记录。
## 4.3 商家后台展示建议(商户侧最小集)
说明:商家只是平台商户时,建议仅提供“发货与运单绑定 + 物流查看”的最小能力。
- 发货:选择承运方、录入/回填 `tracking_no`、发货确认
- 订单详情(物流区块):查看时间线与当前状态(不展示 `raw_payload`
端侧差异化要求:
- 安卓端需支持弱网/后台切换恢复后的快速刷新;证据图片需支持点击预览/下载。
- Web 端需支持表格/筛选/搜索便于客服排障对调试信息raw_payload默认折叠。
## 5. 核心概念
- 承运方carrierYUNDA / YTO / ZTO / STO可扩展
- 运单tracking_no可由 Mock Server 生成或由调用方指定
- 事件event包含 event_id、event_time、event_code、event_text、node_name、location、evidence_urls 等
- 场景scenario一组按时间顺序生成的事件脚本如“标准签收”“拒收退回”“地址异常”
## 6. 关键流程
1) 配置推送目标:设置平台 Webhook URL、`client_id``secret`
2) 创建运单:选择 carrier生成/指定 tracking_no。
3) 运行场景Mock Server 生成一系列关键节点事件并入库。
4) 触发推送Mock Server 按顺序(或按乱序/延迟策略)将事件推送到平台。
5) 平台侧验证:校验验签、去重、入库、前端展示与告警。
## 7. 功能需求
### 7.1 控制面 APIMock Server
- 配置:设置 webhook 目标、密钥、默认承运方。
- 运单:创建/查询/列表。
- 事件:追加/查询/清空;支持批量追加。
- 场景:运行预置脚本(标准流程/异常流程)。
- 推送:立即推送指定运单的全部/增量事件;支持模拟重试与重复。
### 7.2 Webhook 推送Mock -> 平台)
- 请求头包含 `X-Client-Id``X-Timestamp``X-Signature`
- body 结构遵循统一事件模型(见 `接口规范.md`)。
- 幂等:对同一事件可重复推送,平台需以 `event_id` 去重。
### 7.3 故障注入(必须)
- `delay_ms`:推送延迟
- `duplicate`:重复推送次数
- `out_of_order`:乱序推送
- `bad_signature`:签名错误
- `timestamp_skew_seconds`:时间戳偏移
- `drop_fields`:缺字段(用于校验平台必填校验与容错)
## 8. 非功能需求
- 易用性:一条命令启动;提供最少的配置即可发送事件。
- 可复现:场景运行应可导出/导入(或提供固定随机种子)。
- 可观测:每次推送记录 request/response 摘要与 request_id。
- 安全:仅用于内网/测试环境;支持简单 Token 或 IP 白名单(可选)。
端侧体验要求(安卓/Web
- 刷新策略:页面进入时拉取一次平台侧轨迹;用户可手动“刷新物流”;显示 `last_synced_at`
- 离线降级:无网络时展示上次缓存的时间线并提示“网络不可用”。
- 权限与隐私:手机号脱敏;配送员/快递员手机号仅对收件人可见且需脱敏/虚拟号策略(商家端不展示);`raw_payload` 仅客服/运维可见并记录审计;不展示配送员精确地址/定位。
## 9. 验收标准
- 能创建运单并运行“标准签收”场景,向平台推送至少 6 个关键节点(揽收/到达中转/在途/到达目的地/派送中/签收)。
- 能注入重复与乱序事件,平台侧仍能正确去重并按时间线展示。
- 能注入验签失败事件,平台侧能拒绝并记录告警。
## 10. 文档与交付物
- `接口规范.md`Mock Server 控制面 API + Webhook 推送规范
- `状态映射表.md`:事件码/原文到平台统一状态映射建议
- `前端字段清单.md`:前端展示字段契约(供时间线组件使用)
- 数据库 Schema`mall_sql/schemas/express_tracking_mock_platform.sql`(平台统一轨迹入库 + Mock 承运方持久化表)
## 11. 待补充项(备忘与下一步)
为保证联调、验收与后续接真实承运方不走弯路,建议按优先级补齐:
- `缺口与待补充清单.md`