---
schema: "hl-changelog/v1"
ticket: "5141"
title: "车务派单司机保险类型与行程保障状态"
consumer: "admin"
backend: "verified"
gateway: "verified"
frontend: "pending"
base: "dev-v3"
generated: "2026-07-22T14:07:00+08:00"
---

# 【修改接口·前端待处理·管理后台】车务派单司机保险类型与行程保障状态

## 目标前端

- 端类型：管理后台（Web）
- 目标仓库：`mmg/hl-ui`
- 仓库地址：<https://git.1814.love:8443/mmg/hl-ui.git>
- 联调/验收环境：<http://192.168.100.160:9527>
- 小程序：无需处理

## 变更接口

`POST /admin/fleet/assignments/candidates` 的 `data.drivers.records[]` 新增司机保险字段。数据直接来自司机档案，并按本次请求的 `startDate/endDate` 判断全年保险是否完整覆盖行程。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `insuranceType` | String | `annual` 全年保险、`perTrip` 按行程投保、`none` 无保险 |
| `insuranceTypeLabel` | String | `全年保险`、`按行程投保`、`无保险` |
| `insuranceAnnualStart` | Date/null | 全年保险起始日；非 `annual` 为空 |
| `insuranceAnnualEnd` | Date/null | 全年保险到期日；非 `annual` 为空 |
| `insuranceCoverageStatus` | String | 本次行程保障状态，枚举见下表 |
| `insuranceCoverageMessage` | String | 后端生成的中文提示，可直接展示 |
| `insuranceCovered` | Boolean | 仅全年保险完整覆盖本次服务日期时为 `true` |

## 保障状态

| `insuranceCoverageStatus` | `insuranceCoverageMessage` | 含义 |
| --- | --- | --- |
| `ANNUAL_COVERED` | 全年保险已覆盖 | 年保起止日完整覆盖本次行程 |
| `ANNUAL_NOT_COVERED` | 全年保险不覆盖本行程 | 年保缺日期、未生效、已过期或仅覆盖部分行程 |
| `PER_TRIP_REQUIRED` | 待按行程投保 | 司机配置为按行程投保，候选阶段尚不代表已经出单 |
| `UNINSURED` | 无保险 | 司机档案明确为无保险 |
| `UNKNOWN` | 保险状态未知 | 存量异常值兜底，不能当作已保障 |

## 前端展示规则

- 在司机卡片姓名或驾龄附近展示保险徽标，文案优先使用 `insuranceCoverageMessage`。
- `ANNUAL_COVERED` 可用绿色；`PER_TRIP_REQUIRED` 用橙色；`ANNUAL_NOT_COVERED/UNINSURED/UNKNOWN` 用红色或醒目警示色。
- 全年保险可在悬浮提示或次级文案展示 `insuranceAnnualStart ~ insuranceAnnualEnd`。
- 保险状态只用于车务判断和提示，不影响司机候选的 `available`，不得因为未投保或待按行程投保禁用司机。
- 不要只根据 `insuranceType=annual` 显示“已保障”，必须以 `insuranceCoverageStatus` 或 `insuranceCovered` 为准。

## 前端处理清单

- [ ] 司机候选卡片展示保险保障徽标。
- [ ] 区分全年已覆盖、全年未覆盖、待按行程投保、无保险及未知状态。
- [ ] 年保可查看保障起止日，且不把过期或部分覆盖年保展示为已保障。
- [ ] 保险状态不改变司机可选性，候选禁用仍只依据 `available === false`。

## 编辑司机：无保单时直接线上投保

司机编辑抽屉选择“全年保险”后，如果“关联保游网保单”没有可选数据，不应只展示空下拉。需要在当前抽屉提供“立即投保”入口，复用保险订单页“投保下单 → 司机”的线上真实投保逻辑。

目标文件：

- `src/views/fleet/drivers/components/DriverEditModal.vue`
- 可复用 `src/views/insurance/orders/index.vue` 中的司机投保表单和 `src/api/fleet/drivers.js` 的 `purchaseDriverInsurance`。

交互要求：

1. 无可关联保单时显示“暂无可关联保单”，并提供“立即投保”按钮。
2. 点击后填写保险计划、保障开始、保障结束和可选备注；表单行为与保险订单页的司机投保一致。
3. 用户点击“确认投保”后才发起真实线上投保；仅切换到“全年保险”不得自动出单。
4. 投保请求必须传 `bindAnnual: true`。受理成功后，后端会自动把新保单绑定为司机档案的全年保险。
5. 成功后重新加载司机保单列表和司机详情，回显新 `insuranceOrderId`、保单状态及保障起止；`INSURING` 时显示“出单中”，不能要求用户重复投保。
6. 保留“手工录入线下保单”作为独立兜底路径，文案和操作不得与线上投保混用。

调用示例：

```http
POST /admin/fleet/drivers/{driverId}/insurance/purchase
```

```json
{
  "planId": "2080000000000000001",
  "coverageStartDate": "2026-07-23",
  "coverageEndDate": "2027-07-22",
  "bindAnnual": true,
  "remark": "司机全年保险"
}
```

`driverId`、`planId` 和响应中的 `insuranceOrderId` 均为雪花 ID，前端必须按字符串透传。保险计划继续使用 `GET /admin/fleet/drivers/insurance/plan-options`。

异常处理沿用保险订单页：全局展示后端错误文案；若返回 `600206`，表示可能已经出单但档案绑定失败，必须关闭投保弹窗并刷新保单列表，提示用户勿重复投保。

追加验收项：

- [ ] 编辑司机选择全年保险且无已有保单时，可在当前抽屉发起线上真实投保。
- [ ] 请求携带 `bindAnnual: true`，投保受理后司机档案自动回显全年保险，无需先保存再关联。
- [ ] 出单中、已承保和 `600206` 场景均不会诱导用户重复投保。
- [ ] 线上投保与手工录入线下保单入口、文案和数据来源清晰分离。

## 验证证据

- 后端 PR [wx/HL#5143](https://git.1814.love:8443/wx/HL/pulls/5143) 已合并到 `dev-v3`。
- 派单候选与司机域定向测试共 148 项通过。
- fleet `spotless:check` 与 `mvn -pl hl-fleet-service -am verify` 通过。
- 测试网关真实返回 21 名司机，覆盖全年已覆盖、全年未覆盖、待按行程投保和无保险四类结果；响应与测试库司机保险档案逐条一致，19 名警示状态司机仍可选择。

> 本文是前端接入通知，不代表已修改或发布 `mmg/hl-ui`。
