docs: 27 日新增两条修复 changelog
- fix(admin/product): 固定订金模式产品售价必须 > 订金(双向校验) (#1497) - fix(mp/admin/order): 班期内部报价补 toddler/infant 字段, GROUP 订单 totalPrice 含小童金额 (#1498) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
这个提交包含在:
父节点
6728f078ff
当前提交
3e4549efee
@ -0,0 +1,65 @@
|
|||||||
|
# 修复:固定订金模式产品售价必须大于订金(双向校验)
|
||||||
|
|
||||||
|
**类型**: 后端 BUG 修复 + 校验加严
|
||||||
|
**关联**: 工单 #1497 / PR #1501
|
||||||
|
**日期**: 2026-04-27
|
||||||
|
**影响范围**: 管理端产品基础信息保存 + 价格日历批量设置 + 班期保存
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 现象
|
||||||
|
|
||||||
|
后台「支付类型=订金+尾款」+「订金设置=固定金额(元/人)」组合下,保存价格时未校验售价 > 订金。极端 case: 用户设定金 5000 元/人但成人价配 1000,定金比总价还高,业务彻底崩。
|
||||||
|
|
||||||
|
## 后端改动
|
||||||
|
|
||||||
|
### 1. 正向校验(保存价格时)
|
||||||
|
|
||||||
|
**接口 1: 价格日历批量设置 `POST /admin/product/item/{id}/price-calendar/batch`** (CORE/CUSTOM)
|
||||||
|
|
||||||
|
- 触发条件: 产品 paymentType=DEPOSIT 且 depositAmount > 0
|
||||||
|
- 校验: adultSellPrice > depositAmount **AND** childSellPrice > depositAmount
|
||||||
|
- 不通过会返:
|
||||||
|
- `code=410105`: 成人售价({0}元)必须大于产品订金({1}元/人),请调整定价或修改基础信息中的订金
|
||||||
|
- `code=410106`: 儿童售价({0}元)必须大于产品订金({1}元/人),请调整定价或修改基础信息中的订金
|
||||||
|
|
||||||
|
**接口 2: 班期保存 `POST /admin/product/item/{id}/schedule`** (GROUP) 与 **班期批量创建**
|
||||||
|
|
||||||
|
- 同样规则套用 adultPrice / childPrice
|
||||||
|
- 错误码同上
|
||||||
|
|
||||||
|
### 2. 反向校验(保存基础信息时)
|
||||||
|
|
||||||
|
**接口: Step1 基础信息保存 `POST /admin/product/item/basic`**
|
||||||
|
|
||||||
|
- 触发条件: 用户调高 depositAmount(固定金额模式)
|
||||||
|
- 校验: 反查产品现有 product_price_calendar + group_tour_batch,任一售价 ≤ 新订金即抛错
|
||||||
|
- 不通过会返:
|
||||||
|
- `code=410107`: 订金({0}元/人)不能高于现有价格({1} {2}的售价{3}元),请先调整定价
|
||||||
|
- 占位符 {1} 是日期(如 `2026-05-17`)或班期号(如 `班期Q26050101`),{2} 是「成人」或「儿童」
|
||||||
|
|
||||||
|
### 3. 跳过项(不校验)
|
||||||
|
|
||||||
|
- **比例订金模式** (`depositRatio` 有值, `depositAmount` 为空): 不校验,比例 < 100% 数学上必然 < 总价
|
||||||
|
- **全款模式** (`paymentType=FULL`): 不校验
|
||||||
|
- **幼童价 / 小童优惠**: 不校验,幼童价 0 是合法免费语义
|
||||||
|
|
||||||
|
## 前端建议
|
||||||
|
|
||||||
|
1. **不需要改逻辑**,后端已加硬校验
|
||||||
|
2. UI 体验优化(可选): 在「订金设置」输入框旁加提示"订金须低于最低成人/儿童售价"
|
||||||
|
3. 接到 `code=410105/410106` 时建议提示用户「请调整价格或回基础信息修改订金」
|
||||||
|
4. 接到 `code=410107` 时建议解析消息中的日期/班期号高亮冲突项
|
||||||
|
|
||||||
|
## 测试建议
|
||||||
|
|
||||||
|
- [x] 管理端 CORE 产品基础信息设固定订金 100,价格日历配成人价 50 → 应报错 `410105`
|
||||||
|
- [x] 同上配成人价 200 → 应通过
|
||||||
|
- [x] 管理端 GROUP 产品班期保存 adultPrice=50,固定订金 100 → 应报错 `410105`
|
||||||
|
- [x] 已配价格日历(成人价 100),回基础信息把订金调到 200 → 应报错 `410107` 含冲突日期
|
||||||
|
- [x] 比例订金 30% 配成人价 50 → 应通过(不受影响)
|
||||||
|
- [x] 全款模式 → 应通过(不受影响)
|
||||||
|
|
||||||
|
## 后端单测
|
||||||
|
|
||||||
|
ProductPricingServiceTest 新增 8 用例 + ProductBasicServiceTest 新增 5 用例,全量 1000 用例通过。
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
# 修复:班期内部报价补 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 与改动前一致 ✓
|
||||||
正在加载...
x
在新工单中引用
屏蔽一个用户