# 【批量修复·管理后台 + 小程序】wx 近5天代码审计 batch 修复（前端可见的校验收紧 + 行为修正）

> **PR**: #3442 | **关联工单**: #3440
> **服务**: hl-product-service-v2 / hl-resource-service / hl-fleet-service / hl-user-service / hl-order-service-v2 | **更新时间**: 2026-06-04
>
> **存放目录**: `changelogs-v2/2026-06/`
> **影响范围**: 多处后端 bug 修复，本篇仅列**前端可观察到的变化**（校验收紧 / 展示行为修正）；纯内部修复不在此列

---

## ⚠️ 关键说明

本批修复源自一次代码审计，多为后端内部纠错（无前端影响）。下面**只列前端需要知道的 4 处**：

1. **几处入参新增字典校验**（传非法值会从"静默落库"变成 **400 报错**）——前端表单须传字典值。
2. **内部员工站内信列表 `pageSize` 上限 100**（超过返 400）。
3. **服务类（SERVICE）资源的退费说明现在会进产品行程聚合 / 订单快照**——前端行程/订单详情可能多展示出 SERVICE 节点的退费说明。
4. **小程序小蒙马"最早可售日"修正**——已售罄（满团）但出发日在未来的班期不再被当作"最早可售日"。

---

## 1. 入参校验收紧（传非法值 → 400）

| # | 接口 | 字段 | 新校验 | 说明 |
|---|------|------|--------|------|
| 1 | 司机档案新增/编辑（admin） | `gender` | 仅 `1`=男 / `2`=女（可空） | 原仅长度校验，可存"男/0/AB"脏值；现非字典值返 400 |
| 2 | 出行人保存（mp/admin TravelerRequest） | `gender` | 仅 `0`=未知 / `1`=男 / `2`=女 | 原无范围校验，可存 '3'/'99'；现非字典值返 400 |
| 3 | 车型价格日历 设置/改状态（admin） | `status` | 仅 `AVAILABLE` / `CLOSED` | 原无字典校验；现非字典值返 400 |

> 前端动作：上述表单提交前确保 `gender`/`status` 传字典值（与全系统性别字典 1=男/2=女/0=未知、价格日历两态一致）。若此前已按字典传值，则**无影响**。

**示例（gender 非法）**：
```
POST /admin/fleet/driver  body 含 "gender":"男"
→ { "code": 400, "message": "性别只能 1=男/2=女" }
```

---

## 2. 内部员工站内信列表 pageSize 上限 100

**GET** `/admin/message/list`

补了入参校验，`pageSize` 超过 100 返 400（原校验未生效可超量查）。

**测试服实测**：
```
GET /admin/message/list?page=1&pageSize=10      → code 200（正常）
GET /admin/message/list?page=1&pageSize=100000  → code 400「每页条数不能超过100」
```

> 另：内部员工站内信目前**仅 SYSTEM 一类**（#3427 已固定），`categoryCode` 传 HOUSE/ORDER 过滤结果恒空、`markCategoryRead` 传 HOUSE/ORDER 恒更新 0 行；建议列表 `categoryCode` 留空查全部。Swagger 文档已同步标注。

---

## 3. SERVICE（服务类）资源退费说明进入行程聚合 / 订单快照

服务类资源（service_item）此前已支持配置退费说明（#3407），但**产品行程节点聚合接口漏填了 SERVICE 的退费说明**，导致：admin 服务详情能看到退费说明，但它进不了产品行程聚合 → 冻不进订单快照 → 司机行程单/订单详情看不到。

本次已补齐：**SERVICE 资源的退费说明现在与 SCENIC/ACTIVITY 一样，会随产品行程聚合下发，并在下单时冻进订单快照**。

> 前端动作：产品行程详情 / 订单详情中，挂在 SERVICE 节点上的资源现在可能多出 `refundNote`（退费说明）字段，按既有 SCENIC/ACTIVITY 的退费说明渲染逻辑展示即可。

---

## 4. 小程序小蒙马"最早可售日"修正

小蒙马产品的"最早可售日"（`findEarliestAvailableBatchDate`）原仅按"出发日在未来 + 报名窗口未关"判定，**不看库存**，导致已售罄（持久 FULL）但出发日在未来的班期被错误当成"最早可售日"。

已修正为**按展示态 == 报名中（含库存判定）**取最早可售班期。

> 前端动作：无需改动，小程序展示的"最早可售日"会自动变准（排除满团班期）。

---

## 5. 其他（无前端影响，仅备案）

- product-v2：复制产品时 GROUP 班期状态重置为"报名中"（原沿用源终态致复制出已满/已取消班期）。
- product-v2：admin 增加行程天 / 上下架去掉了误伤连续操作的幂等节流（原同管理员 5 秒内第二次操作被"请勿重复提交"拦），不影响接口契约。
- resource：`ServiceUpdateRequest.vehicleType` 长度上限统一为 32（原有矛盾的 32/500 双重校验，实际一直生效 32）。
- order-v2：删除一个 0 调用死方法（无行为变化）。

---

## 6. 验证

- 各模块编译 + 相关单测通过（product-v2 +37 / resource +2 含售罄班期不选、复制重置、SERVICE refundNote 填充等回归）。
- 5 服务部署测试服 + 双实例 health UP；API 实测 pageSize 上限 400 已生效。

---

## 7. 关联 / 联系人

- **本次 PR**：#3442（Closes #3440）
- **后端负责人**：@wx
- **前端对接（管理后台 + 小程序）**：mmg
