--- 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,服务健康