# 🐛 错误文案修复：到达/返程批次校验提示不再混淆

**更新时间**: 2026-05-08 17:45
**PR**: #1894 / Issue #1893
**服务**: hl-mp-service (端口 8085)

---

## 变了什么（前端视角）

`POST /mp/order/{orderId}/arrival/batch` 提交到达信息（`direction=ARRIVAL`）时，
若某批次 `travelerIds` 为空，原来错误 toast 错误地显示「**返程**信息」。

本次修复让 message 文案与实际 direction 一致。**错误码 code 不变（620001 / 620002）**，
只是 message 字符串更准确——前端只要是直接 toast 展示后端 message 的写法无需任何改动。

### 文案对照表

| 场景 | 旧文案 | 新文案 |
|------|--------|--------|
| body 空（`null` 或 `[]`） | 请添加至少一批**返程**信息 | 请添加至少一批**批次** |
| `direction=ARRIVAL`，第 N 批 travelerIds 空 | 第 N 批**返程**信息：请选择至少一位乘坐人员 | 第 N 批**到达**：请选择至少一位乘坐人员 |
| `direction=DEPARTURE`，第 N 批 travelerIds 空 | 第 N 批**返程**信息：请选择至少一位乘坐人员 | 第 N 批**返程**：请选择至少一位乘坐人员（行为不变，字符串更简洁） |
| direction 缺失 / 未知值，第 N 批 travelerIds 空 | 第 N 批**返程**信息：请选择至少一位乘坐人员 | 第 N 批**批次**：请选择至少一位乘坐人员（兜底） |

---

## 前端要改的地方

**正常情况（直接 toast 后端 message）**：无需改动。

**需要检查的情况**：如果前端代码对错误 message 做了**字符串匹配/包含判断**（例如用来走不同分支逻辑），请检查并更新：

- 若有类似 `if (msg.includes('返程信息'))` 的判断 → 原匹配「请添加至少一批返程信息」或「第 N 批返程信息」的逻辑**可能失效**，需改为不依赖具体文本，或更新匹配目标
- 若有类似 `msg === '请添加至少一批返程信息'` 的精确匹配 → 必须更新

常规弹 toast 代码无需任何修改。

---

## 涉及的接口

| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---|------|------|------|----------|------|
| 1 | 全量替换批次信息 | POST | `/mp/order/{orderId}/arrival/batch` | 🐛 错误文案修复 | 仅 message 文案变更，code / 请求体 / 响应结构零变化 |

---

## 接口详细定义

### POST `/mp/order/{orderId}/arrival/batch` — 全量替换批次信息

- **使用场景**：小程序「填写到达/返程信息」页，用户点击「确认提交」

- **路径参数**：

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| orderId | Long | 是 | 订单 ID |

- **请求参数（Query）**：

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| direction | String | 是 | `ARRIVAL`（到达）/ `DEPARTURE`（返程） |

- **请求体（JSON Array）**：

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| transportType | String | 是 | 交通方式：`SELF_DRIVE` / `FLIGHT` / `TRAIN` |
| travelerIds | Array\<Long\> | 是 | 出行人 ID 列表，不能为空数组 |
| flightNumber | String | 否 | 航班号（transportType=FLIGHT 时填写） |
| trainNumber | String | 否 | 车次号（transportType=TRAIN 时填写） |
| arrivalTime | String | 否 | 到达/出发时间，格式 `yyyy-MM-dd HH:mm` |

- **请求示例（到达，两批）**：

```json
[
  {
    "transportType": "FLIGHT",
    "travelerIds": [1001, 1002],
    "flightNumber": "MU5100",
    "arrivalTime": "2026-06-01 14:30"
  },
  {
    "transportType": "TRAIN",
    "travelerIds": [1003],
    "trainNumber": "G1234",
    "arrivalTime": "2026-06-01 18:00"
  }
]
```

- **响应（成功）**：

```json
{
  "code": 200,
  "msg": "success",
  "data": null
}
```

- **响应（失败示例）**：

```json
{
  "code": 620002,
  "msg": "第 1 批到达：请选择至少一位乘坐人员",
  "data": null
}
```

---

## 错误码 / 校验规则

| Code | 触发条件 | direction=ARRIVAL message | direction=DEPARTURE message |
|------|----------|---------------------------|-----------------------------|
| `620001` | body 为 null 或空数组 | 请添加至少一批批次 | 请添加至少一批批次 |
| `620002` | 第 N 批 `travelerIds` 为 null 或空数组 | 第 N 批到达：请选择至少一位乘坐人员 | 第 N 批返程：请选择至少一位乘坐人员 |

> 说明：620001 在 body 空时拿不到 direction，统一用「批次」兜底词；620002 按请求中的 direction 动态拼词。

### 边界行为

| 输入 | 结果 |
|------|------|
| body=null | 620001 |
| body=[] | 620001 |
| body=[{travelerIds:null}]，direction=ARRIVAL | 620002 "第 1 批到达：请选择至少一位乘坐人员" |
| body=[{travelerIds:[]}]，direction=DEPARTURE | 620002 "第 1 批返程：请选择至少一位乘坐人员" |
| body=[{travelerIds:[1001]}, {travelerIds:[]}]，direction=ARRIVAL | 620002 "第 2 批到达：请选择至少一位乘坐人员" |
| body=[{travelerIds:[1001]}, {travelerIds:[1002]}] | 200，走 Feign 正常处理 |

---

## 兼容性说明

- **向后兼容**：是。请求结构（字段名/类型/必填）零变化
- **错误码 code**：不变（620001 / 620002）
- **是否需要数据迁移**：否
- **是否需要重启服务**：是（见下方）

---

## 补充说明

本次修复是 PR #1830（错误友好化）的文案准确性 follow-up，不引入新的接口或字段。
前次 changelog 见 `07_fix_mp_arrival_batch_validation_friendly.md`，两个 PR 相互独立可分别部署。
