# 接口变更记录 — 2026-03-25 12:40

> **提交** `6d105cb` · **作者** wx · **时间** 2026-03-25 12:40:43 +0800
>
> feat: 保险选择性投保 + 出行人线下投保备注

## 变更总览

- **保险服务**
  - AdminInsurance (+4)
  - InternalInsurance (+1)

---

## 保险服务

### AdminInsurance

> 📖 **接口文档**: [http://192.168.100.236:8098/doc.html](http://192.168.100.236:8098/doc.html) → 标签 **「保险管理」**

### 🆕 `POST` /admin/insurance/order/{orderId}/selective-purchase — 选择部分出行人投保

> 自动投保失败后，管理员可选择部分出行人手动在线投保（如排除不满1岁婴儿）。

**参数**

  - `{orderId}` (`Long`) — 路径参数：旅行订单ID

**响应** `Result<AutoPurchaseResultVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `success` | `boolean` | 是否全部成功 |
| `purchasedCount` | `int` | 成功投保段数 |
| `failedCount` | `int` | 失败段数 |
| `failureReason` | `String` | 失败原因（部分失败或全部失败时返回第一个错误） |

### 🆕 `POST` /admin/insurance/order/{orderId}/traveler-note — 添加出行人保险备注

> 为不能在线投保的出行人添加备注（如不满1岁婴儿标记为线下投保）。

**参数**

  - `{orderId}` (`Long`) — 路径参数：旅行订单ID

### 🆕 `DELETE` /admin/insurance/order/{orderId}/traveler-note/{noteId} — 删除出行人保险备注

**参数**

  - `{orderId}` (`Long`) — 路径参数：旅行订单ID
  - `{noteId}` (`Long`) — 路径参数：备注ID

**响应** `Result<Void>`

### 🆕 `GET` /admin/insurance/order/{orderId}/traveler-coverage — 查询出行人保险覆盖状态

> 返回订单每个出行人的保险状态：

**参数**

  - `{orderId}` (`Long`) — 路径参数：旅行订单ID

### InternalInsurance

> 📖 **接口文档**: [http://192.168.100.236:8098/doc.html](http://192.168.100.236:8098/doc.html) → 标签 **「【内部接口】保险（Feign调用）」**

### 🆕 `GET` /internal/insurance/fully-covered/{orderId} — 检查保险是否全覆盖-含线下备注(内部调用)

> 考虑在线保单+线下投保备注，判断是否所有出行人都有保险覆盖

**参数**

  - `{orderId}` (`Long`) — 路径参数：旅行订单ID
  - `travelerCount` (`int`) — 查询参数：出行人数

**响应** `Result<Boolean>`

---

## 📦 其他数据对象变更

> 以下变更未直接关联到本次接口变更，但可能影响现有接口的请求/响应

### 保险服务

#### 🆕 SelectivePurchaseRequest

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `schemeId` | `Long` | 保险方案ID |
| `travelerIds` | `List<Long>` | 要投保的出行人ID列表 |

#### 🆕 TravelerCoverageVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `travelerId` | `String` | 出行人ID |
| `name` | `String` | 姓名 |
| `birthday` | `LocalDate` | 出生日期 |
| `age` | `Integer` | 年龄 |
| `travelerType` | `String` | 出行人类型：ADULT/CHILD |
| `coverageStatus` | `String` | 保险覆盖状态：ONLINE_INSURED=在线已投保, OFFLINE_NOTED=线下已备注, NOT_COVERED=未投保 |
| `policies` | `List<Map<String, Object>>` | 在线保单列表（coverageStatus=ONLINE_INSURED时有值） |
| `noteId` | `String` | 线下备注ID（coverageStatus=OFFLINE_NOTED时有值） |
| `noteType` | `String` | 线下备注类型 |
| `noteRemark` | `String` | 线下备注说明（coverageStatus=OFFLINE_NOTED时有值） |

#### 🆕 TravelerNoteRequest

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `travelerId` | `Long` | 出行人ID |
| `travelerName` | `String` | 出行人姓名 |
| `noteType` | `String` | 备注类型：OFFLINE=线下投保, SKIP=跳过, OTHER=其他 |
| `remark` | `String` | 备注说明 |

<details>
<summary>📁 全部变更文件 (点击展开)</summary>

```
M	hl-insurance-service/src/main/java/com/hulalv/insurance/controller/AdminInsuranceController.java
M	hl-insurance-service/src/main/java/com/hulalv/insurance/controller/InternalInsuranceController.java
A	hl-insurance-service/src/main/java/com/hulalv/insurance/dto/SelectivePurchaseRequest.java
A	hl-insurance-service/src/main/java/com/hulalv/insurance/dto/TravelerNoteRequest.java
A	hl-insurance-service/src/main/java/com/hulalv/insurance/entity/InsuranceTravelerNote.java
A	hl-insurance-service/src/main/java/com/hulalv/insurance/mapper/InsuranceTravelerNoteMapper.java
M	hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceOrderService.java
A	hl-insurance-service/src/main/java/com/hulalv/insurance/vo/TravelerCoverageVO.java
A	sql/insurance_traveler_note.sql
```
</details>