---
schema: "hl-changelog/v2"
ticket: "5262"
title: "派车逐日车费、只读总价与核单实时接口"
consumer: "admin"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "implemented"
frontend_owner: "hl-ui-pi"
frontend_ref: "mmg/hl-ui@2dfe8ab40f3db446d0a079d7511986a2d7fdce33"
target_release: ""
verified_at: "2026-07-26T16:37:00+08:00"
path_aliases: "changelogs-v2/2026-07/26_5262_派车逐日车费与核单实时接口-修改接口-前端待处理-管理后台.md"
status_note: "后端 PR wx/HL#5266 已合并到 dev-v3（9bfd21de6），Fleet/Order 测试双实例已部署并完成管理端网关与 internal Feign 实测；hl-admin 已在 2dfe8ab40f3db446d0a079d7511986a2d7fdce33 接入逐日车费、只读总价和旧字段移除，verify:changed 通过，尚未发布及页面联调。本契约替代 #5253 的“手工填写每车总价”口径。"
updated_at: "2026-07-26"
base: "dev-v3"
generated: "2026-07-26T16:20:00+08:00"
---

# 派车逐日车费、只读总价与核单实时接口

## 关联

- Issue: [wx/HL#5262](https://git.1814.love:8443/wx/HL/issues/5262)
- 服务：`hl-fleet-service`、`hl-order-service-v3`
- 前端仓库：`mmg/hl-ui`（本文仅交接，不代表已修改前端）
- 替代口径：[#5253 按车辆记录订单总车费并接入核单](./26_5253_按车辆记录订单总车费并接入核单-修改接口-管理后台.md)

## 关键变化

1. 多日派车按服务日保存 assignment，每个槽位 4 天即 4 条每日记录。
2. 价格日历改为提供逐日参考价；车务可覆盖本次派车的某日车费，覆盖值不回写价格日历。
3. `vehicleFeeTotal` 改为只读合计，恒等于收费日 `assignmentPrice` 之和。
4. 创建、批量派车、确认和改派请求继续兼容解析旧总价字段，但只要传值即返回稳定业务错误，不再接受手工总价。
5. 配置车辆不写 Order 核单表；核单后端通过新的 Fleet internal API 实时读取逐日车辆费用。

## 变更接口

| 方法 | 路径 | 变化 |
| --- | --- | --- |
| `POST` | `/admin/fleet/assignments/candidates` | 车辆候选新增逐日车费参考 |
| `POST` | `/admin/fleet/assignments` | 新增 `dailyVehicleFees`；旧 `vehicleFeeTotal` 禁止传值 |
| `POST` | `/admin/fleet/assignments/batch` | 每个最终车辆槽位分别提交 `dailyVehicleFees` |
| `POST` | `/admin/fleet/assignments/:assignmentId/change` | 新派车段提交逐日车费；保留段沿用原逐日快照 |
| `POST` | `/admin/fleet/assignments/:assignmentId/confirm` | 旧总价字段禁止传值；总价由已保存逐日车费只读计算 |
| `GET` | `/admin/fleet/board/orders/:orderId` | 槽位返回 `dailyVehicleFees` 和只读合计 |

## 请求字段

`dailyVehicleFees[]`：

| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `serviceDate` | `LocalDate` | 是 | 本次覆盖的服务日期 |
| `price` | `Decimal` | 是 | 本次派车单日车费，最小 `0.00`，最多 2 位小数 |

规则：

- 未提交覆盖值的收费日使用车型价格日历当天价格。
- 收费日缺少日历价格且未提交覆盖值时，后端拒绝最终派车。
- 覆盖值与日历参考价不一致时提交 `vehicleFeeAdjustmentReason`。
- 免费日期 `assignmentPrice` 固定为 `"0.00"`，不计入总价。
- `vehicleFeeTotal`、`retainedVehicleFeeTotal` 以及对应旧调整原因字段不得再由前端提交。

## 响应字段

候选、派车写响应和看板槽位新增或统一返回 `dailyVehicleFees[]`：

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `serviceDate` | `LocalDate` | 服务日期 |
| `chargeable` | `Boolean` | 是否收取车费 |
| `calendarPrice` | `Decimal/null` | 车型价格日历参考价；缺价时为空 |
| `assignmentPrice` | `Decimal/null` | 本次派车单日车费；收费日必须有值，免费日为 `"0.00"` |
| `source` | `String` | `CALENDAR` / `OVERRIDE` / `FREE` / `MISSING` |
| `calendarPriceMissing` | `Boolean` | 价格日历是否缺价 |

`vehicleFeeTotal` 继续返回，但语义变为只读：

```text
vehicleFeeTotal = sum(dailyVehicleFees[chargeable=true].assignmentPrice)
```

金额字段按字符串消费，雪花 ID 继续按字符串消费。

## 页面展示矩阵

| 区域 | 展示 | 空态 | 状态/颜色 | 守恒规则 |
| --- | --- | --- | --- | --- |
| 收费日期 | 每日显示日历参考价与本次派车价 | 选车前“待计算”；缺价“价格日历缺价” | 参考价中性、覆盖蓝、缺价橙 | 一服务日一条派车记录 |
| 最终总车费 | 只读合计，不渲染金额输入框 | 缺价时“价格不完整” | 正常中性、缺价橙 | 等于全部收费日本次派车价之和 |
| 已结束行程 | 只允许查看逐日价格和总价 | 不适用 | 只读灰 | 前端禁用与后端拒绝一致 |

## 前端处理清单

- [ ] 移除“最终总车费”输入框，改为只读合计。
- [ ] 收费日期逐日展示 `calendarPrice`，并允许编辑当前槽位的 `assignmentPrice`。
- [ ] 仅把修改后的日期组装为 `dailyVehicleFees`，不调用车型价格日历写接口。
- [ ] 使用 `source` 和 `calendarPriceMissing` 展示覆盖与缺价状态。
- [ ] 创建、批量派车、确认和改派请求不再传旧总价字段。
- [ ] 行程结束后禁用逐日车费、槽位和改派入口。

## 验证证据

- OpenAPI/oasdiff：`not_configured`；已完成 Controller/VO 源码比对和 Fleet 接口测试回退证据。
- Spring Cloud Contract：`not_configured`；已完成 Fleet producer、Order Feign consumer 和 shared DTO 测试回退证据。
- Fleet：`mvn -pl hl-fleet-service -am verify` 与 `spotless:check` 通过。
- Order：`mvn -pl hl-order-service-v3 -am verify` 完成，Surefire 零失败并生成可执行 JAR。
- 部署：Fleet `630858f8`、Order `63f9ba60` 成功，8087/8187 与 8086/8186 双实例健康。
- 网关：管理端订单详情返回 4 条逐日车费及约定的 6 个逐日字段；internal Feign 正向响应严格为顶层 5 个字段、item 12 个字段。
- `frontend_status`：`pending`；真实领取后再迁移为 `claimed`。
