6.6 KiB
6.6 KiB
算价/档位/定金系列变更
服务: hl-product-service-v2 (端口 8083) PR: #718, #720, #722, #724 日期: 2026-04-17 影响范围: 小程序算价、管理端算价、管理端下单产品选择、小程序档位对比
一、变更总览
| # | 主题 | PR |
|---|---|---|
| 1 | 固定定金算价按总人头 × 单价 | #718 |
| 2 | 管理端下单产品选择列表补档位 + 新增档位下拉接口 | #720 |
| 3 | 算价接口补全4类人员单价/小计(成人/儿童/小童/幼童) | #722 |
| 4 | 小程序档位对比响应补充档位名称 tierName | #724 |
二、变更接口清单
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---|---|---|---|---|---|
| 1 | 小程序算价 | POST | /mp/product/quote |
响应字段语义 + 新增字段 | 固定定金按总人头×单价;新增4类人员单价/小计 |
| 2 | 管理端算价 | POST | /admin/product/item/quote |
响应新增字段 | 新增4类人员单价/小计 |
| 3 | 商品选择列表 | GET | /admin/product/item/simple-list |
响应新增字段 | 新增 tiers 档位数组 |
| 4 | 产品档位下拉 | GET | /admin/product/item/{productId}/tiers |
新增接口 | 下单选档位用 |
| 5 | 小程序档位对比 | GET | /mp/product/{id}/tier-compare |
响应新增字段 | 每组新增 tierName |
三、接口详情
1. 小程序算价 POST /mp/product/quote
响应完整字段(新增 4 类人员细分):
| 字段 | 类型 | 说明 |
|---|---|---|
adultUnitPrice |
BigDecimal | 成人单价 |
childUnitPrice |
BigDecimal | 儿童单价 |
toddlerUnitPrice |
BigDecimal | 🆕 小童单价 = max(儿童价 + 小童优惠额, 0) |
infantUnitPrice |
BigDecimal | 🆕 幼童单价(0=免费) |
totalAdultPrice |
BigDecimal | 成人小计 |
totalChildPrice |
BigDecimal | 儿童小计 |
totalToddlerPrice |
BigDecimal | 🆕 小童小计 |
totalInfantPrice |
BigDecimal | 🆕 幼童小计 |
grandTotal |
BigDecimal | 总价(4类小计之和,旧版只含成人+儿童) |
paymentType |
String | FULL / DEPOSIT |
depositRatio |
Integer | 订金比例(%),仅比例定金 |
depositAmount |
BigDecimal | 订金金额(⚠️ 固定定金语义变更见下方) |
balanceAmount |
BigDecimal | 尾款金额 |
⚠️ 固定定金算法变更(#718):
产品设置"订金固定额"时,之前返回的 depositAmount 是单人额度(不随人数变),导致前端显示与实际收款不符。
- 旧:
depositAmount = product.depositAmount - 新:
depositAmount = product.depositAmount × (adultCount + childCount + toddlerCount + infantCount) - 若乘出金额 >
grandTotal,取grandTotal兜底(防止 balance 为负) - 比例定金逻辑不变(仍按
grandTotal × ratio%)
示例(固定定金 500/人,2成人+1儿童+1幼童,grandTotal=13498):
{
"code": 200,
"data": {
"adultUnitPrice": 4999.00,
"childUnitPrice": 3500.00,
"toddlerUnitPrice": 0,
"infantUnitPrice": 0,
"totalAdultPrice": 9998.00,
"totalChildPrice": 3500.00,
"totalToddlerPrice": 0,
"totalInfantPrice": 0,
"grandTotal": 13498.00,
"paymentType": "DEPOSIT",
"depositAmount": 2000.00, // 500 × 4人
"balanceAmount": 11498.00
}
}
2. 管理端算价 POST /admin/product/item/quote
响应新增字段与小程序端一致(toddlerUnitPrice / infantUnitPrice / totalToddlerPrice / totalInfantPrice),grandTotal 同步包含 4 类。
3. 商品选择列表 GET /admin/product/item/simple-list
请求参数(无变化):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| productType | String | 否 | CORE / GROUP / CUSTOM |
| keyword | String | 否 | 名称/编号模糊 |
| pageNo / pageSize | Integer | 是 | 分页 |
响应新增字段:
| 字段 | 类型 | 说明 |
|---|---|---|
tiers |
Array | 🆕 档位列表(tierSeq / tierName / tierDescription) |
响应示例:
{
"code": 200,
"data": {
"records": [
{
"productId": 2043246204711550977,
"productNo": "C260409001",
"name": "额吉的故乡·亲子版",
"tripDays": 6,
"lineName": "草原环线",
"tiers": [
{"tierSeq": 1, "tierName": "标准档", "tierDescription": "三星酒店"},
{"tierSeq": 2, "tierName": "豪华档", "tierDescription": "四星酒店升级"}
]
}
],
"total": 10,
"page": 1,
"pageSize": 50
}
}
使用场景:下单搜索产品时,前端直接展示"有几档/具体档位",避免再次请求。
4. 产品档位下拉 GET /admin/product/item/{productId}/tiers 🆕
场景:下单弹窗内选档位用。算价接口需要 tierSeq 参数,前端必须先让用户选档位。
请求:路径参数 productId
响应:
{
"code": 200,
"data": [
{"tierSeq": 1, "tierName": "标准档", "tierDescription": "三星酒店"},
{"tierSeq": 2, "tierName": "豪华档", "tierDescription": "四星酒店升级"}
]
}
异常:产品不存在 → code=404,message="产品不存在: xxx"
5. 小程序档位对比 GET /mp/product/{id}/tier-compare
响应变化:tiers[].tierName 🆕 新增字段。
{
"code": 200,
"data": {
"tiers": [
{
"tierSeq": 1,
"tierName": "标准档", // 🆕
"hotels": [...]
},
{
"tierSeq": 2,
"tierName": "豪华档", // 🆕
"hotels": [...]
}
]
}
}
四、前端适配指南
小程序端
- 算价展示:渲染 4 类人员的单价和小计;固定定金产品场景下
depositAmount现在会随人数变化 - 档位对比页:用
tiers[].tierName作为卡片标题(此前只能显示"档位1"之类)
管理端
- 下单产品选择弹窗:
simple-list响应里直接拿tiers展示档位数;选中产品后用GET /{productId}/tiers渲染档位下拉 - 算价展示:渲染 4 类人员单价/小计
五、重启提示
需要重启的服务:hl-product-service-v2(端口 8083)
不涉及 DB DDL,仅代码变更;字段注释有更新(deposit_amount COMMENT),但不影响运行时。
六、关联 Issue/PR
| Issue | PR | 主题 |
|---|---|---|
| #717 | #718 | 固定定金按人数计算 |
| #719 | #720 | simple-list 补档位 + 档位下拉接口 |
| #721 | #722 | 算价补全 4 类人员单价 |
| #723 | #724 | 档位对比补 tierName |