hl-api-changelog/changelogs/2026-04/0402-product-grade.md

124 行
4.2 KiB
Markdown

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

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

# 产品版本分组 + 产品线绑定类型 (PR #129, #131, #132, #133)
> 日期: 2026-04-02 | 服务: hl-product-service | 需重启: 是
## 功能概述
1. **产品版本分组**:同一行程的不同版本(如"轻奢版""高档版")可关联为一组,列表合并为一张卡片,详情页可切换版本
2. **产品线绑定产品类型**:创建产品线时指定类型,创建产品时按类型筛选产品线
## 核心概念
- 产品名本身就是版本名(如"呼伦贝尔5天·轻奢版"、"呼伦贝尔5天·高档版"
- 同一 `gradeGroupId` 的产品是同行程的不同版本
- `gradeGroupId` 为 null = 独立产品,不属于任何版本组
---
## 接口变更
### 1. 产品列表C端
**接口**: `GET /mp/product/list`
同一版本组的产品只返回一条,附带所有版本选项。
**新增返回字段**:
| 字段 | 类型 | 说明 |
|------|------|------|
| `gradeGroupId` | String | 版本分组ID,null=独立产品 |
| `gradeOptions` | Array | 同组所有版本选项,null=独立产品 |
| `gradeOptions[].productId` | String | 该版本的产品ID |
| `gradeOptions[].name` | String | 产品名(即版本名) |
| `gradeOptions[].startPrice` | Number | 起步价 |
| `gradeOptions[].startPriceLabel` | String | "起" 或 "订金起" |
**返回示例(有版本组的产品)**:
```json
{
"productId": "123",
"name": "呼伦贝尔5天·轻奢版",
"gradeGroupId": "123",
"gradeOptions": [
{"productId": "123", "name": "呼伦贝尔5天·轻奢版", "startPrice": 3999, "startPriceLabel": "起"},
{"productId": "456", "name": "呼伦贝尔5天·高档版", "startPrice": 6999, "startPriceLabel": "起"}
]
}
```
**返回示例(独立产品,不受影响)**:
```json
{
"productId": "789",
"name": "丽江3天自由行",
"gradeGroupId": null,
"gradeOptions": null
}
```
### 2. 产品详情C端
**接口**: `GET /mp/product/{productId}`
product 对象中新增 `gradeGroupId``gradeOptions`
**前端切换版本**:用 `gradeOptions` 中其他版本的 `productId` 重新调用此接口。
### 3. 推荐产品列表C端
**接口**: Feign `GET /internal/mp/product/recommend`
同样新增版本字段,同版本组去重。
### 4. 管理端产品列表/详情
新增 `gradeGroupId` 字段(不去重,管理端显示所有产品)。
### 5. [新增] 版本分组查询
**接口**: `GET /admin/product/item/grade-groups?lineId=xxx`
**用途**: 管理端创建版本产品时,查询已有分组列表
**返回**: `[{gradeGroupId, groupName, lineId, products: [{productId, name}]}]`
### 6. 产品保存
**接口**: `POST /admin/product/item/save`
**新增请求字段**:
| 字段 | 类型 | 说明 |
|------|------|------|
| `gradeGroupId` | Long | 版本分组ID。传`0`=新建分组,传已有ID=加入该组,不传=不分组 |
### 7. 产品线接口变更
**接口**: `GET /admin/product/line/active`
**新增参数**: `productType`可选,CORE/GROUP/CUSTOM/ROUTE
**行为**: 传参时只返回该类型的产品线 + 未绑定类型的产品线
**接口**: `POST /admin/product/line`(创建产品线)
**新增请求字段**: `productType`(可选,绑定产品类型)
**产品线VO新增字段**: `productType`
---
## 前端开发指引
### 列表页
- `gradeOptions != null && gradeOptions.length > 1` 时,显示版本选项
- 卡片示例: `[轻奢版 ¥3,999起] [高档版 ¥6,999起]`(用 name + startPrice 展示)
- `gradeOptions == null` 的产品照常展示
### 详情页
- `gradeOptions != null && gradeOptions.length > 1` 时,顶部显示版本切换tab
- 当前版本高亮(匹配 productId
- 点击其他版本 → 用该 productId 重新请求详情
- 报价/下单用当前 productId
### 管理端-创建产品
1. 选择产品类型CORE/GROUP等
2. 产品线下拉调用 `GET /admin/product/line/active?productType=CORE` 只显示对应类型的线
3. 如需创建版本组:`gradeGroupId``0`新建组或传已有组ID加入组
---
## DDL已在本地/测试/正式执行)
```sql
-- 产品线加类型
ALTER TABLE product_line ADD COLUMN product_type VARCHAR(16) DEFAULT NULL AFTER name;
-- 产品表只保留 grade_group_idproduct_grade 和 grade_sort 已删除)
-- grade_group_id + idx_grade_group_id 保持不变
```