# 订单出行人 MP 端 CRUD 接口新增 — 2026-04-20

> **服务** hl-order-service-v2（端口 8094）· **类型** feat · **关联** Issue #1020 / PR #1022
> **前端调用路径**: 网关(8080) → hl-mp-service(8085) → hl-order-service-v2(8094)
> **前端实际请求前缀**: `/mp/order/{orderId}/traveler`（4 个接口）

---

## 一、能力概述

给小程序端补齐**订单出行人** CRUD 能力，对应原型 **L4xYN 乘坐人员勾选列表**、**Bf9jC 添加人员弹窗**。

| 原型节点 | 功能 | 主要接口 |
| --- | --- | --- |
| L4xYN pplList | 乘坐人员勾选列表 | `GET /mp/order/{orderId}/traveler` |
| Bf9jC | 添加人员弹窗 | `POST /mp/order/{orderId}/traveler` |
| Bf9jC（编辑） | 修改出行人 | `PUT /mp/order/{orderId}/traveler/{travelerId}` |
| Bf9jC（删除） | 删除出行人 | `DELETE /mp/order/{orderId}/traveler/{travelerId}` |

**注意区分两套"出行人"模型**：

| 维度 | 路径 | 说明 |
| --- | --- | --- |
| 用户常用出行人 | `/mp/user/traveler/*` | user-service 管，已有 |
| **订单出行人**（本次新增） | `/mp/order/{orderId}/traveler/*` | order-v2 的 `order_traveler` 表 |

---

## 二、接口清单

鉴权：user token（登录态）

| 方法 | 路径 | 用途 |
| --- | --- | --- |
| GET | `/mp/order/{orderId}/traveler` | 查某订单的出行人列表 |
| POST | `/mp/order/{orderId}/traveler` | 新增出行人到某订单 |
| PUT | `/mp/order/{orderId}/traveler/{travelerId}` | 修改出行人（字段为 null 保持原值不变） |
| DELETE | `/mp/order/{orderId}/traveler/{travelerId}` | 删除出行人 |

---

## 三、请求体（`MpOrderTravelerSaveReqVO`）

```jsonc
{
  "name":             "张三",               // 必填，≤50 字
  "idCardType":       "ID_CARD",            // 字典 id_card_type
  "idCardNo":         "110101199001011234", // 必填
  "phone":            "13800000000",
  "gender":           "1",                  // 1=男 2=女
  "birthday":         "1990-01-01",
  "travelerType":     "ADULT",              // 默认 ADULT，字典 traveler_type
  "nationality":      "中国",
  "emergencyContact": "李四",
  "emergencyPhone":   "13900000000",
  "email":            "zhangsan@example.com"
}
```

**字典取值**：
- `idCardType`: `ID_CARD` 身份证 / `PASSPORT` 护照 / `HK_MACAO_PASS` 港澳通行证 / `TAIWAN_PASS` 台湾通行证 / `OTHER` 其他
- `travelerType`: `ADULT` 成人 / `CHILD` 儿童 / `YOUNG_CHILD` 幼儿 / `BABY` 婴儿

**后端自动处理**：
- 身份证（18 位）自动解析 `birthday` + `gender`（前端可不传）
- 同订单证件号重复检查（重复抛业务错误）

---

## 四、响应体

### 列表 `GET` 响应

```jsonc
{
  "code": 200,
  "data": [
    {
      "travelerId":       10001,             // Long，注：未强制 String（现有约定）
      "name":             "张三",
      "travelerType":     "ADULT",
      "travelerTypeLabel":"成人",
      "idCardType":       "ID_CARD",
      "idCardTypeLabel":  "身份证",
      "idCardNo":         "110101199001011234",
      "gender":           "1",
      "birthday":         "1990-01-01",
      "phone":            "13800000000",
      "nationality":      "中国",
      "emergencyContact": "李四",
      "emergencyPhone":   "13900000000",
      "email":            "zhangsan@example.com"
    }
  ]
}
```

### 新增/修改返回

返回单个对象（同列表元素结构）。

### 删除返回

```jsonc
{ "code": 200, "data": null }
```

### 约定

- 所有枚举字段都配 `xxxLabel` 中文标签
- 空数据返回 `[]`，不是 `null`
- 时间格式统一 `yyyy-MM-dd`（出生日期）/ `yyyy-MM-dd HH:mm:ss`（含时间字段）

---

## 五、前端接入建议

**L4xYN 乘坐人员勾选列表**：
1. 打开页面 → `GET /mp/order/{orderId}/traveler` 拉取订单已有出行人
2. 用户勾选 → 把 travelerId 传给**到达信息**接口的 `travelerIds` 字段

**Bf9jC 添加人员弹窗**：
1. 可选：先调 `GET /mp/user/traveler`（已有）让用户从常用库选一个 → 填到表单里
2. 用户补全/修改字段（含 OCR 扫描身份证填入，OCR 用小程序原生插件前端做）
3. 提交 `POST /mp/order/{orderId}/traveler`

---

## 六、关联

- Issue: [wx/HL#1020](https://git.1814.love:8443/wx/HL/issues/1020)
- PR: [wx/HL#1022](https://git.1814.love:8443/wx/HL/pulls/1022)（已合并到 dev）
