---
schema: "hl-changelog/v2"
ticket: "5649"
title: "holdMode=0直派兼容全程占位行拓扑校验（修复既有缺口）"
consumer: "admin"
author: "wx(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: ""
status_note: "后端完成：PR #5653 已合并 dev-v3 并部署 TEST（hl-fleet-service 双实例）。修复 holdMode=0 直派+全程占位行需求拓扑校验必挂（既有缺口，#5643 发现非回归）。无请求/响应契约变化，仅派单 finalize 内部拓扑校验逻辑兼容全程形态。"
updated_at: "2026-08-07"
base: "dev-v3"
generated: "2026-08-07T17:10:00+08:00"
---

# holdMode=0 直派兼容全程占位行拓扑校验（修复既有缺口）

> 后端完成：PR #5653 已合并 dev-v3 并部署 TEST，网关验证通过。

## 关联 / 联系人

### 链接

- **Issue**: [#5649](https://git.1814.love:8443/wx/HL/issues/5649)
- **PR**: [#5653](https://git.1814.love:8443/wx/HL/pulls/5653)
- **Merge commit**: [86a8a8aa9](https://git.1814.love:8443/wx/HL/commit/86a8a8aa9)

### 联系人

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

## 背景

#5643 发现的既有缺口（非回归）：holdMode=0 直派的 batch dailyPlan 在**全程占位行需求**上必挂——`finalizeDailyBatchDispatchPlan` 期望逐日切片（`isSingleDaySlice`），但全程占位行（#5562 全程槽模型：`service_date` NULL、`startDate~endDate` 覆盖整个服务期）被整段消费后保持全程形态，只产生 `slot:startDate` 一个拓扑 key，与逐日 items（`slot:start..slot:end`）不匹配，单行 `isSingleDaySlice` 校验也必挂，拓扑校验误报「最终实派方案写入不完整」。考古 274b03561288（#5595 前基线）同样逻辑。holdMode=1 HOLD 路径跳过 finalize 不受影响。

## 修复

`finalizeDailyBatchDispatchPlan` 拓扑校验兼容全程占位行：

1. **key 展开**：将 `isFullTripRow` 的全程行按服务期逐日展开为多个逻辑 key（`slot:start..slot:end` 全部映射到同一物理行），与逐日 items 的 key 集合对齐
2. **单行校验**：合法形态从「仅 `isSingleDaySlice`」放宽为「`isSingleDaySlice || isFullTripRow`」——整段消费的全程行不再误判为写入不完整
3. **ID 去重**：全程行跨多天展开为多个逻辑 key 但对应同一物理行，`finalizedAssignmentIds` 按物理行去重（只收一次 ID），避免 `markDispatchPlanGeneration` 的 distinct 校验误报

## 变更接口

**无请求/响应契约变化**——仅派单 finalize 内部拓扑校验逻辑修复（`POST /admin/fleet/assignments/batch` 的 dailyPlan 直派路径行为修正：全程占位行需求从「必挂报错」变为「正常冻结」）。

## 行为变化

- **holdMode=0 直派 + 全程占位行需求**：从「拓扑校验必挂、报『最终实派方案写入不完整』」修复为「正常冻结最终实派方案」
- **holdMode=1 HOLD 路径**：跳过 finalize，完全不受影响
- **逐日切片路径**：`isFullTripRow` 为 false 走原逻辑，行为不变
- **拓扑真缺失**：仍正确报「写入不完整」（key 集合不匹配时不放松校验）

## 前端/调用方动作

无需改动（仅修复了直派路径在全程占位行需求上的误报，前端调用方式不变）。

## 验证证据

- **新增 3 用例**：直派全程占位行不误报 / 直派逐日切片不受影响 / 直派拓扑缺失仍报不完整
- AssignmentServiceTest **386/386 全绿**；fleet spotless:check 通过
- fleet verify（mvn-throttle 错峰）：3243 测试仅 `ReleaseEOccupancyMysql8033RecoveryTest`（需 MySQL 8.0.33 环境）基线失败，与本案无关
- **部署**：hl-fleet-service 双实例 UP（17:05）
- **网关验证**：VEHICLE_MANAGER 调 `/admin/fleet/board/summary`、`/admin/fleet/reconciliation/cars` 均 200，服务健康
