--- 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(业务校验生效);端点部署成功