hl-api-changelog/changelogs/2026-04/2026-04-20_early-bird-multi-plan.md
API Changelog Bot 812fd5d787 feat(2026-04-20): 第一期 BUG 修复 + 3 大新功能上线(早鸟多方案/备品组合/高德地图)
本批变更(测试环境已部署验证):
1. 后端修复 9 个 BUG(#956/957/958/959/960 + hotfix #965/966/967)
2. BUG 10 产品地图支持高德自动生成(#962)
3. BUG 15 备品组合功能(#963)
4. BUG 20 早鸟优惠改造为 1:N 多方案(#964)

前端待跟进 BUG:1/2/5/6/8/12/19
2026-04-20 12:26:50 +08:00

146 行
5.8 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# 早鸟优惠改造:产品 1:N 多方案 + 阶梯文案BUG 20
**日期**2026-04-20
**PR**#964 + hotfix #967
**影响**:管理端早鸟优惠管理页 + 小程序产品详情页 + 下单报价
---
## 业务变化
### 1. 一个产品可绑定多个早鸟方案
**改造前**:产品 1:1 方案。管理端创建第 2 个绑定同一产品的方案报错「以下产品已绑定其他早鸟计划,不能重复绑定」。
**改造后**:产品 1:N。可以配阶梯
- 2 人打 9 折 (`minPeople=2, maxPeople=2, discountType=PERCENT, discountPercent=90`)
- 3-5 人打 85 折 (`minPeople=3, maxPeople=5, discountType=PERCENT, discountPercent=85`)
- 6 人及以上打 8 折 (`minPeople=6, maxPeople=null, discountType=PERCENT, discountPercent=80`)
报价时后端按订单人数自动匹配最优方案,落 `order_discount` 表。
### 2. 优惠类型扩展3 种)
`discount_type` 字段新增:
| 值 | 含义 | 示例 | 需填字段 |
|---|---|---|---|
| `AMOUNT_TOTAL`**默认** | 整单立减 | 整单减 500 元 | `discountAmount` |
| `AMOUNT_PER_PERSON` | 每人立减 | 每人减 100 元 | `discountAmount` |
| `PERCENT` | 按比例打折 | 8 折 | `discountPercent` (0-100) |
**⚠️ 重要:老数据默认为 `AMOUNT_TOTAL`**(历史上运营侧约定 `discountAmount=500` 即整单立减 500,所以迁移时存量数据全部回正为 `AMOUNT_TOTAL`)。
---
## 接口变化
### 1. 创建/更新方案(兼容老调用,新字段可选)
**`POST /admin/order/early-bird`**
**`PUT /admin/order/early-bird/{planId}`**
`EarlyBirdPlanSaveReqVO` 新增字段:
```ts
{
"planName": "阶梯档 3-5 人 85 折",
"startDate": "2026-04-01",
"endDate": "2026-12-31",
"enabled": true,
"productIds": [123456],
// 老字段
"minPeople": 3,
"discountAmount": 0, // AMOUNT_TOTAL/PER_PERSON 必填;PERCENT 可为 null
// 新字段
"maxPeople": 5, // NEW 最高人数(含),不传=不限
"discountType": "PERCENT", // NEW 默认 AMOUNT_TOTAL
"discountPercent": 85, // NEW PERCENT 时必填 (0<v<100)
"priority": 0 // NEW 同区间多命中决胜,默认 0
}
```
### 2. 响应 VO 新增字段
`EarlyBirdPlanVO`(列表/详情)新增后端拼好的**文案字段**
```ts
{
"peopleRangeText": "3-5 人", // NEW 例:"2 人"/"3-5 人"/"6 人及以上"
"discountText": "85 折", // NEW 例:"9 折"/"每人立减 100 元"/"整单立减 500 元"
// ... 其他 4 个新业务字段maxPeople/discountType/discountPercent/priority
}
```
前端可直接用 `peopleRangeText``discountText` 做展示,无需自己拼。
### 3. 不再校验产品唯一
`POST /admin/order/early-bird` 去掉 `以下产品已绑定其他早鸟计划,不能重复绑定` 校验。同一 `productId` 可出现在任意多个方案。
### 4. 小程序产品详情页新增字段
**`GET /mp/product/item/{id}`** 响应 `MpProductDetailRespVO` 新增:
```ts
{
"earlyBirdTip": "最低 8 折起(共 3 档早鸟方案)", // 无人数上下文的概览文案,无绑定=null
"earlyBirdLadder": [ // 早鸟阶梯(按 min_people 升序)
{
"planId": "123",
"peopleRangeText": "2 人",
"discountText": "9 折",
"startDate": "2026-04-01",
"endDate": "2026-12-31"
},
{ "planId": "124", "peopleRangeText": "3-5 人", "discountText": "85 折", ... },
{ "planId": "125", "peopleRangeText": "6 人及以上", "discountText": "8 折", ... }
]
}
```
前端可按 ladder 画阶梯图。老字段 `earlyBirdTip` 语义微调为「概览性描述」,不再只拿第 1 个方案。
### 5. 小程序下单按人数本地匹配
前端可用 `earlyBirdLadder` 按用户选择的人数本地计算匹配档位,展示「您当前 X 人,命中 'Y 人 Z 折';满 M 人可升级到 'N 折'」提示。
---
## 前端 TODO
### 管理端早鸟优惠管理页
1. 方案编辑表单加 **4 个新输入项**
- 最高人数(数字,可空=不限)
- 优惠类型(单选:整单立减/每人立减/按比例打折),默认**整单立减**
- 折扣率0-100,仅"按比例打折"时启用)
- 优先级(数字,默认 0
2. 原"优惠金额 discountAmount"改为仅在"整单立减/每人立减"时启用
3. 产品绑定改为**多选 tag**(去掉 1:1 限制,可一个产品绑多个方案)
4. 建议加"阶梯预览"区块显示该产品当前所有方案的覆盖情况,帮肉眼核对重叠/漏洞
5. 列表展示:用后端返回的 `peopleRangeText + discountText` 直接显示,不用前端拼
### 小程序产品详情页
1.`earlyBirdLadder` 画阶梯图3 档示意)
2. `earlyBirdTip` 作为默认概览展示(如"最低 8 折起"
3. 老字段 `earlyBirdText``earlyBirdPlanName``earlyBirdDiscount` 废弃(值可能为 null 或第 1 档概览),请改读 `earlyBirdLadder[0]`
### 小程序下单页
1. 用户选完人数 + 日期后本地按 `earlyBirdLadder` 匹配:
```
match = ladder.find(l => totalPeople >= l.minPeople && (l.maxPeople == null || totalPeople <= l.maxPeople))
```
2. 匹配到方案时,提示文案可参考:`"您当前 N 人,命中 '${peopleRangeText} ${discountText}'"`
3. 可顺带提示"更优档位":若 `ladder` 里有 `minPeople > totalPeople` 且折扣更大的,提示"满 X 人可享 Y"
---
## 兼容性
- 老数据:全部默认 `discount_type=AMOUNT_TOTAL`,行为不变(整单立减)
- 老接口:`EarlyBirdPlanSaveReqVO` 新字段全部可选,旧版管理端提交不传也可
- 老订单:已支付订单不回溯,`order_discount` 持久化的 `discount_amount` 不变
- 废弃但保留:`earlyBirdText/earlyBirdPlanName/earlyBirdDiscount` 三个老字段继续下发(值按新逻辑计算),下个大版本下架