# 管理端行程安排聚合接口 + 订单详情房间日期补全 — 2026-04-21

> **服务** hl-order-service-v2（端口 8094）· **类型** feat + fix · **关联** PR #1064
> **使用场景**：管理端订单详情 · 行程安排 Tab · 查看场景一次性加载
> **前端调用路径**：网关(8080) → hl-order-service-v2(8094)

---

## 一、新增聚合接口

### 🆕 `GET /admin/order/{orderId}/itinerary/summary` — 行程安排聚合

**功能**：一次返回【行程安排】Tab 所需的 **房间 / 车辆 / 交通** 三段数据，替代前端分别调用
`/hotel-assignment`、`/vehicle-assignment`、`/arrival` 的三次并发请求。

原三个接口**保留不动**，编辑场景仍各自调用；查看场景推荐走此聚合接口。

**请求参数**：

| 参数 | 位置 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- | --- |
| `orderId` | Path | `Long` | ✅ | 订单ID |

**返回值** `Result<OrderItineraryRespVO>`：

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `orderId` | `Long` | 订单ID |
| `hotelAssignments` | `List<HotelAssignmentDetailVO>` | 房间安排列表（字段同 `GET /hotel-assignment`，含 `assignmentDate` 现算值） |
| `vehicleAssignments` | `List<VehicleAssignmentVO>` | 车辆安排列表（字段同 `GET /vehicle-assignment`，司机电话脱敏） |
| `transports` | `ArrivalListRespVO` | 交通信息（字段同 `GET /arrival`，按 `ARRIVAL`/`DEPARTURE` 分组） |

> 💡 `transports` 是 VO 包对象而非扁平 List，内部按到达/离开方向拆成 `arrivals` / `departures` 两个子列表，结构与 `GET /arrival` 一致，保留方向分组语义。

**`transports` 子结构**：

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `orderId` | `Long` | 订单ID |
| `arrivals` | `List<ArrivalPlanRespVO>` | 到达批次（`direction=ARRIVAL`） |
| `departures` | `List<ArrivalPlanRespVO>` | 离开批次（`direction=DEPARTURE`） |

**响应示例**：

```json
{
  "code": 200,
  "data": {
    "orderId": 700001,
    "hotelAssignments": [
      {
        "assignmentId": 800001,
        "orderId": 700001,
        "familyIndex": 1,
        "hotelId": 500001,
        "hotelName": "香格里拉",
        "roomTypeId": 500101,
        "roomType": "大床房",
        "dayNumber": 1,
        "assignmentDate": "2026-07-01",
        "upgradePrice": null,
        "remark": null
      }
    ],
    "vehicleAssignments": [
      {
        "assignmentId": 900001,
        "orderId": 700001,
        "vehicleType": "丰田普拉多",
        "vehicleCount": 1,
        "plateNumber": "蒙A·A1234",
        "driverName": "李师傅",
        "driverPhone": "138****1234",
        "remark": null,
        "createTime": "2026-04-20 10:00:00"
      }
    ],
    "transports": {
      "orderId": 700001,
      "arrivals": [
        {
          "planId": 800001,
          "orderId": 700001,
          "direction": "ARRIVAL",
          "directionLabel": "到达",
          "transportType": "FLIGHT",
          "transportTypeLabel": "飞机",
          "transportNo": "CZ6255"
        }
      ],
      "departures": []
    }
  }
}
```

> 💡 三段子项**都带主键**：`hotelAssignments[].assignmentId` / `vehicleAssignments[].assignmentId` / `transports.arrivals[].planId`，从查看态进入编辑态的路径完全通畅。

---

## 二、现有接口字段修复

### 🐛 `GET /admin/order/{orderId}` — 订单详情

**修复**：`hotelAssignmentDetails[].assignmentDate` 之前返回 `null`（由于字段存储方式改为 `dayNumber`），现已由后端按 `order.departureDate + dayNumber - 1` 现算填充。

前端若此前已降级为展示 `-` 或基于 `dayNumber` 自行计算日期，可在本次迭代后恢复直接读取 `assignmentDate`。其他字段保持不变。

---

## 三、与已有接口关系

| 接口 | 作用 | 状态 |
| --- | --- | --- |
| `GET /admin/order/{orderId}/hotel-assignment` | 查酒店分配 | 已有（未变，仍可单独调） |
| `GET /admin/order/{orderId}/vehicle-assignment` | 查车辆分配 | 已有（未变，仍可单独调） |
| `GET /admin/order/{orderId}/arrival` | 查到达批次（按方向分组） | 已有（未变，仍可单独调） |
| `GET /admin/order/{orderId}/itinerary/summary` | 一次返回上述三段 | **本期新增** |

聚合接口与三个独立接口**并存**：
- **查看态**：推荐走 `/itinerary/summary`，一次请求拿全。
- **编辑态**：仍各自调子接口，减少无关数据传输。

---

## 四、数据库变更

**无**。纯服务层聚合，数据源均是既有表。

---

## 五、错误码

HTTP 始终返回 200，错误码在 `Result.code` 中。

| code | 触发 | 说明 |
| --- | --- | --- |
| 200 | 正常 | 成功（无分配数据返回空列表/空子对象） |
| 400 | 订单不存在 | `BusinessException` |

---

## 六、关联

- PR: [wx/HL#1064](https://git.1814.love:8443/wx/HL/pulls/1064)（已合并到 dev）
- 相关接口：
  - `GET /admin/order/{orderId}/hotel-assignment` · `GET /admin/order/{orderId}/vehicle-assignment` — 见 `2026-04-20_order-v2_admin-assignment-get.md`
  - `GET /admin/order/{orderId}/arrival` — 见 `2026-04-20_order-v2_arrival.md`（C 端，管理端字段结构一致）
  - `PUT /admin/order/{orderId}/hotel-assignment` `date → dayNumber` 破坏性变更 — 见 `2026-04-21_order-v2_hotel-assignment-day-number.md`
