docs: 补齐产品详情内部接口保险字段 (HL #768 / Issue #767)

hl-product-service-v2 的 /internal/product/{id}/detail 新增
insuranceSchemeId + insuranceNotice,下游 order-v2 可省一次
getAutomationConfig 调用
这个提交包含在:
API Changelog Bot 2026-04-17 20:06:49 +08:00
父节点 729c1358d2
当前提交 079e74af3a

查看文件

@ -0,0 +1,93 @@
# 补齐:产品详情内部接口增加保险字段
> **服务**: hl-product-service-v2 (端口 8093)
> **PR**: #768
> **Issue**: #767
> **日期**: 2026-04-17
> **影响范围**: 所有调用 `/internal/product/{id}/detail` 的下游服务典型order-service-v2 做订单快照)
---
## 现象(下游感知)
调用 `GET /internal/product/{productId}/detail` 时,响应体中**没有保险相关字段**,下游order-service-v2拿不到保险方案 ID 和保险告知状态,只能额外再调 `GET /internal/product/{id}/automation-config` 才能补齐。
## 根因
`InternalProductService.getProductDetail()` 内部用 `BeanUtil.toBean(product, InternalProductDetailVO.class)` 只复制了 `ProductDO` 的字段,**没查 `ProductSupplementDO`**(与 product 1:1 关联的补充配置表,存 `insurance_scheme_id` / `insurance_notice` 等)。导致 VO 缺保险字段。
同 Service 的 `getAutomationConfig()` 方法本来就正确查过补充表,这次把产品详情接口对齐这套写法。
## 修复
### 1. `InternalProductDetailVO` 新增 2 个字段
| 字段 | 类型 | 说明 |
|------|------|------|
| `insuranceSchemeId` | Long | 保险方案 ID下游下单/快照可直接用) |
| `insuranceNotice` | String | 保险告知状态(字典 `insurance_notice`: `INCLUDED`=含保险 / `EXCLUDED`=不含 / `OPTIONAL`=可选) |
### 2. Service 补查补充配置
`InternalProductService.getProductDetail()``BeanUtil.toBean` 之后追加一次 `supplementDataService.selectById(productId)`,空安全赋值两个保险字段无补充配置supplement=null或字段本身为 null 时,VO 保持 null。
## 接口契约
**向后兼容,只新增字段,不改旧字段、不改路径、不改参数。**
### `GET /internal/product/{productId}/detail`
**请求**(无变化):
| 参数 | 位置 | 类型 | 说明 |
|------|------|------|------|
| `productId` | path | Long | 产品 ID |
| `date` | query可选 | LocalDate | 班期日期 |
**响应(新增字段,其他字段不变)**
```json
{
"code": 200,
"message": "success",
"data": {
"productId": 100001,
"name": "呼伦贝尔7日游",
"subtitle": "...",
"productType": "CORE",
"category": "...",
"status": "ON_SALE",
"tripDays": 7,
"tripNights": 6,
"coverImageUrl": "https://...",
"lineId": 9001,
"carouselImages": [...],
"insuranceSchemeId": 8888, // 新增 — 可能为 null
"insuranceNotice": "INCLUDED", // 新增 — 可能为 null字典 insurance_notice
"tiers": [...],
"seasons": [...],
"tags": [...],
"itinerary": [...],
"hotels": [...],
"restaurants": [...],
"staff": [...]
}
}
```
## 前端/下游影响
- **order-service-v2**:以后调 `/internal/product/{id}/detail` 直接能拿到保险字段做订单快照,可以省掉一次 `getAutomationConfig` 的 Feign 调用
- **其他下游**:接口完全向后兼容,不读新字段不受影响;需要保险信息的场景现在可以直接用
- **字典**`insurance_notice` 枚举值 `INCLUDED` / `EXCLUDED` / `OPTIONAL`,下游做展示时自行映射中文
## 需要重启的服务
**hl-product-service-v2端口 8093**。其他服务无需重启。
## 测试
- 单元测试 9 个全绿(`InternalProductServiceDetailTest`,含保险字段 3 场景:有 supplement / 无 supplement / 字段为 null
- 接口契约层面:只追加字段、不改旧字段,序列化由 Jackson 保证,兼容性安全