# /mp 产品详情 & 列表补 `category` 字段

**日期**: 2026-04-20
**PR**: #1010
**服务**: hl-product-service-v2

## 背景
管理端可以给产品配「产品分类」（`产品分类 *`：亲子游 / 蜜月旅行 / 摄影之旅 / 深度体验 / 自驾越野），保存后 DB 里 `product.category` 有值；但小程序详情 + 卡片列表拿不到这个字段，无法按分类展示或筛选。

## 改动
在下列两个响应 VO 顶层加 `category: string`（字典 `product_category`）：

| 接口 | VO |
|------|----|
| `GET /mp/product/{id}` | `MpProductDetailRespVO.category` |
| `GET /mp/product-line/{lineId}/products` | `MpProductListRespVO.category`（每项） |

## 字典 product_category
| 值 | 中文 |
|-----|------|
| `family` | 亲子游 |
| `honeymoon` | 蜜月旅行 |
| `photography` | 摄影之旅 |
| `experience` | 深度体验 |
| `driving` | 自驾越野 |

未配置的老产品 `category=null`，前端按空兜底即可。

## 响应示例

### `GET /mp/product/2045345825172639746`
```json
{
  "code": 200,
  "data": {
    "productId": "2045345825172639746",
    "productType": "CORE",
    "category": "photography",     // 新增
    "name": "游牧的森林-短途版",
    "subtitle": "呼伦贝尔南线4天3晚秋色短途版",
    "...": "..."
  }
}
```

### `GET /mp/product-line/{lineId}/products`
```json
{
  "code": 200,
  "data": [
    {
      "productId": "2042549263955648513",
      "productType": "CORE",
      "category": "photography",   // 新增
      "name": "测试核心产品",
      "...": "..."
    }
  ]
}
```

## 已有能力（未变化）
- `GET /mp/product-line/{lineId}/products?category=photography` —— `category` 筛选参数之前已经支持，本次只补响应字段。

## 缓存
- `mp:product:detail:{id}`、`mp:products-by-line:{lineId}[:cat:{category}]`
- 部署时异步清过一次；旧结构 JSON 不含 `category`，反序列化不会报错（只是取到 null），TTL 5–10 分钟内自愈。

## 存量数据
**无需迁移**。`product.category` 已长期存在于 DB。之前只是响应未透出。

## 前端建议
- 直接从顶层读 `banner_card_item.category` / `product_detail.category`
- 无值时按「未分类」显示或不展示标签
