From 6093ec52cf67f5d1b416adca9b7e998f98ff70c3 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Wed, 22 Apr 2026 16:30:53 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=AE=A2=E5=8D=95=E5=87=BA=E8=A1=8C?= =?UTF-8?q?=E4=BA=BA=E7=BC=96=E8=BE=91=E8=B0=83=E9=94=99=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B=E9=94=99?= =?UTF-8?q?=E8=AF=AF+=E4=B8=BB=E8=A1=A8=E8=AF=AF=E6=94=B9(=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E9=9C=80=E4=BF=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...aveler-edit-wrong-endpoint-frontend-fix.md | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 changelogs/2026-04/2026-04-22_mp-order-traveler-edit-wrong-endpoint-frontend-fix.md diff --git a/changelogs/2026-04/2026-04-22_mp-order-traveler-edit-wrong-endpoint-frontend-fix.md b/changelogs/2026-04/2026-04-22_mp-order-traveler-edit-wrong-endpoint-frontend-fix.md new file mode 100644 index 0000000..189e643 --- /dev/null +++ b/changelogs/2026-04/2026-04-22_mp-order-traveler-edit-wrong-endpoint-frontend-fix.md @@ -0,0 +1,97 @@ +# [前端 BUG · 需前端修] 订单里编辑出行人调错接口导致"参数类型错误: id"+主表被误改 + +> **归属**: 前端 +> **日期**: 2026-04-22 +> **报告人**: wx (后端) +> **优先级**: P1 + +## 现象 + +小程序 **订单详情 → 出行人列表 → 点编辑 → 保存** 时: +1. 红字 toast: **"参数类型错误: id"** +2. 部分场景下用户反馈"订单的出行人"和"实际出行人(常用出行人地址簿)"都被修改 + +## 根因 (后端三尺实证已确认) + +### 根因 1: 调错接口 + +本项目有两个完全独立的"出行人"接口,语义不同: + +| 接口 | 改的表 | 语义 | 适用场景 | +|------|--------|------|---------| +| `PUT /mp/user/traveler/{id}` | `traveler` (用户地址簿主表) | 长期维护的常用出行人 | **个人中心 → 常用出行人** 页面 | +| `PUT /mp/order/{orderId}/traveler/{travelerId}` | `order_traveler` (订单快照表) | 下单快照,不影响主表 | **订单详情 → 出行人** 页面 | + +目前"订单里编辑出行人"页面调的是 `/mp/user/traveler/{id}`(主表接口),**调用目标错了**。 + +### 根因 2: `id` 为 undefined/null/对象 + +`/mp/user/traveler/{id}` 的路径参数 `id` 是 `Long` 类型,Spring 解析失败即报 "参数类型错误: id"。 +说明前端在构造 URL 时 `id` 传入了 `undefined` / `null` / 非数字字符串,URL 变成 `/mp/user/traveler/undefined` 被后端 `MethodArgumentTypeMismatchException` 拦截。 + +### 为什么会"双改" + +- 调了主表接口 → 地址簿被改 +- 订单详情里的出行人如果从主表 join 展示姓名/证件,看起来"订单出行人也变了" + +(后端代码已核查: `OrderTravelerService.updateTraveler` 只动 `order_traveler`,`MpTravelerController.updateTraveler` 只动 `traveler`。双方都是快照/主表独立维护,没有任何一个后端方法"双改"两张表。) + +## 前端修复要求 + +### 1. 订单出行人编辑页统一走订单快照接口 + +**旧 (错)**: +```js +PUT /mp/user/traveler/{id} // id = orderTravelerId (不对口) + // 或 id = undefined (参数类型错误) +``` + +**新 (对)**: +```js +PUT /mp/order/{orderId}/traveler/{travelerId} + body: MpOrderTravelerSaveReqVO { + name, idCardType, idCardNo, phone, gender, birthday, + travelerType, nationality, emergencyContact, emergencyPhone, email + } +``` + +- `orderId`: 当前订单 ID +- `travelerId`: 从 `GET /mp/order/{orderId}/traveler` 返回的 `TravelerVO.travelerId`(就是 `order_traveler.order_traveler_id`) +- 不要 fallback 到"常用出行人 id" + +### 2. 保存按钮点击前校验 `travelerId` 存在 + +构造 URL 前 `if (!travelerId) { return uni.showToast('出行人 ID 缺失') }`,禁止 `undefined` 进 URL。 + +### 3. 区分两个"编辑出行人"入口 + +| 入口页面 | 调用接口 | +|---------|---------| +| 个人中心 → 我的出行人 → 编辑 | `PUT /mp/user/traveler/{id}` | +| 订单详情 → 出行人 → 编辑 | `PUT /mp/order/{orderId}/traveler/{travelerId}` | + +两个入口**必须**用对应的接口,不可共用同一个 API 调用。 + +## 相关接口 + +### 订单出行人 (本次要改的目标接口) + +- `GET /mp/order/{orderId}/traveler` — 查询订单出行人列表 + 返回 `List`,其中 `travelerId` 就是 `order_traveler.order_traveler_id` +- `POST /mp/order/{orderId}/traveler` — 新增订单出行人 +- **`PUT /mp/order/{orderId}/traveler/{travelerId}`** — **修改订单出行人 (null 字段保持原值)** +- `DELETE /mp/order/{orderId}/traveler/{travelerId}` — 删除订单出行人 + +所有字段语义见 `MpOrderTravelerSaveReqVO`,与 `MpTravelerRequest` 字段名对齐,Jackson 透传。 + +### 用户常用出行人 (只用于"个人中心 → 我的出行人") + +- `GET /mp/user/traveler` — 列表 +- `POST /mp/user/traveler` — 新增 +- `PUT /mp/user/traveler/{id}` — 改主表 +- `DELETE /mp/user/traveler/{id}` — 删主表 +- `PUT /mp/user/traveler/{id}/default` — 设为默认 + +## 后端无改动 + +本次后端代码、DB、VO 均无变更。