# 修复:班期内部报价补 toddler/infant 字段(订单总价含小童金额)

**类型**: 后端 BUG 修复
**关联**: 工单 #1498 / PR #1499
**日期**: 2026-04-27
**影响范围**: 小程序 GROUP(小蒙马) 订单创建后的订单详情展示 + 总价

---

## 现象

后端同事反馈: order-v2 调 product-v2 的班期报价接口时返回里没有小童单价/数量/小计,GROUP 订单(小蒙马)创建带小童时算价漏掉小童总价。同时入参也缺 toddlerCount,订单方根本传不过去。

## 修复后的行为

### 1. GROUP 订单总价 (`totalPrice`)

**接口**: `POST /mp/order/create` (GROUP 类型)

- 修复前: 带 `youngChildCount=1` 创建 GROUP 订单,totalPrice 只算成人 + 儿童,小童金额漏掉
- 修复后: totalPrice 正确包含小童金额(由班期 toddlerDiscount 决定)

### 2. 订单详情价格明细 (`priceBreakdown.items`)

**接口**: `GET /mp/order/detail/{id}` 与 `GET /admin/order/detail/{id}`

- 修复前: items 里小童单价/小计硬写 0 元(展示成"小童 0元×N=0元")
- 修复后: 小童行展示真实单价(=班期成人价×儿童折扣) 和 真实小计

### 3. 小童单价计算口径

`toddlerPrice = max(childPrice + toddlerDiscount, 0)`

与 `ProductPricingService.calculateQuote` 同口径。toddlerDiscount 默认负数(优惠),null 时小童价=儿童价。

## 前端建议

**不需要改任何代码**。本次是后端纯修复,前端只需要观察:
1. 创建带 youngChildCount 的 GROUP 订单后,`totalPrice` 应正确 = 成人+儿童+小童(含 toddlerDiscount)
2. 订单详情里"小童"行不再永远显示 0,有班期 toddlerDiscount 时显示实际折扣价

## 跨服务接口变更说明 (内部, 前端无感知)

### Feign Client 入参签名 (新增 2 个,默认 0)

```
GET /internal/product/batch/{batchId}/quote
  ?adultCount=2 &childCount=1 &toddlerCount=0 &infantCount=0 &roomCount=1
                                  ↑ 新增           ↑ 新增
```

### 返回 VO 新增字段

```json
{
  "adultPrice": 5999, "childPrice": 4299,
  "toddlerPrice": 3299,        // 新增
  "infantPrice": 0,            // 新增
  "adultCount": 2, "childCount": 1,
  "toddlerCount": 1,           // 新增
  "infantCount": 0,            // 新增
  "roomCount": 1,
  "adultTotal": 11998, "childTotal": 4299,
  "toddlerTotal": 3299,        // 新增
  "infantTotal": 0,            // 新增
  "grandTotal": 19596
}
```

### 向后兼容

- 入参新字段都有默认 0,旧调用方不传不影响
- 返回新字段对旧消费者透明(Jackson 忽略未知字段)

## 测试建议

- [ ] 小程序选有 toddlerDiscount 的班期(例如 batch_id=2042826084914950145 有 toddlerDiscount=-1000),youngChildCount=1 下单
  - 期望: `totalPrice` 包含小童金额 (childPrice + toddlerDiscount)×1
  - 期望: 订单详情价格明细里小童行不为 0
- [ ] 不带小童(youngChildCount=0)下单 → 行为与改动前一致

## 后端测试

- 单测: GroupTourBatchServiceMpTest 新增 4 用例(toddlerDiscount=null/截断为0/向后兼容/正常)+ GroupOrderStrategyTest 8 用例适配新签名,全过
- 本地 API: product-v2 9083 直接 curl 经 X-Internal-Token 验证两路径
  - 完整传: toddlerPrice=3299 (=4299-1000) grandTotal=19596 ✓
  - 向后兼容: toddler/infant=0 grandTotal=16297 与改动前一致 ✓
