---
schema: "hl-changelog/v2"
ticket: "5899"
title: "修复改订单人数后车务未重走配车——换版后自动重新盖章抵消作废定稿"
consumer: "admin"
change_type: "修复"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "not_required"
frontend_owner: "mmg"
frontend_ref: ""
target_release: ""
verified_at: "2026-08-12"
status_note: "后端已修复并部署测试服，API 实测通过。修改订单人数/车型等（服务日期窗不变）的换版后，车务看板正确回到「待派车」，订单侧停留在「待配」，不再被自动拉回「配车完成」；车务重新确认后订单正常推进。改行程天数/改出发日期不受影响。"
updated_at: "2026-08-12"
base: "dev-v3"
---

# 修复：改订单人数后车务未重走配车——换版后自动重新盖章抵消作废定稿（#5899）

> **服务**: hl-fleet-service
> **PR**: #5903（已合并 dev-v3 并部署测试服）
> **日期**: 2026-08-12
> **背景**: 订单修改人数后，订单侧短暂显示「待配」又立刻回到「配车已完成」，车务侧看板没有重走配车流程，仍保持「配车完成」，待派车 tab 无此单。

---

## 修复内容（对前端透明，无接口契约变化）

**根因**：`AssignmentService.expandFromRequirementInTransaction` 换版时同事务内先后执行两个互相矛盾的动作：

1. `invalidateDispatchPlanForMigratedRows`（#5851）换版平移后作废定稿——清 `dispatch_plan_finalized`/`dispatch_plan_generation`，意图让车务重走配车。
2. `publishDailySnapshotIfComplete`（#5810）紧接着发现「行都 assigned 且无 finalized」→ 走 `markDispatchPlanGeneration` **自动重新盖章**（finalized=1、归属=新需求）→ 发 `DailyVehicleSnapshotChangedEvent.finalPlan` → 订单被拉回 `VEHICLE_DONE`。

**修复**：`publishDailySnapshotIfComplete` 检测到归属旧需求的陈旧定稿行时（`hasStaleFinalizedPlanRows` 命中）直接返回，不自动盖章/发 finalPlan。车务 confirm 时归属被重新盖成当前需求，守卫自然放行，闭环保留。

**影响范围**：仅服务日期窗不变的换版（改人数/车型/座位）。改行程天数/改出发日期时日期校验本就返回 false，不误触发。

## 行为变化

| 场景 | 旧 | 新 |
|---|---|---|
| 改人数后（服务窗不变） | ❌ 看板停留「配车完成」，订单误拉回 DONE，车务没机会重走配车 | ✅ 看板回到「待派车」，订单停留「待配」，等车务重新确认 |
| 车务重新确认 | ✅ 正常盖章并推进订单 | ✅ 不变（守卫放行） |
| 改行程天数/改出发日期 | ✅ 正常 | ✅ 不变 |

## 验证证据（测试服 API 实测，订单 2086270141158346754）

修改订单人数（10→11）后实测：

- 需求换版 v4，`status=PENDING`（不再自动拉回 DONE）
- fleet 派单行 `dispatch_plan_finalized=0`、`plan_finalized_requirement_id` 保留旧 v3（归属证据）
- 车务看板卡片：`finalizedByFleet=False`、`staleFinalizedPlan=True` → 「待派车」tab
- 订单侧 VEHICLE：`PROCESSING 待配 | 配车待配`（不再误显示「配车已完成」）

后端 PR #5903 已合并 dev-v3 并部署测试服，fleet-service 健康。前端无改动，无需联调。

