# 价格日历状态去除「已预留」+ 定制产品详情接口强类型化

> 日期: 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<String, Object>`（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}` — 小蒙马详情
