---
date: 2026-04-27
type: fix
module: mp-product
title: 小蒙马(GROUP)产品价格相关接口按 productType 分叉走班期表
audience: frontend
breaking: false
---

## 背景

线上反馈：小蒙马（productType=GROUP）产品详情页底部「立即预订」按钮永久显示「加载中...」无法下单（详情页其他内容正常加载）。

## 根因

mp 端价格相关接口仅查 `product_price_calendar` 表，但 GROUP 类型产品价格只存在 `group_tour_batch.adult_price`，价格日历表为空 → 接口返回 `available=false` / `startPrice=null` → 前端 loading 不解除或起步价无显示。

## 修复范围（5 个 mp 接口 + 1 处装配器）

| 接口路径 | 修复点 |
|---------|--------|
| `GET /mp/product/{id}/earliest-available-date` | GROUP 产品改走班期表取最早可售日期，`available=true` 才显示 |
| `GET /mp/product/{id}/price-calendar?month=YYYY-MM` | GROUP 产品改用班期数据填充日历；同日多班期取最低 adultPrice + 库存合并 |
| `GET /mp/product/line/{id}/products` | 列表 `startPrice` 字段补 GROUP 班期最低价 |
| `GET /mp/product/line` | 产品线最低价合并日历 + 班期两路 |
| `GET /mp/product/line/{id}` | 产品线详情 `startPrice` 同上 |
| 产品详情接口 `isBooking` 字段 | GROUP 产品按班期表"未来未截止"判定可订状态（之前永远 false） |

## 前端预期变化

**前端不需要改代码**，但需要知道行为变化：

1. **「立即预订」按钮**：以前小蒙马产品永久 loading，现在能正确显示"可点击/灰显"
2. **价格日历**：以前小蒙马产品月度日历无数据，现在显示班期对应的天 + 价格
3. **起步价**：以前小蒙马列表页/详情页 startPrice=null，现在显示最低班期价
4. **可售日期判定逻辑**：GROUP 走班期"未来 + ENROLLING/NEARLY_FULL + 报名未截止"，CORE/CUSTOM 走价格日历"全档位齐全"（行为没变）

## 字段说明

返回 VO 结构 **0 变化**，前端透传即可：

- `MpEarliestAvailableDateRespVO`: `date / available / daysFromToday`（同 CORE 一致）
- `MpPriceCalendarRespVO.CalendarDay`: `date / adultPrice / childPrice / remainStock / isSelectable`（GROUP 同日多班期合并为一行）
- `MpProductDetailRespVO.startPrice / isBooking`: 同 CORE 字段含义

## 验证状态

- ✅ 982 单测全绿（含 4 个新增 GROUP 分叉测试）
- ✅ 测试环境部署成功（hl-product-service-v2 双实例 8083+8183）
- ⏳ 测试环境无 GROUP 班期数据，e2e 验证待真有班期的小蒙马产品上线

## 关联

- 工单: #1485
- PR: #1489
- 类似经验: PR #926（GROUP/CORE 价格双源同类型踩过坑）
