---
schema: "hl-changelog/v2"
ticket: "5701"
title: "登记司机确认不被「通知结果正在确认」拦截（人工确认直接成功）"
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 #5705/#5716/#5719 已合并 dev-v3 并部署 TEST（hl-fleet-service 双实例）。登记司机确认（MANUAL_CONTACT）与 confirm 确认执行均不再被 605042 拦截；已冻结 HOLD 组 confirm 不再误判 605020。全链路「登记确认→confirm assigned」网关实证走通（AMBIGUOUS+已冻结组 confirm 200 assigned）。前端交接见下（605042 场景收敛与错误提示口径）。"
updated_at: "2026-08-08"
base: "dev-v3"
generated: "2026-08-08T18:15:00+08:00"
---

# 登记司机确认不被「通知结果正在确认」拦截（人工确认直接成功）

> 后端完成：PR [#5705](https://git.1814.love:8443/wx/HL/pulls/5705) 已合并 dev-v3 并部署 TEST，网关全链路验证通过。

## 关联 / 联系人

### 链接

- **Issue**: [#5701](https://git.1814.love:8443/wx/HL/issues/5701)
- **PR**: [#5705](https://git.1814.love:8443/wx/HL/pulls/5705) / [#5716](https://git.1814.love:8443/wx/HL/pulls/5716) / [#5719](https://git.1814.love:8443/wx/HL/pulls/5719)
- **Merge commit**: [d28d2cd11](https://git.1814.love:8443/wx/HL/commit/d28d2cd11)

### 联系人

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

## 背景

派单页点「登记司机已确认」报 **605042「司机通知结果正在确认，请稍后重试」**——HOLD 通知异步发送结果仍 AMBIGUOUS（短信网关未回执）时，人工登记被拦；连锁导致 confirm 确认执行报 605020（司机确认没登记上，状态未到可确认执行）。口径（wx）：车务点确认就是确认——系统不知道司机线下结果，人工登记与异步通知结果应解耦。

## 变更说明（无接口契约变化，行为修正）

### `POST /admin/fleet/assignments/{assignmentId}/driver-confirmation` 行为变化

| 场景 | 变更前 | 变更后 |
|------|--------|--------|
| 通知结果确认中（AMBIGUOUS）+ **MANUAL_CONTACT** 人工联系登记 | 605042 拦截 | **直接登记成功** |
| 通知结果确认中（AMBIGUOUS）+ **NOTIFICATION** 通知回复来源 | 605042 拦截 | 400「无系统通知发送成功事实时必须显式选择人工联系来源」（更准确的引导） |
| 通知结果确认中 + 未显式指定来源 | 605042 拦截 | 400「无系统通知发送成功事实时必须显式选择人工联系来源」 |
| 通知已发送（SENT）/未发送（NOT_SENT/失败/取消） | 不变 | 不变 |

### `POST /admin/fleet/assignments/{assignmentId}/confirm` 行为变化（补修）

| 场景 | 变更前 | 变更后 |
|------|--------|--------|
| 通知结果确认中（AMBIGUOUS）+ 已登记司机确认 | 605042 拦截 | **直接推进 assigned**（同登记确认口径，与异步通知结果解耦） |
| 已冻结 HOLD 组（dispatch_plan_finalized=1，#5697 冻结方案常态） | **605020 误判**（组级冻结 CAS 对已冻结行幂等跳过，但断言要求全量更新，自相矛盾） | 正常推进 assigned（断言只覆盖未冻结行） |

### 不变的保护

- 其余 605042 保护点（expand 换版 / cancel / change / undo 等**通知代际推进与身份失效**场景）保留原拦截。
- NOTIFICATION 来源仍需通知 SENT 事实（原有校验不变）。

## 前端交接

1. **人工登记路径**：司机线下确认后，登记请求传 `driverReplySource=MANUAL_CONTACT`（+操作人）即可直接成功，不再需要等通知结果回执或重试。
2. **605042 在该端点不再出现**：前端可移除 driver-confirmation 的 605042 重试引导；通知未回执时若用户选「通知回复」来源，会收到 400 提示「请选择人工联系来源」，按文案展示即可。
3. **全链路**：登记确认成功后，`POST /{assignmentId}/confirm`（确认执行）即可走通 assigned（605020 连锁消除）。

## 验证证据

- **网关全链路（补修实证，TEST，holding 派单 2085978741208481793）**：通知 AMBIGUOUS（delivery_status=dispatching）+ 已冻结组（dispatch_plan_finalized=1）+ 已登记 MANUAL_CONTACT 司机确认 → `confirm` 确认执行 → **200 成功，confirmed=true、status=assigned**、返回行程 H5 链接（一次实证同时覆盖 AMBIGUOUS 放行与已冻结组 605020 修复）

- **单测**：新增 2 用例（AMBIGUOUS+MANUAL_CONTACT 登记成功并写凭证；AMBIGUOUS+未显式来源拒绝并提示人工联系），替换原 605042 拦截用例；AssignmentServiceTest **402/402 全绿**；spotless 通过
- **fleet verify**（mvn-throttle 错峰，Docker 原生 Testcontainers）：仅 `ReleaseEOccupancyMysql8033RecoveryTest` 10 个基线失败（frozen Release E V002 SHA-256 发布产物缺失，与本案无关），其余 3286 全绿
- **部署**：hl-fleet-service 双实例 UP（15:29）
- **网关全链路**（TEST，VEHICLE_MANAGER，holding 派单 2085662146632224770）：
  - 构造通知 AMBIGUOUS（delivery_status=dispatching）→ `driver-confirmation` MANUAL_CONTACT 登记 → **200 直接成功**（修复前 605042）✓
  - 通知恢复终态后 `confirm` 确认执行 → **200，confirmed=true、status=assigned**、返回行程 H5 链接、车辆/司机状态置 busy ✓（605020 连锁消除）

## 前端实证确认（2026-08-08 mmg，hl-admin）

确认 not_required 属实，零代码改动：

1. **前端唯一登记路径即 MANUAL_CONTACT**：`useAssignFlow.js:121 buildDriverConfirmationSubmission` 硬编码 `driverReplySource: 'MANUAL_CONTACT'`，注释明确「此入口只供后台人工电话/微信登记；必须与通知回执事实显式隔离」。后端变更后该路径在 AMBIGUOUS 时直接成功（修复前 605042 拦截），正是本修复目标，前端天然受益。
2. **无 605042 特判可移除**：grep 全 `src/` 无任何 605042 处理或「正在确认请稍后重试」重试引导；业务错误统一走 `request.js` 弹 `body.message`，后端返回文案原样展示（交接项 2 的「可移除重试引导」前端本就不存在）。
3. **不会触发新 400**：新 400「请选择人工联系来源」仅在 NOTIFICATION 来源或未显式指定来源时出现；前端永远显式 MANUAL_CONTACT，不会命中。
4. **confirm 确认执行**（2026-08-08 补修后更新）：后端补修（PR #5716/#5719）已让 confirm 在 AMBIGUOUS + 已登记司机确认时**也不再被 605042 拦截**（与登记确认同口径解耦），并修复已冻结 HOLD 组（dispatch_plan_finalized=1）confirm 误判 605020。前端实证：全 `src/` 无任何 605042 业务处理；唯一 605020 引用是 `baselineDifference.spec.js:47` 断言它**不是**基线差异错误（即不特殊处理）；confirm 提交链 `useAssignFlow.js:1095 confirmAssignment` 无错误码特判，错误统一走 `request.js` 弹后端 message。补修属后端行为放宽，前端天然受益，零改动——not_required 维持不变。
