---
schema: "hl-changelog/v2"
ticket: "5698"
title: "改派修复：已派全程行改派生效（计费日期整段校验）+ 清除司机/车辆后槽位空态待重选"
consumer: "admin"
author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_owner: "mmg"
frontend_ref: "106aa658"
target_release: ""
verified_at: ""
status_note: "后端接口行为修复：POST /admin/fleet/assignments/ID/change 对已派全程行（service_date 为空、start/end 覆盖整个服务期）改派时，计费日期/费用快照/组派冲突检查按整段服务期展开——此前 serviceDateOf 只回退生效日第一天，前端按全部服务日提交计费日期即报「计费日期必须属于本派车组服务日期」，改派完全不生效（TEST 操作日志 13:59 连续 7 次 change_failed 实证）。修复后网关实证改派成功（双向往返均生效）。前端配合项见正文「前端交接」。"
updated_at: "2026-08-08"
base: "dev-v3"
generated: "2026-08-08T15:00:00+08:00"
---

# 改派修复：已派全程行改派生效 + 清除司机/车辆后槽位空态

> 后端完成：PR #5699 已合并 dev-v3（fb8945e97）并部署 TEST，网关验证通过（改派双向往返生效、现场已还原）。

## 关联 / 联系人

### 链接

- **Issue**: [#5698](https://git.1814.love:8443/wx/HL/issues/5698)
- **PR**: [#5699](https://git.1814.love:8443/wx/HL/pulls/5699)
- **关联**: [#5676](https://git.1814.love:8443/wx/HL/issues/5676)（按天改派）、[#5691](https://git.1814.love:8443/wx/HL/issues/5691)（回显全部服务日）

### 联系人

- 后端：wx（GIT）
- 前端配合：mmg / 协调台

---

## 背景（wx 实测）

改派页两个 bug：

1. **清除司机没清空**：点「清除车辆/司机」后槽位仍显示原车蒙A-E2E99+王信（已生效派车），用户以为没清空。
2. **统一改派确认后司机没变**：选新司机→确认→还是原司机，改派完全不生效（"完全不懂"）。

## 后端修复（#5698，已部署 TEST）

### Bug 2 根因

TEST 操作日志实证：订单 HL20260808105342627（蒙A-E2E99+王信，8/17-8/20 **全程行** service_date=NULL）13:59 连续 7 次 `change_failed`，报错均为：

> `参数非法: 计费日期必须属于本派车组服务日期`

已派全程行改派按整槽替换（#5595 语义），但 `resolveChargeableServiceDates` 用 `serviceDateOf()` 对全程行只回退到 **startDate 一天**；前端按全部服务日提交计费日期（#5691 回显全部服务日后的真实载荷）→ 校验失败 → change 抛异常回滚 → 改派不生效（前端静默失败）。

### 修复

`AssignmentService#changeTargetServiceDates`：全程行按 [startDate..endDate] **整段展开**，逐日切片行取自身 serviceDate；应用于改派 4 处——计费日期校验、对账期检查、组派冲突检查、替换行费用快照报价（quote 从只报第一天改为整段）。

**接口契约不变**（无新增/变更字段），仅修复既有行为。守卫不放宽：计费日期超出服务期仍拒绝；跨常驻组合仍要求确认（605036）；无变化载荷仍拒绝（605029）。

### 验证

- 定向测试 `AssignmentServiceTest` 400 项全绿（新增 2 项：整段计费日期改派成功 + 越界日期仍拒绝）；回归 210 项全绿；fleet verify 3293 项全绿；spotless 通过
- 网关实证（TEST，wx 实测现场）：统一改派（effectiveDate=第一天 + 整段计费日期）到新司机/新车辆 **业务成功**（修复前 7 连败），替换行 assigned 全程形态 8/17-8/20；换回原派同样成功；现场已还原为 蒙A-E2E99+王信

## 前端交接（pending，需前端配合）

### 1. 清除司机/车辆后槽位显示空态（协调台定口径 B）

现状：改派页「清除车辆/司机」（#5662）只清**本次改派草稿**（不触发后端），槽位行继续显示已生效派车（蒙A-E2E99+王信）——用户误以为"没清空"。

期望（口径 B）：清除后该槽位行显示**空态（待重选）**，用户明确"已清空"，随后重新选择车/司机，提交改派生效。后端派单必须车+司机的终态不变（**改派提交前仍是原值**），清除只是前端进入"待重选"展示态。

- 相关代码：`src/views/fleet/board/components/AssignModal.vue`（`clearChangeAssignmentDraft` / `changeDraftCleared` / 槽位表「当前车辆/当前司机」列）
- 交互参考：清除后已有「已清除草稿，可重新选择」提示与「选择车辆/司机」入口，仅需将槽位表两列在 `changeDraftCleared=true` 时改为空态展示（如显示「待重新选择」）
- 验收：清除后槽位行不再显示原车/原司机；重选新司机提交后列表展示新司机

### 2. 统一改派链路

后端修复后，前端现有提交链路（`useAssignFlow.js` `buildAssignmentSubmission`：单次调 change、effectiveDate=第一天、不传 serviceDates、携带整段 chargeableServiceDates）可直接生效，无需改动。按天改派（serviceDates）不受影响。

## 变更接口

### `POST /admin/fleet/assignments/ID/change`（行为修复，接口契约不变）

- 已派全程行（`service_date` 为空、`start_date`/`end_date` 覆盖整个服务期）改派时，入参 `chargeableServiceDates` 允许携带该行覆盖的**全部服务日**（此前只认生效日第一天，其余日期报「计费日期必须属于本派车组服务日期」导致改派失败回滚）
- `chargeableServiceDates` 超出目标行服务期仍拒绝（守卫不放宽）；其余入参语义不变（`effectiveDate` 必填、`serviceDates` 空=连续后缀整体改派、`newVehicleId`/`newDriverId` 可空=保留原值）
- 响应结构不变；替换行费用快照/报价按整段服务期计算（不再只算第一天）

## 前端/调用方动作

- 后端无动作：现有提交链路（单次调 change + effectiveDate=第一天 + 整段计费日期）修复后直接生效
- **前端配合项（pending）**：改派页「清除车辆/司机」后槽位行显示空态（待重选），不再显示原车/原司机——见上文「前端交接」

## 验证证据

- 定向测试：`AssignmentServiceTest` 400 项全绿（新增 2 项全程行整段计费日期改派成功/越界拒绝）；回归 FleetAssignmentMapper 61 + 候选 50 + 快照 11 + 看板 88 全绿；fleet verify 3293 项全绿；spotless 通过
- 部署：TEST 滚动部署 hl-fleet-service 双实例 UP（8087/8187，dev-v3 @ fb8945e97）
- 网关实证（wx 实测现场 HL20260808105342627）：统一改派到新司机/新车辆业务成功（修复前 7 连败），替换行 assigned 全程形态 8/17-8/20；换回原派同样成功；现场已还原

## 验收清单（本单）

- [x] 清除司机正常清空（司机+车辆都清）——口径 B 已定：前端清除后槽位空态待重选（**前端交接 pending**）；后端终态语义不变
- [x] 统一改派确认后司机改成新选的（生效）——后端修复完成，TEST 网关实证双向往返生效
- [x] 定向测试 + PR 合并 + 部署 TEST + 网关验证——PR #5699 合并 dev-v3（fb8945e97），TEST 滚动部署双实例 UP，网关验证通过
- [x] changelog（yst 完整格式）——本文件
