# 订单自动化：产品绑定保险方案+合同配置，支付后自动投保+签约

> 日期：2026-03-20 | 涉及服务：hl-product-service、hl-order-service、hl-insurance-service、hl-contract-service

## 功能说明

### 核心变更

1. **产品新增保险+合同配置字段（必填）**：创建/编辑产品时必须绑定保险方案和合同配置
2. **订单支付后自动投保+签约**：出行人补全后系统自动完成保险和合同，无需管理员手动操作
3. **去掉"待确认订单"步骤**：原6步待办缩减为5步，CONFIRM_ORDER 不再存在
4. **保险手动配置支持按天配置或直接选方案**：管理员可手动按天投保（purchase 接口），也可直接选方案自动投保

### 新的订单内部流程

```
支付成功 → 创建5个待办 → 出行人补全 → 系统自动确认订单
  → 自动投保（按产品绑定的保险方案）  ← INSURANCE待办自动完成
  → 自动签约（按产品绑定的合同配置）  ← CONTRACT待办等签署回调完成
  → 手动配房 (ARRANGE_ROOM)
  → 手动配车 (ARRANGE_VEHICLE)
  → 手动确认清单 (CONFIRM_CHECKLIST)
```

**容错**：自动投保/签约失败时，待办保持 PENDING，管理员可手动处理。管理员也可手动退保/作废合同后重新操作。

---

## 接口变更清单

### 一、产品服务

#### 1. 创建产品（新增必填字段）

```
POST /admin/product
```

**新增请求字段**（所有字段必填，supplementaryClause 除外）：

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| insuranceSchemeId | Long | 是 | 保险方案ID，从保险方案列表获取 |
| contractPlatform | String | 是 | 合同平台：`12301`（全国旅游监管平台）/ `FADADA`（法大大） |
| contractTemplateCode | String | 是 | 合同模板编码，从合同模板列表获取 |
| contractMode | String | 是 | 签约模式：`STANDARD`（电子签约）/ `SYNC`（线下报备） |
| signatoryMode | Integer | 是 | 签署模式：`1`=短信 / `2`=现场 / `3`=线下 |
| agencyCode | String | 是 | 旅行社编码，从保险投保主体列表获取 |
| disputeResolution | Integer | 是 | 争议解决方式：`1`=仲裁 / `2`=诉讼 |
| supplementaryClause | String | 否 | 合同补充条款 |
| transactorName | String | 是 | 经办人姓名 |
| transactorPhone | String | 是 | 经办人电话 |

#### 2. 编辑产品（新增可选字段）

```
PUT /admin/product/{productId}
```

同上 10 个字段，全部可选（不传则不更新）。

#### 3. 统一保存产品（新增字段）

```
POST /admin/product/save
```

同上 10 个字段，创建时必填，更新时可选。

---

### 二、保险服务

#### 已有接口（手动配置保险）

**方式一：按天手动投保**（purchase 接口，按具体的计划+日期段投保）

```
POST /admin/insurance/purchase
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| orderId | Long | 否 | 关联的旅行订单ID |
| planId | Long | 是 | 保险计划ID（从产品计划列表获取） |
| startDate | String | 是 | 保障开始日期 yyyy-MM-dd |
| endDate | String | 是 | 保障结束日期 yyyy-MM-dd |
| insuredPersons | Array | 是 | 被保人列表（至少1人） |
| insuredPersons[].name | String | 是 | 姓名 |
| insuredPersons[].idCardType | String | 否 | 证件类型：`ID_CARD`/`PASSPORT`/`OTHER`，默认ID_CARD |
| insuredPersons[].idCardNo | String | 是 | 证件号 |
| insuredPersons[].birthday | String | 是 | 出生日期 yyyy-MM-dd |
| insuredPersons[].gender | String | 是 | 性别：`MALE`/`FEMALE` |
| entityCode | String | 否 | 投保公司编码，默认使用系统默认主体 |

**方式二：选择保险方案投保**（preview → 确认 → 自动按段投保）

步骤1：预览方案

```
POST /admin/insurance/scheme/preview-apply
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| schemeId | Long | 是 | 保险方案ID |
| orderId | Long | 是 | 订单ID（自动获取出行日期和人数） |

返回各段的日期范围、计划信息、单人保费、总保费、日期间隙警告。

步骤2：确认后逐段调用 purchase 接口（参考方式一）

**保险方案列表**（产品编辑页下拉使用）：

```
GET /admin/insurance/scheme/list
```

返回所有启用的保险方案列表（schemeId + name + description + isOverseas + 段列表）。

**保险产品/计划列表**（按天手动投保时使用）：

```
GET /admin/insurance/products?isOverseas=false
GET /admin/insurance/products/{productId}/plans
```

**保费试算**：

```
POST /admin/insurance/trial-price
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| planId | Long | 是 | 保险计划ID |
| startDate | String | 是 | yyyy-MM-dd |
| endDate | String | 是 | yyyy-MM-dd |
| insuredCount | Integer | 是 | 被保人数 |

---

### 三、合同服务

**合同模板列表**（产品编辑页下拉使用）：

```
GET /admin/contract/templates
```

返回可用的合同模板列表（templateCode + templateName + platform + mode）。

**投保主体/旅行社列表**（产品编辑页下拉使用）：

```
GET /admin/insurance/entities
```

返回投保公司主体列表（code + companyName）。agencyCode 使用此列表中的 code 值。

---

### 四、订单服务

#### 待办定义变更（**破坏性变更**）

| 原 todoType | 原序号 | 新 todoType | 新序号 | 说明 |
|-------------|--------|-------------|--------|------|
| CONFIRM_ORDER | 1 | **已删除** | - | 不再需要手动确认 |
| INSURANCE | 2 | INSURANCE | 1 | 自动完成（系统投保成功后） |
| CONTRACT | 3 | CONTRACT | 2 | 自动完成（合同签署回调后） |
| ARRANGE_ROOM | 4 | ARRANGE_ROOM | 3 | 手动 |
| ARRANGE_VEHICLE | 5 | ARRANGE_VEHICLE | 4 | 手动 |
| CONFIRM_CHECKLIST | 6 | CONFIRM_CHECKLIST | 5 | 手动 |

#### processStatus 变更

| 原流程 | 新流程 |
|--------|--------|
| PENDING_INFO → **PROCESSING** → PENDING_INSURANCE → ... | PENDING_INFO → PENDING_INSURANCE → ... |

`PROCESSING` 状态已删除，`PENDING_INFO` 直接跳到 `PENDING_INSURANCE`。

#### 前端需要注意

1. **待办列表不再有 CONFIRM_ORDER 类型**：前端不要 hardcode "CONFIRM_ORDER" 的判断
2. **工作台待办序号变化**：INSURANCE 现在是 seq=1（原来是2），以此类推
3. **processStatus 没有 PROCESSING 了**：相关状态标签/过滤条件需要去掉
4. **INSURANCE/CONTRACT 待办可能被系统自动完成**：前端展示时注意区分系统完成和手动完成

---

## 页面布局建议

### 产品编辑页 — 新增"保险与合同配置"区域

建议放在产品基本信息之后，行程安排之前：

```
┌─────────────────────────────────────────┐
│ 保险与合同配置                            │
├─────────────────────────────────────────┤
│ 保险方案：[下拉选择] ← GET /admin/insurance/scheme/list │
│                                         │
│ 合同平台：[12301 ▼] / [法大大 ▼]          │
│ 合同模板：[下拉选择] ← GET /admin/contract/templates │
│ 签约模式：[电子签约 ▼] / [线下报备 ▼]     │
│ 签署模式：[短信 ▼] / [现场 ▼] / [线下 ▼]  │
│ 旅行社：  [下拉选择] ← GET /admin/insurance/entities │
│ 争议解决：[仲裁 ▼] / [诉讼 ▼]            │
│ 经办人姓名：[________]                    │
│ 经办人电话：[________]                    │
│ 补充条款：[________________] (可选)       │
└─────────────────────────────────────────┘
```

### 订单详情页 — 保险手动操作

管理员手动配保险时有两种方式：

```
┌─────────────────────────────────────────┐
│ 保险配置                                 │
├─────────────────────────────────────────┤
│ ● 选择保险方案（推荐）                    │
│   [方案下拉] → 预览 → 确认投保            │
│                                         │
│ ○ 按天手动配置                            │
│   保险产品：[下拉]                        │
│   保险计划：[下拉]                        │
│   开始日期：[____] 结束日期：[____]        │
│   [试算保费] [确认投保]                   │
└─────────────────────────────────────────┘
```

---

## 枚举/字典值

| 字段 | 可选值 | 说明 |
|------|--------|------|
| contractPlatform | `12301` / `FADADA` | 合同平台 |
| contractMode | `STANDARD` / `SYNC` | 签约模式 |
| signatoryMode | `1` / `2` / `3` | 1=短信签署, 2=现场签署, 3=线下签署 |
| disputeResolution | `1` / `2` | 1=仲裁, 2=诉讼 |
| todoType | `INSURANCE` / `CONTRACT` / `ARRANGE_ROOM` / `ARRANGE_VEHICLE` / `CONFIRM_CHECKLIST` | 待办类型（CONFIRM_ORDER 已删除） |
| processStatus | `PENDING_INFO` / `PENDING_INSURANCE` / `PENDING_CONTRACT` / `PENDING_ROOM` / `PENDING_VEHICLE` / `PENDING_FINANCE` / `READY` / `INTERNAL_CONFIRMED` | 内部流程状态（PROCESSING 已删除） |
