# 【前端对接·管理后台】订单用车座位校验事务边界收口

> Issue: [wx/HL#4858](https://git.1814.love:8443/wx/HL/issues/4858)  
> PR: [wx/HL#4859](https://git.1814.love:8443/wx/HL/pulls/4859)  
> 服务: `hl-order-service-v3`  
> 日期: 2026-07-08  
> 影响范围: 订单详情 / 调整订单弹窗 / 车辆安排

## 1. 结论

- 本次不新增前端字段，不改变请求结构。
- 前端仍按 #4856 文档处理：先选车型大类，再从 `GET /admin/fleet/vehicle-types/list` 的 `seatOptions` 渲染座位数下拉。
- `PUT /v3/admin/order/{id}/vehicle-requirement` 提交前，后端会在事务外只读调用车务车型库校验 `vehicleType + seats`。
- 非法座位数组合继续返回 `582024`，车务车型库不可用继续返回 `582091`。

## 2. 提交请求保持不变

```http
PUT /v3/admin/order/2074746808742928386/vehicle-requirement
Authorization: Bearer <admin-token>
Content-Type: application/json
```

```json
{
  "fleet": [
    {
      "vehicleType": "suv2",
      "seats": 5,
      "count": 1
    }
  ],
  "specialTags": ["儿童安全座椅"],
  "remark": "需要接机，后备箱放 2 个 28 寸行李箱"
}
```

字段口径：

| 字段 | 类型 | 说明 |
|------|------|------|
| `fleet[].vehicleType` | string | 车型大类 key。前端可传真实 `typeKey`，后端保存前归一为 `suv/mpv/bus/sedan`。 |
| `fleet[].seats` | number | 从该大类 `seatOptions` 中选择的座位数。 |
| `fleet[].count` | number | 车辆数量，必须大于 0。 |

## 3. 非法座位数组合

请求示例：

```json
{
  "fleet": [
    {
      "vehicleType": "suv",
      "seats": 99,
      "count": 1
    }
  ],
  "specialTags": [],
  "remark": "negative-seat-check"
}
```

响应示例：

```json
{
  "loginStatus": 200,
  "requestStatus": 200,
  "code": 582024,
  "msg": "座位数不在该车型大类可选座位数中，请检查车型库",
  "data": null
}
```

前端处理：

- 直接展示后端 `msg`。
- 不允许把座位数改成手输。
- 切换车型大类后，如果当前座位数不在新大类 `seatOptions` 内，需要清空座位数并要求重新选择。

## 4. 验证结果

- 测试环境 `hl-order-service-v3` 已部署成功。
- `8086/8186` 双实例 `/actuator/health` 返回 200。
- 管理端 API 负向实测：非法 `seats=99` 返回 `582024`，证明校验发生在订单查找和写库之前。
