changelog(v2): 接口参数校验3缺陷——pageNo兼容别名+看板不存在订单报错+保险任务status兼容校验(#5601)
所有检测均成功
changelog-filename-gate / validate (push) Successful in 2s

这个提交包含在:
API Changelog Bot 2026-08-06 17:09:13 +08:00
父节点 557bbf4ad1
当前提交 20e55c2d2a

查看文件

@ -0,0 +1,79 @@
---
schema: "hl-changelog/v2"
ticket: "5601"
title: "接口参数校验3缺陷pageNo兼容别名拦截+看板不存在订单报错+保险任务status兼容校验"
consumer: "admin"
author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_owner: "@wx"
frontend_ref: "管理后台无强制前端改动;若历史调用方曾传 pageNo/status 参数,现已与 page/taskStatus 等价并校验非法值"
target_release: ""
verified_at: "2026-08-06"
status_note: "后端完成PR #5615 合并 dev-v3e6ecb3555a2ad1d56a4a6d93aebb90bdcd2ec9c5并部署 TEST;网关实测 pageNo=0/-1 返 400 页码最小为1、看板不存在订单返 605904 订单不存在、保险任务 status=XXX 返 400 枚举错误。前端契约参数名不变page/pageSize、taskStatus,pageNo/status 为兼容别名(等价生效并校验)。"
updated_at: "2026-08-06"
base: "dev-v3"
generated: "2026-08-06T17:15:00+08:00"
---
# 接口参数校验3缺陷pageNo兼容别名拦截+看板不存在订单报错+保险任务status兼容校验
> 服务端已部署 TEST 并网关验证;前端契约参数名不变,无强制改动。
## 关联 / 联系人
### 链接
- **Issue**: [#5601](https://git.1814.love:8443/wx/HL/issues/5601)
- **PR**: [#5615](https://git.1814.love:8443/wx/HL/pulls/5615)
- **Merge commit**: [e6ecb3555](https://git.1814.love:8443/wx/HL/commit/e6ecb3555a2ad1d56a4a6d93aebb90bdcd2ec9c5)
### 联系人
- **后端负责人**: @wx
## 变更接口
| 方法 | 路径 | 来源 | 变更 |
|---|---|---|---|
| `GET` | `/admin/fleet/drivers/page` | `DriverController`fleet | 查询参数新增兼容别名 `pageNo`(等价 `page``pageNo=0/-1` 返 400「页码最小为1」修复前被静默忽略返回默认第一页`driverStatus`/`season`/`insuranceType` 非法枚举值返 400修复前静默空结果 |
| `GET` | `/admin/fleet/board/orders` | `BoardController`fleet | 查询参数新增兼容别名 `pageNo`(等价 `page`):非法页码返 400 |
| `GET` | `/admin/fleet/board/orders/<orderId>` | `BoardController`fleet | 语义修复:订单不存在(跨库确认查无)返 **605904 订单不存在**(修复前返回 200 空壳 VO;order-v3 整体不可达时仍降级回显relatedDetailReady=false |
| `GET` | `/admin/fleet/insurance/tasks` | `FleetInsuranceTaskController`fleet | 查询参数新增兼容别名 `status`(等价 `taskStatus``status=非法值` 返 400「任务状态必须是 PENDING/PROCESSING/SUCCESS/RESOLVED/IGNORED 之一」(修复前被静默忽略返回全部任务) |
| `GET` | `/admin/fleet/vehicles/page` | `VehicleController`fleet | `ownerType`/`vehicleStatus` 非法枚举值返 400同类扫 |
| `GET` | `/admin/fleet/reconciliation/pending-compensations` | `ReconController`fleet | `status`/`opType` 非法枚举值返 400同类扫 |
> 注:`pageNo``status` 为兼容别名,**契约主参数名不变**`page`/`pageSize``taskStatus`);所有继承 `PageParam` 的分页接口(司机/车辆/车队/车型/保险任务/保单/H5 Token/对账补偿等 10 个)自动获得 `pageNo` 兼容与校验。
## 契约影响文件
- `hl-common/hl-common-core/src/main/java/com/hulalv/common/result/PageParam.java`(新增 `getPageNo/setPageNo` 兼容别名,@Min 校验复用)
- `hl-fleet-service/src/main/java/com/hulalv/fleet/board/vo/BoardOrderPageReqVO.java`同上;page/pageSize 校验 #5516 已有)
- `hl-fleet-service/src/main/java/com/hulalv/fleet/board/service/BoardOrderService.java`queryOrderDetail 无本地派单且订单确认不存在 → 605904;不可达不误报;原 605908 孤儿语义保留)
- `hl-fleet-service/src/main/java/com/hulalv/fleet/insurance/vo/FleetInsuranceTaskPageReqVO.java`(新增 `status` 兼容字段 + @Pattern 校验)
- `hl-fleet-service/src/main/java/com/hulalv/fleet/insurance/FleetInsuranceTaskService.java`pageTasks status→taskStatus 归一合并)
- `hl-fleet-service/src/main/java/com/hulalv/fleet/driver/vo/DriverPageReqVO.java``vehicle/vo/VehiclePageReqVO.java``reconciliation/vo/ReconPendingCompPageReqVO.java`(枚举 @Pattern 校验)
## 根因与修复说明
- **① pageNo<=0 不拦**:契约参数名是 `page``PageParam` 已有 `@Min(1)` 拦截 `page=0`),历史调用方传 `pageNo` 时被 Spring 当作未知参数静默忽略,返回默认第一页且不报错 → 新增 `pageNo` 兼容别名getter+setter 映射到 `page`),非法值随 `@Min` 统一返 400
- **② 看板不存在订单返回空壳**`queryOrderDetail` 只在本地有派单快照时校验订单存在(孤儿 605908,无派单且订单不存在时走完组装返回 id=假id、orderNo=null、... 空壳 → 无本地派单且跨库确认不存在时直接抛 605904;order-v3 不可达(查询结果未知)仍保留降级回显,不误报
- **③ 保险任务非法 status 返回全部**:契约参数名是 `taskStatus`#5515 已有 @Pattern 校验),调用方传 `status` 时被忽略返回全部任务 → 新增 `status` 兼容字段(等价 `taskStatus`),非法值 400,合法值等价筛选
- **同类扫**:按 #5515「非法枚举值显式 400 而非静默」口径补齐 drivers/vehicles/recon 枚举字段;board/expiry、matrix、保单 status 等已有校验确认到位
## 前端/调用方动作
1. **无强制改动**:前端契约参数名(`page`/`pageSize``taskStatus`)不变,现有调用不受影响
2. **兼容增强**:若历史调用方曾传 `pageNo`/`status`,现在与 `page`/`taskStatus` 等价并校验非法值;同一请求同时传 `page``pageNo`(或 `taskStatus``status`时,后者覆盖前者Spring 绑定顺序),建议只传契约主参数
3. **看板详情错误处理**:不存在订单现返回 605904「订单不存在」修复前 200 空壳),前端可据此提示
## 验证证据
- 定向测试 285/285 全绿BoardOrderServiceTest 87+2空壳拦截 605904 / 不可达降级不误报、BoardControllerTest 11+3pageNo 非法 400 / 合法绑定 / 605904 透传、DriverControllerTest 30+3pageNo 非法 400 / 合法绑定 / 枚举 400、FleetInsuranceTaskControllerTest 15+2status 非法 400 / 合法透传、FleetInsuranceTaskServiceTest 142
- fleet verify255 个测试类全绿(含 spotless;唯一失败 ReleaseEMixedBinaryHarnessTest 2 项经基线对比dev-v3 干净 HEAD 同样失败)确认为基线环境 flaky进程 runner 管道/超时),与本次改动无关
- 网关验证TEST,经 api.test.1814.love:9443
- `pageNo=0` / `pageNo=-1` → 400「页码最小为1」drivers/page 与 board/orders 同口径);`pageNo=2` → 200 正常分页total=28
- `/admin/fleet/board/orders/999999999999999999`**605904 订单不存在** data=null修复前 200 空壳)
- `status=XXX` → 400 任务状态枚举错误;`status=SUCCESS` → 200 正常筛选total=49,records[0].taskStatus=SUCCESS