# 价格日历状态去除「已预留」+ 定制产品详情接口强类型化 > 日期: 2026-03-19 | 服务: hl-product-service, hl-mp-service --- ## 一、变更说明 ### 1. 价格日历状态字典变更 `calendar_status` 字典删除 `RESERVED`(已预留)状态,无实际业务场景。 **变更前(4个状态)**: | dict_value | dict_label | |------------|-----------| | AVAILABLE | 可售 | | SOLD_OUT | 已售罄 | | CLOSED | 已关闭 | | ~~RESERVED~~ | ~~已预留~~ | **变更后(3个状态)**: | dict_value | dict_label | |------------|-----------| | AVAILABLE | 可售 | | SOLD_OUT | 已售罄 | | CLOSED | 已关闭 | **前端需处理**:价格日历编辑弹窗中「状态」下拉选项去除「已预留」。 --- ### 2. C端定制产品详情接口强类型化 `GET /hl-mp-service/mp/custom/product/{productId}` 查询已完成的定制产品详情 **变更前**:`data` 字段为 `Map`(Knife4j 显示 object,无字段结构) **变更后**:`data` 字段为强类型 `MpCustomProductDetailVO`,与核心产品详情返回相同的完整结构,包含: - 行程天列表 `itineraryDays` → 行程节点 `nodes` → 资源详情 `resourceDetail`(含 `cover` 封面图、`images` 轮播图、`address` 地址等) - 每日酒店 `hotels`(含 `coverUrl`、房型名称、家庭分配) - 每日用餐 `restaurants`(含 `coverUrl`、餐次、价格) - 定价配置 `pricing`(完整定价模式、支付方式等) - 成本项 `costItems`、自定义费用 `customFees`、物资 `suppliesList` - 人员配置 `staffConfigs`、家庭分组 `families` - 权益说明 `benefitsDescription` **前端无需改代码**,返回数据结构不变,仅 Knife4j 文档从 object 变为完整字段定义,方便查阅。 --- ### 3. 修复:resourceDetail 字段始终为 null 的 BUG **影响范围**:所有产品类型(核心产品、小蒙马、定制产品)的详情接口 **问题**:行程节点中的 `resourceDetail` 字段(包含资源封面图、轮播图、地址、经纬度等)始终返回 `null`,原因是数据库存储的 `resourceType` 为小写(`scenic`、`activity`、`restaurant`、`service`),但代码匹配时使用大写(`SCENIC`、`HOTEL`),导致无法匹配到资源 ID。 **修复后**:`resourceDetail` 正常返回,包含以下字段: ```json { "resourceDetail": { "resourceId": "资源ID", "resourceType": "SCENIC/ACTIVITY/HOTEL/RESTAURANT/SERVICE", "name": "资源名称", "subtitle": "副标题", "cover": "封面图URL", "images": ["轮播图URL列表"], "address": "地址", "longitude": "经度", "latitude": "纬度", "city": "城市", "tags": ["标签列表"] } } ``` **前端需处理**:之前如果因为 `resourceDetail` 为 `null` 做了兼容处理(如显示占位图),现在可以直接使用真实数据。 --- ### 4. 新增:SERVICE(服务项)资源类型支持 批量资源详情查询接口新增对 `SERVICE` 类型资源的支持。行程中包含服务项(如接机、送机)时,`resourceDetail` 也会返回完整信息(封面图、地址等)。 **影响接口**: - `GET /mp/custom/product/{productId}` — 定制产品详情 - `GET /mp/product/{productId}` — 核心产品详情 - `GET /mp/product/group-tour/{productId}` — 小蒙马详情