# 【后端核实回执·管理后台】保单按钮两处收敛 + 车辆导入弹窗映射——前端 SYNC-20260612-10 全部确认，无接口变更

> 服务:hl-order-service-v3(8086/8186) + hl-fleet-service(8087) | 对应前端:SYNC-20260612-10(commit f642b064) | 后端无代码改动,本文是核实回执(2026-06-12)
> 背景:前端回报「下载/重传保单」真实落点在保险订单台账页(非司机抽屉),已两处按 source 收敛;并修车辆导入结果弹窗字段映射;质疑 blob 归因。后端逐项核实如下。

## ⚠️ 关键说明

1. **前端两处收敛方案后端全部确认正确,双方版本在测试服已对齐**,前端无需再动。
2. 此前 changelog 12_3765 写按钮在「详情抽屉」系沿用最初反馈原话,实际落点在台账页——契约指引(按 `source` 收敛)两处通用,结论不变。
3. blob/InvalidStateError 议题双方归零关闭(见 §3)。

## 1. 保单按钮收敛——后端契约逐项核实(均实测)

| 前端收敛点 | 后端支撑 | 实测结论 |
|---|---|---|
| 台账页 MANUAL 行隐藏「下载/重传保单」 | `GET /v3/admin/insurance/list` 列表行 VO 自带 `source`(BAOYOU/MANUAL) | 测试服实测每行 source 非 null;直调下载/重传返 **540226** 兜底 |
| 台账页 MANUAL 行隐藏「退保」(上批已收敛) | 管理端退保接口拦 MANUAL | 返 **540224**「手工录入的年保单不支持退保」 |
| 司机抽屉 MANUAL 行隐藏「退保」+ 加「手工录入」标识 | `GET /admin/fleet/drivers/{driverId}/insurance/policies` 每行 `source` 字段即为此用 | 与 540224 守卫严丝合缝 |

台账列表实测示例(`GET /v3/admin/insurance/list?page=1&pageSize=10`):

```json
{
  "insuranceOrderId": "2065360048397193217",
  "source": "MANUAL",        // 每行均返,非 null
  "bizType": "DRIVER",
  "status": "CANCELLED"      // 该批 CANCELLED 是后端 E2E 清场数据,属正常
}
```

注意:**判断按钮显隐请只认 `source`,勿用 `bizType` 当代理**——司机行程险走保游网出单时 `bizType=DRIVER` 但 `source=BAOYOU`,有电子保单,下载/重传按钮应保留。

## 2. 车辆导入结果弹窗映射——前端重写目标字段与后端 VO 完全一致

后端 `VehicleImportRespVO` 真实字段(核实于当前 dev-v3):

| 字段 | 类型 | 含义 |
|---|---|---|
| `totalRows` | int | 数据总行数 |
| `insertedCount` | int | 新增成功数 |
| `updatedCount` | int | 更新成功数 |
| `errorCount` | int | 失败行数 |
| `errors` | array | 失败明细(行号+原因) |
| `warnedCount` | int | 警告行数 |
| `warnings` | array | 警告明细 |

前端旧映射(failed/errorRows/success/total)确实全部不存在于后端 VO,「导入成功 0 条」怪象由此而来,重写后正确。司机导入 `DriverImportRespVO` 字段结构同族,如需对照可看测试服 doc.html。

## 3. blob/InvalidStateError 议题关闭

- 前端全仓核查无 `responseType:'blob'` 配置;后端侧该归因同样无代码对应物——此前那条「前端Bug_车辆批量导入responseType-blob」changelog 的归因有误,以本回执为准。
- 真实病因即 §2 的弹窗字段映射 bug,已修。
- 若真机后续仍复现该 console 报错,排查方向是测试服部署的前端构建来源(是否旧构建残留),与双方当前代码无关。
