---
schema: "hl-changelog/v2"
ticket: "5665"
title: "改派时支持增加/删除槽位（调整车辆数量）"
consumer: "admin"
author: "wx(GIT)"
change_type: "新增接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_owner: "mmg"
frontend_ref: "f1c00ba8"
target_release: ""
verified_at: ""
status_note: "后端完成：PR #5669 已合并 dev-v3 并部署 TEST（hl-fleet-service 双实例）。新增 POST /admin/fleet/assignments/slots 增槽位；删除槽位复用既有 DELETE /slots/{slotId}。前端需在改派页加【增加槽位】【删除槽位】操作并编排现有接口（见前端交接）。"
updated_at: "2026-08-08"
base: "dev-v3"
generated: "2026-08-07T20:26:00+08:00"
---

# 改派时支持增加/删除槽位（调整车辆数量）

> 后端完成：PR #5669 已合并 dev-v3 并部署 TEST，网关验证通过。**前端需在改派页增加【增加槽位】【删除槽位】操作**。

## 关联 / 联系人

### 链接

- **Issue**: [#5665](https://git.1814.love:8443/wx/HL/issues/5665)
- **PR**: [#5669](https://git.1814.love:8443/wx/HL/pulls/5669)
- **Merge commit**: [c3f0f8fac](https://git.1814.love:8443/wx/HL/commit/c3f0f8fac)

### 联系人

- **后端负责人**: @wx

## 背景

改派（change）原本只能换车/换司机（同槽位内换），不能增加/删除槽位（调整车辆数量）。wx 要改派时可增删槽位。对齐 #5562 槽位模型（派车时可增删）。按协调台口径走 A 方案：复用 expand/slots 机制，**只增删差异、保留已派**，不新建独立重派流程、不侵入 change 主流程。

## 变更接口

### 新增：`POST /admin/fleet/assignments/slots`（增加槽位）

在 active 用车需求上新增 1 个全程槽位（unassigned 全程占位行覆盖整个服务期），新槽位待确认按初次派车。**保留已有槽位（含已派）完全不动**。

**请求**（`SlotAddReqVO`）：

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| requirementId | Long | 是 | 归属需求 ID（active 用车需求） |
| vehicleType | String | 是 | 新槽位车型（如 suv/mpv） |
| seats | Integer | 是 | 新槽位座位需求（1-60） |
| reason | String | 否 | 新增原因（≤200 字，操作日志留痕） |

**响应**（`SlotAddRespVO`）：

| 字段 | 类型 | 说明 |
|------|------|------|
| slotId | Long(字符串) | 新槽位 ID（assignmentSlotId） |
| assignmentId | Long(字符串) | 新槽位全程占位行派单 ID |
| requirementId | Long(字符串) | 归属需求 ID |
| orderId | Long(字符串) | 归属订单 ID |
| fleetItemIndex | Integer | 新槽位需求内项次序 |
| retainedSlotIds | Long[](字符串) | 新增后 Step2 快照保留槽位集合 |
| snapshotVersion | Long(字符串) | 新增后快照版本（无快照时 null） |

**错误码**：400 参数校验失败（需求 ID/车型/座位数缺失）/ **605012** 需求无派单行 / **605007** 需求不可派（非 active/已取消/不可派）/ 605008 抢锁超时 / 401 未登录 / 403 非车务角色。

**行为**：
- 新槽位生成 1 条 unassigned 全程占位行（`service_date`/`assignment_group_id` 为 NULL，`start_date~end_date` 覆盖整个服务期），车务在该槽派 1 辆管全程的车（候选/价格日历/校验同初次派车 create）
- 保留已有槽位（含 holding/assigned 已派）完全不动——只增差异槽位，不重置/重派
- **确认状态**：清最终确认标记（改派需重新冻结方案）；保留槽位确认状态不变
- Step2 快照 retained 追加 + 版本递增 + digest 重算；FleetBoardChangedEvent + 操作日志 SLOT_ADDED

### 复用：`DELETE /admin/fleet/assignments/slots/{slotId}`（删除槽位，零改动）

既有端点（#5550/#5572），删除已派（holding/assigned）槽位时联动取消派单（释放占用+退保意图+取消事件），行程已出发拒绝（605027）。

## 前端交接（改派页）

在改派页增加两个操作，**编排现有接口**（后端已就绪）：

1. **【增加槽位】**（多派一辆）：
   - 调 `POST /admin/fleet/assignments/slots`（传 requirementId + vehicleType + seats + reason）
   - 成功后新槽位出现在看板/改派页，车务对新槽位按初次派车（候选/价格/校验）派 1 辆车
2. **【删除槽位】**（少派一辆）：
   - 调既有 `DELETE /admin/fleet/assignments/slots/{slotId}`（有派单时后端联动取消）
   - 行程已出发的槽位不可删（605027）；已完成的槽位不可删（605007）
3. **换车/换司机**：仍调既有 `POST /{assignmentId}/change`（不变）

**展示/交互提示**：增删槽位后改派方案需重新冻结（后端已清最终确认标记）；保留槽位的确认状态/车辆/司机不变。座位数校验在派车 create 时进行（座位不足进 warnings）。

## 验证证据

- 新增 3 用例：增槽位成功生成全程行+保留已派+Step2 追加 / 需求无派单行 605012 / 需求不可派抛错
- AssignmentServiceTest **394/394 全绿**；fleet spotless:check 通过
- fleet verify（mvn-throttle 错峰）：3251 测试仅 `ReleaseEOccupancyMysql8033RecoveryTest`（需 MySQL 8.0.33 环境）基线失败，与本案无关
- **部署**：hl-fleet-service 双实例 UP（20:24）
- **网关验证**：VEHICLE_MANAGER 调 `POST /admin/fleet/assignments/slots`：缺 requirementId → 400（参数校验生效）；不存在需求 → 605012（业务校验生效）；端点部署成功
