---
schema: "hl-changelog/v2"
ticket: "frontend"
title: "确认执行页「逐日车费」多车只显示一行：按 serviceDate 去重把同日多台车折叠成单行"
consumer: "admin"
change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_owner: "mmg"
frontend_ref: "0538f4b4"
target_release: ""
verified_at: "2026-08-12"
status_note: "后端零改动。已用测试服真实 API 核实（订单 26-0821，看板 GET /admin/fleet/board/orders/2086270141158346754）：activeAssignments 返回 4 段完整执行段（蒙A-K1999 考斯特 08-18~08-20 三天+08-21 一天 ×¥1500，蒙A-T1557 普拉多 08-18~08-20 三天+08-21 一天 ×¥1000），每段 dailyVehicleFees 逐日价齐全，根级 vehicleFeeTotal=\"10000.00\"、vehicleFeeSummaries=[考斯特¥6000, 普拉多¥4000]。根因在前端：AssignModal.vue step4 逐日车费走 mergeContinuityDailyVehicleFees（vehicleFeeAmount.js），该函数按 serviceDate 去重、同日多台车只保留第一台的价——它本是为「同一台车跨段接续」设计的合并，被错用到「多台车并行」场景，把「逐日×逐车」折叠成「逐日单行」，总价也错。修法：确认页逐日车费按「车+服务日」逐行铺开（读 activeAssignments[].dailyVehicleFees，同日多车保留多行并带车牌/车型区分），总价直接用根级 vehicleFeeTotal，不要用按日期去重的聚合。前端 2026-08-12 已修复并交付：vehicleFeeAmount 新增 groupDailyVehicleFeesByVehicle 以车辆身份分组（vehicleId 优先/车牌兜底/皆无入匿名组保持旧语义），同车跨段仍按日合并、多车同日保留多行带车牌·车型小标题（Step4Confirm 多组渲染独立 DailyVehicleFeeList）；sumContinuityVehicleFeeTotal 逐日回退改按车分组防同日多车漏算；confirmationVehicleFeeTotal 多段优先 resolveBoardOrderVehicleFeeTotal(props.order) 取根级 vehicleFeeTotal（特意用 props.order 非 assignmentOrder——confirmHold 下后者已被代表段单段总价覆盖）。fleet/board 35 文件 430 用例全绿，checkpoint 全过。"
updated_at: "2026-08-12"
base: "dev-v3"
---

# 确认执行页「逐日车费」多车只显示一行（前端）

> **页面**：车务管理 → 派单看板 → 订单派车弹窗 → Step4「确认执行」→「逐日车费」卡片 +「最终总车费（只读合计）」
> **后端**：本条**零改动**。下面结论来自测试服真实 API（订单 26-0821）。

---

## 一、现象

多车订单（同一服务日 ≥2 台车）走到确认执行页时：
- 「逐日车费」只显示 1 行（如 `8月18日 收费 ¥1000.00`），其余车/其余天全部丢失；
- 「最终总车费（只读合计）」也错（截图显示 ¥1000，应为 ¥10000）。

用户原话：「这个逐日车费就显示一个车一天的？？？」

## 二、后端已排除（数据完整）

`GET /admin/fleet/board/orders/2086270141158346754` 返回：

- `activeAssignments` = **4 段**（同一台车接续服务被拆成两段，属正常）：
  - 蒙A-K1999 丰田考斯特：`08-18~08-20`（3 天 ×¥1500）+ `08-21`（1 天 ×¥1500）
  - 蒙A-T1557 丰田普拉多：`08-18~08-20`（3 天 ×¥1000）+ `08-21`（1 天 ×¥1000）
- 每段 `dailyVehicleFees[]` 内逐日价齐全（chargeable/calendarPrice/assignmentPrice/source）。
- 根级 `vehicleFeeTotal = "10000.00"`、`vehicleFeeSummaries = [{蒙A-K1999 考斯特 ¥6000},{蒙A-T1557 普拉多 ¥4000}]`。

正确展示应为 **8 行（4 天 × 2 车）**，总价 **¥10000**。

## 三、根因（前端）

`AssignModal.vue`：

```js
// ~1471 确认态执行段来源（这里本身是对的，= 全部 activeAssignments）
const confirmationAssignments = computed(() =>
  activeAssignments.value.length ? activeAssignments.value : [currentAssignment...])

// ~1746 step4 多段时逐日车费走连续性聚合
const confirmationDailyVehicleFees = computed(() => {
  const segments = confirmationAssignments.value
  if (!(step.value === 4 && segments.length > 1)) return dailyVehicleFees.value
  return mergeContinuityDailyVehicleFees(segments)   // ← 问题在这
})
```

`utils/vehicleFeeAmount.js:106`：

```js
export function mergeContinuityDailyVehicleFees(segments = []) {
  const byDate = new Map()
  for (const segment of rows) {
    for (const fee of segment?.dailyVehicleFees ?? []) {
      const date = String(fee?.serviceDate || '').trim()
      if (date && !byDate.has(date)) byDate.set(date, fee)  // ← 按日期去重：同日多台车只保留第一台
    }
  }
  ...
}
```

**`mergeContinuityDailyVehicleFees` 按 `serviceDate` 去重，同一天多台车只保留第一台的价**，把「逐日 × 逐车」折叠成「逐日单行」。总价 `sumContinuityVehicleFeeTotal` 同受此口径影响。这套合并是为「同一台车跨段接续、同日不重叠」设计的，被错误套用到「多台车并行」场景。

## 四、修复建议

确认执行页（Step4）的「逐日车费」**不要**用 `mergeContinuityDailyVehicleFees` 这套按日期去重的单段连续性聚合：

1. **逐日车费列表**：直接遍历 `activeAssignments[]`，把每段的 `dailyVehicleFees[]` 按「车 + 服务日」逐行铺开；同日多车保留多行，并带车牌/车型区分（如 `8月18日 · 蒙A-K1999 考斯特 ¥1500`、`8月18日 · 蒙A-T1557 普拉多 ¥1000`）。
2. **最终总车费**：直接用根级 `order.vehicleFeeTotal`（后端已按结算口径算好，本例 ¥10000），不要前端再聚合。`resolveBoardOrderVehicleFeeTotal`（vehicleFeeAmount.js:139）已有「有 dailyVehiclePlan/vehicleFeeSummaries 时取根级 vehicleFeeTotal」的正确口径，可复用。

> 注意：`mergeContinuityDailyVehicleFees`/`sumContinuityVehicleFeeTotal` 仅在「同车跨段、同日不重叠」前提下安全；多车并行时必须按车区分，不能按日期去重。

## 五、验收

- [ ] 多车订单（同日 ≥2 台车）确认执行页：「逐日车费」展示 服务日数 × 车数 行，每台车每天的价都在，且能区分是哪台车
- [ ] 「最终总车费」= 后端 `vehicleFeeTotal`（本例 ¥10000）
- [ ] 单车订单确认执行页不受影响（回归）
- [ ] 同一台车跨段接续（同日不重叠）场景仍正确合并
