# 班期保存 - 最大参与人数 强制必填校验

**日期**: 2026-04-18
**PR**: #861 → 合并到 dev
**影响端**: 管理后台 Web (hl-ui-admin)
**影响接口**:
- `POST /admin/product/item/{id}/schedule` (Step4 创建班期)
- `PUT /admin/product/item/{id}/schedule` (Step4 修改班期)
- `POST /admin/product/item/{id}/schedule/batch-create` (Step4 班期批量创建)

## 背景

测试反馈：保存班期时填了价格、班期名、出发日，**没填最大参与人数**，后端报错"数据操作违反约束，请检查输入"——容易让运营误以为是价格问题。

根因是 `ScheduleSaveReqVO.maxParticipants` 缺 `@NotNull` 校验，NULL 直接打到 SQL（`group_tour_batch.max_participants` 是 NOT NULL 列），DB 抛异常被全局兜底为模糊消息。

## 行为变化

| 场景 | 修复前 | 修复后 |
|---|---|---|
| `maxParticipants` 不传或传 null | `{"code":400,"message":"数据操作违反约束，请检查输入"}` | `{"code":400,"message":"最大参与人数不能为空"}` |
| `maxParticipants` 传具体数字 | 200 入库 | 200 入库（无变化） |

## 前端建议

`maxParticipants` 字段在表单上加 **required + 数字校验**，避免提交空值再被后端打回。文档中 `ApiModelProperty(required=true)` 一直存在，本次只是把 runtime 校验补齐。

`ScheduleBatchCreateReqVO`（批量创建）同步加了 `@NotNull`，前端表单一致处理。

## 不影响

- 字段名、字段类型、字段语义不变
- 其他字段校验规则不变
- 业务流程（Step4 班期生命周期）不变

🤖 Generated with [Claude Code](https://claude.com/claude-code)
