diff --git a/changelogs/2026-06/01_frontend_mengma_allow_adult_only_booking.md b/changelogs/2026-06/01_frontend_mengma_allow_adult_only_booking.md new file mode 100644 index 0000000..c743211 --- /dev/null +++ b/changelogs/2026-06/01_frontend_mengma_allow_adult_only_booking.md @@ -0,0 +1,49 @@ +# 【小程序·前端待办】小蒙马(GROUP)下单放开「必须有儿童/小童」限制,允许纯成人下单 + +> **类型**: 前端待办(hl-mini 小程序) - 业务规则放开 +> **仓库**: hl-mini(v1 分支,C 端小程序) +> **日期**: 2026-06-01 +> **背景**: wx 反馈——小蒙马下单时「只有成人、没有儿童」也应能下单;现状是没有非成人(儿童/小童)就被拦,无法下单。 +> **后端**: 已支持纯成人下单,**无需改后端**(依据见下)。 + +--- + +## 一、需求 + +小蒙马(GROUP / 团队产品)下单,**允许只有成人、不带任何儿童/小童/幼童**也能正常下单。当前前端在确认下单时强制「至少 1 名儿童或小童」,需放开。 + +## 二、前端拦截点(要改的地方) + +`packages/product/_shared/components/booking-popup/booking-popup.js` → `onConfirm()` 内: + +```js +// 约 758-761 行 —— 这段是唯一的硬拦截,删除即可 +if (isGroupProduct && (childCount + youngChildCount) < 1) { + wx.showToast({ title: '至少需要1名儿童或小童', icon: 'none' }); + return; +} +``` + +- **改法**:删掉上面这个 `if` 块。保留上方 `adultCount < 1 → '至少需要1名成人'` 的校验(成人仍是必须的)。 +- 删除后,小蒙马即可纯成人下单(成人 ≥1、儿童/小童/幼童均可为 0)。 + +### 可选(体验,非阻塞) +同文件约 274 行,小蒙马儿童 stepper 默认起始值为 1(`isGroupProduct ? 1 : ...`)。这只是默认值,用户本就能手动减到 0(line 279-280 已把 min 设为 0),不影响纯成人下单。是否把默认值也改为 0 由前端按交互习惯决定,**与本次放开无强依赖**。 + +## 三、后端为什么不用改(依据) + +后端全链路已支持纯成人,逐处确认: + +| 位置 | 结论 | +|------|------| +| `MpOrderSaveReqVO` / `AdminOrderSaveReqVO`(下单请求) | `adultCount @Min(1)`,childCount/youngChildCount/babyCount **无下限、默认可为 0/null** | +| `GroupTourBatchService.getGroupQuote`(团报价) | 纯成人时 `childTotal/toddlerTotal/infantTotal = 0`,`grandTotal` 正常,不依赖非成人 | +| `GroupOrderStrategy.validate`(下单校验) | 只校验班期状态/报名截止/出发日期/房间库存,**无人群结构校验** | +| `OrderCreateService.calcTotalPeople` | null-safe,纯成人 `totalPeople = 成人数 > 0`,正常扣减库存 | +| `PricingRuleHelper.singleRoomSurcharge` | 单房差只看 `adultCount`(奇数成人),与是否有儿童无关 | + +即:前端删掉那段校验后,纯成人下单会被后端正常受理、报价、扣库存。 + +## 四、验证建议(前端改完自测) + +小蒙马产品 → 选报名中班期 → 成人 2、儿童/小童/幼童全 0 → 应能正常进入支付/确认页,不再弹「至少需要1名儿童或小童」。