---
schema: "hl-changelog/v2"
ticket: "5926"
title: "排车 Step2 栅格改期残留旧实派行不回显车牌/司机/价（前端渲染）"
consumer: "admin"
change_type: "前端修复"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "01ae772f"
target_release: "v2.1"
verified_at: "2026-08-12"
status_note: "#5926 明文回显+删后刷新已由前端 01ae772f 验证；但原『取消残留派车』误用整槽接口导致 #5937 P0。逐日取消新契约以 #5937 为准：使用 cells[].assignmentId 调 POST /admin/fleet/assignments/{assignmentId}/cancel-residue，禁止老 DELETE /assignments/{assignmentId} 和槽位删除。#5937 前端状态仍 pending。"
updated_at: "2026-08-12"
base: "dev-v3"
---

# 排车 Step2 栅格改期残留旧实派行不回显车牌/司机/价（#5926 / PR #5930，承接 #5912）

> **服务**: hl-fleet-service（后端） + hl-ui（前端渲染）
> **PR**: #5930（后端字段透出）
> **日期**: 2026-08-12
> **现象**: 订单改期后，派单页 Step2 排车栅格里 08-18/19/20 这三行旧实派数据显示成「车辆待选择 / 司机待选择 / ¥0.00」空态，只挂了个「改期残留·待清理」红标签——数据列不回显。

---

## 根因（前后端各一半，后端缺口已补）

1. **#5912 已修日期轴**：栅格 `editableServiceDates` 已并入旧行日期（08-18~24 共 7 天），旧实派行的日期格回来了。
2. **后端缺口（本次 #5926 补）**：栅格 `cells[]` 原本只透 `vehicleId`/`driverId` 两个 ID，无明文；而 `selectedVehicle`/`selectedDriver` 展示快照只在「本次新选中」时填充，改期前旧会话派的行进入 Step2 时为 **null**。前端拿不到明文，只能贴残留标签、数据列留空。
3. **前端待做**：渲染栅格逐行时，把后端回的 `vehiclePlate`/`driverName`/`protocolPrice` 填进对应行。

## 对应接口（前端排车 Step2 栅格唯一权威数据源）

```
POST /admin/fleet/assignments/candidates
```

请求体（**必传 `startDate`/`endDate`**，否则 400「用车开始/结束日期不能为空」）：

```json
{
  "orderId": 2086270141158346754,
  "requirementId": 2087434583048888322,
  "startDate": "2026-08-21",
  "endDate": "2026-08-24"
}
```

栅格数据确切路径：

```
data.canonicalSnapshot.editableServiceDates   # ["2026-08-18"..."2026-08-24"] 7 天日期轴(已并入旧行日期)
data.canonicalSnapshot.cells[]                # 每 cell = 一个槽位 × 一天:
```

## 本次 cell 新增 3 个明文字段（前端消费）

| 字段 | 类型 | 说明 |
|---|---|---|
| `vehiclePlate` | string | 当天车牌明文（行冻结展示快照）。USED cell 有值；UNUSED/未编辑为 null。 |
| `driverName` | string | 当天司机姓名明文（行冻结展示快照）。USED cell 有值；UNUSED/未编辑为 null。 |
| `protocolPrice` | number | 当天派车价。chargeable=0（免费日）恒 0；缺协议价回退日历参考价；再无则 0 兜底。UNUSED/未编辑为 null。 |

配合既有字段：`used`（USED/UNUSED/null）、`rescheduleResidue`（改期残留标记，前端红标签靠它）、`canDelete`/`deleteBlockReason`。

## 实测（订单 26-0821 / 2086270141158346754，改期 08-18→08-21）

```
editableServiceDates = [08-18,08-19,08-20,08-21,08-22,08-23,08-24]
cells(槽位1 蒙A-K1999 巴根那 ¥1500):
  08-18  USED · plate=蒙A-K1999 · driver=巴根那 · price=1500.0 · residue=true  · canDelete=true
  08-19  USED · 同上 · residue=true
  08-20  USED · 同上 · residue=true
  08-21  USED · 同上 · residue=false(在新窗内,不误标)
cells(槽位2 蒙A-T1557 朝鲁门 ¥1000):同样 4 天明文齐全
```

## 前端修复要点

- 栅格日期轴用 `canonicalSnapshot.editableServiceDates` 建（已含旧日期 08-18~20），**不要**自己按当前需求窗建轴。
- 逐行渲染时按 `cells[]` 里同 `serviceDate` 的 cell，把 `vehiclePlate`/`driverName`/`protocolPrice` 填进去——后端已回，别再只贴「改期残留」红标签留空数据列。
- `rescheduleResidue=true` 的行继续挂「改期残留·待清理」徽标；逐日取消必须按 #5937 使用 `cells[].assignmentId` 调 `POST /admin/fleet/assignments/{assignmentId}/cancel-residue`。**严禁**调用老 `DELETE /admin/fleet/assignments/{assignmentId}` 或槽位删除接口——二者均为整槽语义，会连带取消同槽其他日期。

## 验证证据（后端）

- fleet 全量 `mvn test` 3680 跑 0 失败 0 错误；ArchTest 13 绿；spotless 净。
- 新增单测覆盖明文透传 + FREE/OVERRIDE/CALENDAR 价口径。
- 测试服 API 实测：08-18/19/20 返回明文车牌/司机/价（见上）。

## 前端缺陷点 2：取消/删除成功后必须重拉 candidates 刷新栅格（26-3559 实测）

> 承接用户第二个实测报障：**「删除按钮显示删除成功了，但还是有这条数据」+「08-24/25 不回显」**（订单 26-3559 / 2086270159575535618，改期 08/24→08/26）。

**DB 地面真相（后端是对的，无需改）**：

```
fleet_assignment(order 2086270159575535618):
  08-24  canceled · 蒙A-G8888 宝音德力格尔 ¥900 · cancel_reason=「槽位删除联动取消派车」 @18:44:39
  08-25  canceled · 同上 @18:44:39
  08-26  canceled · 同上 @18:44:39
  → 三行已全部 canceled、占用已释放,后端取消【真实生效】
```

- 车务点「删除」→ 后端**确实取消成功**（占用已释放，非没生效）。
- 但栅格仍把 08-24/25 渲染成「已规划用车 + 改期残留」空态行、08-26 还显示旧的 蒙A-G8888/宝音德力格尔/¥900——**前端在拿取消前的本地旧栅格态渲染，删除后没有重拉 candidates 刷新**。
- 后端 `candidates` 的 `cells[]` 现在已正确地不含这些 canceled 终态行（`editableServiceDates` 只并入在途 unassigned/holding/assigned 行，终态行不并入）。

**前端要改（状态管理）**：

1. **取消/删除派车成功后，必须重新调 `POST /admin/fleet/assignments/candidates` 拉最新 `canonicalSnapshot` 重建栅格**，不要复用取消前缓存的本地栅格态。
2. 渲染以**最新 `cells[]`** 为唯一权威：后端已移除（canceled 终态）的行不要再显示；在途残留行按 `vehiclePlate`/`driverName`/`protocolPrice` 明文渲染（缺陷点 1 已透出）。

**产品口径（已与 wx 对齐）**：改期残留旧行（在途/已派）回显带明文 + 标「改期残留·待清理」，等车务手动删；点删除 = 取消 + 释放占用 + **行从栅格消失**（前端重拉）。「删了还在」即此缺陷——纯前端没刷新。

## 联系人

- **后端负责人**: @wx
- **前端消费**: @mmg（①渲染 `cells[].vehiclePlate/driverName/protocolPrice` + 既有 `rescheduleResidue`/`canDelete`；②取消/删除后重拉 candidates 刷新栅格）
