# 【新增接口+入参变更·管理后台】司机险走保游网——档案页投保/保单/退保 + 保险块字段变更

> 服务:hl-fleet-service(8087) + hl-order-service-v3(8086) | 分支:dev-v3 | PR:#3700 | 已部署测试服并实测通过(2026-06-11)
> 契约出处:FLEET API §3.3/§3.4 保险块 + §13.7 | 业务拍板:司机险由车管在**司机档案页手动点「投保」**出单(非派车自动、非定时);保险提供方走 **order-v3**

## ⚠️ 关键说明(含 2 处破坏性变更)

1. **🔴 破坏性①——司机保存入参 `insurance.perDayRate` 字段删除**(§3.3 新增/§3.4 编辑):perTrip 日费率改走保游网计划费率,不再手填。前端表单请移除该输入项;继续传该字段会被忽略。
2. **🔴 破坏性②——`insurance.type=perTrip` 时 `insurancePlanId` 必填**(返 100001):从「司机可选保险计划下拉」(下方接口 1)选计划。`annual`/`none` 传 null;类型从 perTrip 切走时后端自动清空该字段。
3. 司机详情 §3.2 `insurance` 块新增回显 `insurancePlanId`(perTrip 有值,字符串雪花)。
4. **投保动作会真实调保游网出单、从保游账户真实扣费**——前端联调请只调下拉/保单列表/校验反例,出单正向请约定后用测试计划操作。
5. 计划下拉数据源 = 运营在「保险计划打标」端点把计划标为 `DRIVER`/`BOTH`(接口 5,order-v3 管理端);**新同步计划默认 CUSTOMER,司机端不可见**,须显式打标。

## 1. 司机可选保险计划下拉

`GET /admin/fleet/drivers/insurance/plan-options`

```json
{ "code": 200, "data": [
  { "planId": "2054773833342451714", "planName": "10万计划", "productName": "山河令（太保山东新）", "usageCategory": "DRIVER" }
], "message": "成功" }
```

## 2. 司机险投保(档案页「投保」按钮)

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

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| planId | string(雪花) | 是 | 司机专用计划(接口 1 选取) |
| coverageStartDate / coverageEndDate | string(yyyy-MM-dd) | 是 | 保障起止;**「按赛季」「按年」快捷预填由前端实现**(仍可手改);起>止返 100001 |
| remark | string | 否 | 缺省后端填「司机险投保: {司机姓名}」 |

成功返回保单(被保人证件号已脱敏;金额/雪花均字符串):

```json
{ "code": 200, "data": {
  "insuranceOrderId": "1934567890123456789", "policyNo": "...", "extPolicyNo": "BY-2026-...",
  "extOrderNo": "...", "totalPremium": "88.00", "status": "INSURED", "statusLabel": "已投保",
  "coverageStartDate": "2026-07-01", "coverageEndDate": "2027-06-30",
  "insuredPersons": [ { "name": "周师傅", "idCardNo": "1502**********0017" } ] } }
```

> 异步出单型产品返回 `status=INSURING`(投保中,`extPolicyNo` 暂空),保游回调落定后翻 `INSURED`/`FAILED`,刷新保单列表即可。

## 3. 司机保单列表

`GET /admin/fleet/drivers/{driverId}/insurance/policies` → `data` 为接口 2 同构对象数组(createTime 倒序;无保单返 `[]`)。

## 4. 司机险退保(仅人工误投时用)

`POST /admin/fleet/drivers/{driverId}/insurance/policies/{insuranceOrderId}/cancel`

- 保单不属于该司机 → 100001(越权守卫);仅 `INSURED/INSURING` 可退,否则 540202。
- 业务拍板:**取消派车不退保、换司机投新单旧单到期自然失效、离职拉黑不自动退**——本端点只服务误投撤销。

## 5. 保险计划打标(order-v3 管理端·运营用)

`PUT /v3/admin/insurance/plans/{planId}/usage-category`  body:`{"usageCategory":"DRIVER"}`(白名单 CUSTOMER/DRIVER/BOTH,非法返 540223)。
配套:计划查询出参(`GET /v3/admin/insurance/products/{productId}/plans` 等)已新增 `usageCategory` 字段,可做打标 UI。客人端选计划**不收紧**(维持全量,拍板)。

## 6. 错误码汇总

| code | 触发场景 |
|---|---|
| 100001 | perTrip 缺 insurancePlanId / 保障起>止 / 退保保单不属于该司机 |
| 600205 | 司机不存在 |
| 540031 | 该保险计划未标注为司机可用(选了 CUSTOMER 计划) |
| 540032 | 该司机该保障期已有生效保单(一天只一份生效,含投保中) |
| 540202 | 保单当前状态不可退保 |
| 540223 | 计划使用分类非法(打标端点) |
| 605601 | 保险服务不可用(order-v3 不通,稍后重试) |

### 实测反例示例

```bash
# 选 CUSTOMER 计划投保 → 540031
curl -k -X POST "https://api.test.1814.love:9443/admin/fleet/drivers/{driverId}/insurance/purchase" \
  -H "Authorization: Bearer {token}" -H "Content-Type: application/json" \
  -d '{"planId":"2054773833342451714","coverageStartDate":"2026-07-01","coverageEndDate":"2027-06-30"}'
# => {"code":540031,"message":"该保险计划未标注为司机可用"}

# perTrip 不带 insurancePlanId 建司机 → 100001
# => {"code":100001,"message":"参数非法: 保险类型为 perTrip 时缺少必填子字段: insurancePlanId(保险方案id,选保游网司机专用计划)"}
```
