# 合同方案 + 产品合同配置改版 + 支付前出行人校验

## 功能说明

### 1. 合同方案管理（新增）
合同配置改为"合同方案"模式（与保险方案一致），产品只需选择一个合同方案ID。

### 2. 产品合同配置改版（破坏性变更）
产品上原来的 9 个合同字段（contractPlatform, contractTemplateCode, contractMode, signatoryMode, agencyCode, disputeResolution, supplementaryClause, transactorName, transactorPhone）已全部删除，替换为单个 `contractSchemeId` 字段。

### 3. 支付前出行人校验规则变更
- **预约产品**（isBooking=true）：定金支付不要求出行人，全款/尾款要求出行人齐全
- **非预约产品**（isBooking=false）：所有支付类型都要求出行人齐全

### 4. HTTP 200 统一化
所有接口只要请求能到达服务器，HTTP状态码一律返回200，业务错误在响应体Result中返回。

---

## 合同方案接口清单

### 查询启用的合同方案列表（下拉选择用）
- **GET** `/admin/contract/scheme/list`
- **响应**：`Result<List<ContractSchemeVO>>`

### 查询全部合同方案列表（管理页面用）
- **GET** `/admin/contract/scheme/list-all`
- **响应**：`Result<List<ContractSchemeVO>>`

### 获取合同方案详情
- **GET** `/admin/contract/scheme/{schemeId}`
- **响应**：`Result<ContractSchemeVO>`

### 创建合同方案
- **POST** `/admin/contract/scheme`
- **请求体**：`ContractSchemeRequest`
- **响应**：`Result<ContractSchemeVO>`

### 更新合同方案
- **PUT** `/admin/contract/scheme/{schemeId}`
- **请求体**：`ContractSchemeRequest`
- **响应**：`Result<ContractSchemeVO>`

### 切换方案启用/停用状态
- **PUT** `/admin/contract/scheme/{schemeId}/toggle-status`
- **响应**：`Result<ContractSchemeVO>`

### 删除合同方案
- **DELETE** `/admin/contract/scheme/{schemeId}`
- **响应**：`Result<Void>`

---

## ContractSchemeRequest 参数

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | String | 是 | 方案名称，如"标准国内电子签约方案" |
| description | String | 否 | 方案描述 |
| contractPlatform | String | 是 | 合同平台：`12301`（全国旅游监管平台）/ `FADADA`（法大大） |
| contractTemplateCode | String | 是 | 合同模板编码，如 `TOURAGE_STANDARD` |
| contractMode | String | 是 | 签约模式：`STANDARD`（电子签约）/ `SYNC`（线下报备） |
| signatoryMode | Integer | 是 | 签署模式：`1`=短信签署 `2`=现场签署 `3`=线下签署 |
| agencyCode | String | 是 | 旅行社编码 |
| disputeResolution | Integer | 是 | 争议解决方式：`1`=仲裁 `2`=诉讼 |
| supplementaryClause | String | 否 | 补充条款 |
| transactorName | String | 是 | 经办人姓名 |
| transactorPhone | String | 是 | 经办人电话 |
| sortOrder | Integer | 否 | 排序（越小越靠前） |

## ContractSchemeVO 响应

| 字段 | 类型 | 说明 |
|------|------|------|
| schemeId | String | 方案ID |
| name | String | 方案名称 |
| description | String | 方案描述 |
| 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 | 经办人电话 |
| sortOrder | Integer | 排序 |
| status | String | 状态：ACTIVE/INACTIVE |
| createTime | DateTime | 创建时间 |

---

## 产品接口变更（破坏性变更）

### 产品创建/更新/保存接口

**删除的字段**（以下字段不再使用）：
- ~~contractPlatform~~
- ~~contractTemplateCode~~
- ~~contractMode~~
- ~~signatoryMode~~
- ~~agencyCode~~
- ~~disputeResolution~~
- ~~supplementaryClause~~
- ~~transactorName~~
- ~~transactorPhone~~

**新增的字段**：

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| contractSchemeId | Long | 是（创建时） | 合同方案ID，从 `/admin/contract/scheme/list` 获取 |

### 产品详情接口

**响应变更**：
- 删除 9 个合同字段
- 新增 `contractSchemeId`（String类型）

---

## 页面布局建议

### 合同方案管理页面
路径建议：系统管理 → 合同方案管理（类似保险方案管理）
- 列表页：方案名称、合同平台、签约模式、旅行社、状态、操作（编辑/启停/删除）
- 新建/编辑弹窗：ContractSchemeRequest 的所有字段

### 产品编辑页面 — 合同配置区域改版

**原来**（9个表单项）：
```
合同平台 *    [12301] [法大大]
合同模板 *    [下拉选择]
签约模式 *    [电子签约] [线下报备]
签署模式 *    [短信签署] [现场签署] [线下签署]
旅行社 *      [下拉选择]
争议解决方式 * [仲裁] [诉讼]
补充条款       [文本框]
经办人姓名 *  [文本框]
经办人电话 *  [文本框]
```

**现在**（1个下拉选择）：
```
合同方案 *    [请选择合同方案 ▼]
```
下拉数据来源：`GET /admin/contract/scheme/list`（返回启用的方案列表）

---

## 调用示例

### 创建合同方案
```json
POST /admin/contract/scheme
{
  "name": "标准国内电子签约方案",
  "contractPlatform": "12301",
  "contractTemplateCode": "TOURAGE_STANDARD",
  "contractMode": "STANDARD",
  "signatoryMode": 1,
  "agencyCode": "L-NMG-100001",
  "disputeResolution": 1,
  "transactorName": "张三",
  "transactorPhone": "13800138000",
  "sortOrder": 0
}
```

### 产品创建（使用合同方案ID）
```json
POST /admin/product
{
  "name": "冰雪3.0南线",
  "productType": "CORE",
  "insuranceSchemeId": 123456789,
  "contractSchemeId": 987654321,
  ...
}
```
