docs/5363-fleet-transport-contract #66
@ -0,0 +1,159 @@
|
||||
---
|
||||
schema: "hl-changelog/v2"
|
||||
ticket: "5363"
|
||||
title: "车务派车详情大交通契约补全"
|
||||
consumer: "admin"
|
||||
change_type: "修改接口"
|
||||
backend_status: "pending"
|
||||
gateway_status: "pending"
|
||||
frontend_status: "pending"
|
||||
frontend_owner: ""
|
||||
frontend_ref: ""
|
||||
target_release: ""
|
||||
verified_at: ""
|
||||
status_note: "后端 PR #5365 已合并至 dev-v3(merge e8e654a482),但尚未部署或执行网关验证;前端跟踪 #5366 仍为 0/20,本文件继续保持 pending。"
|
||||
updated_at: "2026-07-31"
|
||||
base: "dev-v3"
|
||||
---
|
||||
|
||||
# 车务:派车详情大交通契约补全 (#5363)
|
||||
|
||||
> **服务**:`hl-order-service-v3`、`hl-fleet-service`
|
||||
>
|
||||
> **PR**:[#5365](https://git.1814.love:8443/wx/HL/pulls/5365)(已合并,merge `e8e654a482`)
|
||||
>
|
||||
> **Backend Issue**:[#5363](https://git.1814.love:8443/wx/HL/issues/5363)
|
||||
>
|
||||
> **Frontend tracking**:[#5366](https://git.1814.love:8443/wx/HL/issues/5366)(OPEN,0/20;本草稿不代表前端验收完成)
|
||||
>
|
||||
> **日期**:2026-07-30
|
||||
>
|
||||
> **影响范围**:管理后台车务派车详情的大交通整团段与分批批次
|
||||
|
||||
## 变更接口
|
||||
|
||||
| 接口 | 方法 | 路径 | 变更类型 |
|
||||
|---|---|---|---|
|
||||
| 查询车务派车订单详情 | `GET` | `/admin/fleet/board/orders/:orderId` | 响应字段 additive 新增 |
|
||||
|
||||
接口路径、HTTP 方法、请求参数、错误码和既有响应字段均不变。
|
||||
|
||||
## 二、新增响应字段
|
||||
|
||||
以下字段同时新增到:
|
||||
|
||||
- `data.transport.arrive`
|
||||
- `data.transport.depart`
|
||||
- `data.transport.batches[]`
|
||||
|
||||
| 字段 | JSON 类型 | 可空 | 来源约束 | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `transportType` | `String` | 是 | order-v3 大交通计划开放字符串原值 | 当前已知 `FLIGHT`、`TRAIN`、`SELF_DRIVE`、`BUS`、`OTHER`;未来未知非空值也原样透传;只有精确 `SELF_DRIVE` 表示自驾 |
|
||||
| `departStation` | `String` | 是 | order-v3 `departStation` 原值,源字段上限 100 字符 | 同一大交通计划的真实出发站;源未提供时为 `null` |
|
||||
| `arriveStation` | `String` | 是 | order-v3 `arriveStation` 原值,源字段上限 100 字符 | 同一大交通计划的真实到达站;源未提供时为 `null` |
|
||||
|
||||
响应中的 `time` 仍为现有 date-time 字符串或 `null`,本次不改变时间口径。
|
||||
|
||||
## 三、兼容与部分路线语义
|
||||
|
||||
既有 `station` 保留且只作为方向相关的 legacy compatibility 字段:
|
||||
|
||||
- `direction=ARRIVAL`:`station = arriveStation`,它只代表已知到达端;
|
||||
- `direction=DEPARTURE`:`station = departStation`,它只代表已知出发端。
|
||||
|
||||
路线展示只认两个新增端点:
|
||||
|
||||
- 两端都有值:显示 `departStation → arriveStation`;
|
||||
- 只有到达端:显示 `未知 → arriveStation`;
|
||||
- 只有出发端:显示 `departStation → 未知`;
|
||||
- 两端都没有而只有 legacy `station`:仅显示独立字段 `旧数据站点(路线不完整):station`,禁止箭头和完整路线语义。
|
||||
|
||||
禁止把 `station` 放入或复制到任一真实端点。新 `departStation` 或 `arriveStation` 为空时保持缺失,不得根据 `station`、方向、班次号、时间、备注或接送地点推断或补造。
|
||||
|
||||
## 四、交通方式语义
|
||||
|
||||
`transportType` 是 nullable/open `String`,不是 closed enum。当前可观测值与稳定文案为:
|
||||
|
||||
- `FLIGHT`:飞机;
|
||||
- `TRAIN`:火车;
|
||||
- `SELF_DRIVE`:自驾;
|
||||
- `BUS`:大巴;
|
||||
- `OTHER`:其他。
|
||||
|
||||
只有精确 `transportType === "SELF_DRIVE"` 表示自驾。`null` 显示“未提供”;未来未知非空值显示“未知交通方式”并 fail-closed,不得丢弃原值、归并为已知类型,也不得从 `transportNo`、`time`、站点或备注推断交通类型。
|
||||
|
||||
## 五、响应示例
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"transport": {
|
||||
"arrive": {
|
||||
"planId": "9007199254740993",
|
||||
"direction": "ARRIVAL",
|
||||
"travelerIds": ["9007199254740995"],
|
||||
"transportType": "FLIGHT",
|
||||
"transportNo": "CA1234",
|
||||
"time": "2026-07-29T10:30:00",
|
||||
"station": "海拉尔东山国际机场",
|
||||
"departStation": "北京首都机场",
|
||||
"arriveStation": "海拉尔东山国际机场"
|
||||
},
|
||||
"depart": null,
|
||||
"batches": [
|
||||
{
|
||||
"planId": "9007199254740997",
|
||||
"direction": "DEPARTURE",
|
||||
"travelerIds": ["9007199254740999"],
|
||||
"transportType": "TRAIN",
|
||||
"transportNo": "G5678",
|
||||
"time": "2026-07-31T17:20:00",
|
||||
"station": "海拉尔站",
|
||||
"departStation": "海拉尔站",
|
||||
"arriveStation": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"success": true
|
||||
}
|
||||
```
|
||||
|
||||
## 六、前端消费动作
|
||||
|
||||
1. 路线只使用真实 `departStation` 与 `arriveStation`;单端缺失显示明确“未知”,legacy-only `station` 仅显示为独立“旧数据站点(路线不完整)”。
|
||||
2. 仅按权威 `transportType=SELF_DRIVE` 进入自驾展示;`BUS`/`OTHER` 使用稳定文案,`null` 与未知字符串按上节 fail-closed。
|
||||
3. `planId` 与 `travelerIds[]` 均为 JSON `String`,必须端到端保持字符串,禁止转为 JavaScript `Number`;精度安全用例使用示例中的超大 ID。
|
||||
4. 前端实现与具名 negative tests 以 [#5366](https://git.1814.love:8443/wx/HL/issues/5366) 为准;该单仍为 OPEN、0/20,当前 `frontend_status` 保持 `pending`。
|
||||
5. 领取后按标准状态流转回写 `frontend_owner`、`frontend_ref` 和 `frontend_status`。
|
||||
|
||||
## 七、Shared Java / Internal Feign 影响
|
||||
|
||||
面向前端的公开管理端契约是 `GET /admin/fleet/board/orders/:orderId`。order-v3 producer 与 Fleet consumer 之间另有内部契约 `GET /v3/internal/order/orders/:orderId/transport`,响应共享 Java DTO `OrderTransportForFleetDTO.TransportSegment/TransportBatch`。
|
||||
|
||||
- `transportType`、`departStation`、`arriveStation` 都是 additive nullable/open `String`;旧 consumer 可忽略新增 JSON key,旧 producer 缺 key 时 Fleet 按 `null` 消费。
|
||||
- 滚动发布顺序应先保证 order-v3 producer 兼容,再由 Fleet consumer 使用;不允许把 oasdiff/SCC 的 `not_configured` 写成 PASS。
|
||||
- shared DTO 的非 board 消费者包括 assignment、H5 itinerary、通知快照/模板与 `OrderQueryFacade` 读路径;本次仅增加它们可忽略的字段,不改变其既有行为,也不授权它们推断路线或交通类型。
|
||||
|
||||
## 验证证据
|
||||
|
||||
- blocker focused:30 tests,0 failure/error,4 个无 Docker 条件 skip。
|
||||
- order producer/internal Controller 定向测试:54 tests,0 failure/error/skip。
|
||||
- Fleet consumer/admin Controller 定向测试:65 tests,0 failure/error/skip。
|
||||
- Fleet Spotless:BUILD SUCCESS。
|
||||
- Fleet reactor verify:2730 tests,0 failure,0 error,2 skips。
|
||||
- order-v3 reactor verify:7210 tests,0 failure,0 error,35 skips。
|
||||
- 最终证据索引:`hl-5363-final-ac493-evidence-index.json`,`safe=true`,7 files。
|
||||
- oasdiff:`not_configured`;以字段级源码对比和 Controller JSON 测试作为 fallback。
|
||||
- Spring Cloud Contract:`not_configured`;以 producer/consumer 测试和两个 reactor verify 作为 fallback。
|
||||
- changelog 草稿门禁:仓库单元测试 46/46、文件名校验、path aliases 校验及 workflow `lint --allow-pending` 均通过。
|
||||
|
||||
`--allow-pending` 只证明 pending 草稿结构合法,不是发布态 lint 证据。后端已合并但未部署,网关亦未验证,因此本分支不创建指向 `main` 的 changelog PR;`backend_status` 与 `gateway_status` 保持 `pending`,`frontend_status` 保持 `pending`。
|
||||
|
||||
## 九、不影响范围
|
||||
|
||||
- 无 DDL、无历史数据迁移。
|
||||
- 不改变派车状态机、候选/占用、费用、保险、Outbox 或消息模板。
|
||||
- 不包含多司机通知/确认、整段资源应用或需求级原子确认。
|
||||
- 不代表 `hl-ui` 已实现、发布或完成页面验证。
|
||||
正在加载...
x
在新工单中引用
屏蔽一个用户