diff --git a/changelogs-v2/2026-07/51_4858_订单用车座位校验事务边界收口-管理后台.md b/changelogs-v2/2026-07/51_4858_订单用车座位校验事务边界收口-管理后台.md new file mode 100644 index 0000000..ff0f156 --- /dev/null +++ b/changelogs-v2/2026-07/51_4858_订单用车座位校验事务边界收口-管理后台.md @@ -0,0 +1,86 @@ +# 【前端对接·管理后台】订单用车座位校验事务边界收口 + +> Issue: [wx/HL#4858](https://git.1814.love:8443/wx/HL/issues/4858) +> PR: [wx/HL#4859](https://git.1814.love:8443/wx/HL/pulls/4859) +> 服务: `hl-order-service-v3` +> 日期: 2026-07-08 +> 影响范围: 订单详情 / 调整订单弹窗 / 车辆安排 + +## 1. 结论 + +- 本次不新增前端字段,不改变请求结构。 +- 前端仍按 #4856 文档处理:先选车型大类,再从 `GET /admin/fleet/vehicle-types/list` 的 `seatOptions` 渲染座位数下拉。 +- `PUT /v3/admin/order/{id}/vehicle-requirement` 提交前,后端会在事务外只读调用车务车型库校验 `vehicleType + seats`。 +- 非法座位数组合继续返回 `582024`,车务车型库不可用继续返回 `582091`。 + +## 2. 提交请求保持不变 + +```http +PUT /v3/admin/order/2074746808742928386/vehicle-requirement +Authorization: Bearer +Content-Type: application/json +``` + +```json +{ + "fleet": [ + { + "vehicleType": "suv2", + "seats": 5, + "count": 1 + } + ], + "specialTags": ["儿童安全座椅"], + "remark": "需要接机,后备箱放 2 个 28 寸行李箱" +} +``` + +字段口径: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `fleet[].vehicleType` | string | 车型大类 key。前端可传真实 `typeKey`,后端保存前归一为 `suv/mpv/bus/sedan`。 | +| `fleet[].seats` | number | 从该大类 `seatOptions` 中选择的座位数。 | +| `fleet[].count` | number | 车辆数量,必须大于 0。 | + +## 3. 非法座位数组合 + +请求示例: + +```json +{ + "fleet": [ + { + "vehicleType": "suv", + "seats": 99, + "count": 1 + } + ], + "specialTags": [], + "remark": "negative-seat-check" +} +``` + +响应示例: + +```json +{ + "loginStatus": 200, + "requestStatus": 200, + "code": 582024, + "msg": "座位数不在该车型大类可选座位数中,请检查车型库", + "data": null +} +``` + +前端处理: + +- 直接展示后端 `msg`。 +- 不允许把座位数改成手输。 +- 切换车型大类后,如果当前座位数不在新大类 `seatOptions` 内,需要清空座位数并要求重新选择。 + +## 4. 验证结果 + +- 测试环境 `hl-order-service-v3` 已部署成功。 +- `8086/8186` 双实例 `/actuator/health` 返回 200。 +- 管理端 API 负向实测:非法 `seats=99` 返回 `582024`,证明校验发生在订单查找和写库之前。