---
schema: "hl-changelog/v2"
ticket: "5589"
title: "HOLD 通知派车组不存在 500 修复（全程槽占位消费组 id 回填 + 单行组查询回退）"
consumer: "admin"
change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: "v2.1"
verified_at: "2026-08-06"
status_note: "后端完成：PR #5590 已合并 dev-v3 并部署 TEST（13:20 滚动 DONE）；网关验证全链路 PASS：batchCreate holdMode=1 200（修复前 500 派车组不存在）、组 id 回填=行 id、通知日志/outbox 正常、司机确认→确认执行 assigned。前端无需配合。"
updated_at: "2026-08-06"
base: "dev-v3"
generated: "2026-08-06T12:50:00+08:00"
---

# HOLD 通知派车组不存在 500 修复

> **服务**: hl-fleet-service
> **PR**: [#5590](https://git.1814.love:8443/wx/HL/pulls/5590)
> **Issue**: [#5589](https://git.1814.love:8443/wx/HL/issues/5589)
> **日期**: 2026-08-06
> **影响**: 🟢 **缺陷修复**，无契约变更。管理后台 HOLD 通知派车（holdMode=1）此前 500「HOLD 通知派车组不存在」，本次修复后全链路可用。前端无需改代码。

## 背景

#5589（P1）协调台实测：`batchCreate` 派单 holdMode=0（直接 assigned）成功，holdMode=1（HOLD 通知）500 `IllegalStateException: HOLD 通知派车组不存在: groupId=…`。

**根因**：#5562 全程槽模型下，全程/单行占位行的 `assignment_group_id` 保持 NULL（有意设计），占位消费升级（`consumePlaceholderToActive`）也未回填。HOLD 通知链路对单行组使用「组 id=行 id」回退语义（`effectiveGroupId`），但组查询（`selectByAssignmentGroupId`）只按 `assignment_group_id` 匹配 → 查空 → 发送结果提交 500。

## 修复内容（内部，无接口/字段变化）

1. **占位消费回填组 id**：`consumePlaceholderToActive` 消费单行占位时 `assignment_group_id=自身行 id`（与历史行迁移回填约定一致，新数据根治）；
2. **组查询单行组回退**：`selectByAssignmentGroupId` / `selectByAssignmentGroupIdForUpdate` 按组 id 查空时，回退 `assignment_id=groupId AND assignment_group_id IS NULL`（覆盖存量 NULL 组行，发送授权/结果提交/行程短信统一入口）；
3. **CAS 回写回退**：`markHoldNotificationSent` 按组更新 0 行时按行 id 回退更新（单行组 hold_sent_at 回写）。

## 受影响接口（行为修正，无字段增减）

```
POST /admin/fleet/assignments/batch-create        （holdMode=1 不再 500）
POST /admin/fleet/assignment-hold-notifications   （发送授权/重试对单行组可用）
```

## 验证

- 定向：FleetAssignmentMapperTest 61/61（+4：组 id 回填/双回退）、AssignmentHoldNotificationResultServiceTest 16/16（+1：全程单行组 commitSent）、AssignmentServiceTest 372/372、HOLD 通知域 253/253；fleet 全量 3183 仅 2 个 MySQL 集成 Error 为 3306 端口竞争（其他会话容器），空闲窗口补跑全绿（MutationFence 2/2 + InsuranceCostFence 2/2 + ReleaseE 10/10）
- 网关：TEST 13:20 部署 → batchCreate holdMode=1 **200**（修复前 500）→ 行 holding + 组 id 回填=行 id → HOLD 通知日志/outbox 正常（无行程短链产品降级为站内通知，非异常）→ 司机确认 driver_confirmed → 车务确认执行 **assigned + confirmedAt** → DB 对账全绿
