# 2026-03-27 产品研学收获 + 备选人员详情 + Staff容错

## 一、新增：产品研学收获模块（PR #5）

与"安全保障"设计完全一致，管理端CRUD + 小程序详情返回。

### 管理端接口

| 方法 | 路由 | 说明 |
|------|------|------|
| GET | `/admin/product/{productId}/study-gain` | 研学收获列表 |
| POST | `/admin/product/{productId}/study-gain` | 添加研学收获 |
| PUT | `/admin/product/{productId}/study-gain/{id}` | 更新研学收获 |
| DELETE | `/admin/product/{productId}/study-gain/{id}` | 删除研学收获 |

### 请求体（POST/PUT）

```json
{
  "category": "马术体验",
  "name": "马术体验·培养勇气与平衡感",
  "description": "学习马术基本功",
  "icon": "horsemanship",
  "sortOrder": 1
}
```

### 小程序产品详情新增字段

`ProductVO.studyGains`：`[{icon, title, description}]`

与 `safetyItems` 格式完全一致，前端可直接复用安全保障的渲染组件。

---

## 二、修复：产品备选人员返回完整信息（PR #4）

### 变更

`ProductVO.staffConfigs` 每项新增 `staffDetails` 字段，包含备选人员的完整信息。

### 之前

```json
{
  "staffType": "LEADER",
  "staffIds": ["1005"],
  "staffDetails": null
}
```

### 现在

```json
{
  "staffType": "LEADER",
  "staffIds": ["1005"],
  "staffDetails": [
    {
      "staffId": "1005",
      "name": "刘大山",
      "coverUrl": "https://...",
      "phone": "13800001005",
      "staffType": "LEADER",
      "yearsOfExperience": 15,
      "rating": 4.9,
      "tags": [...],
      ...全部StaffVO字段
    }
  ]
}
```

---

## 三、修复：Staff素材ID解析容错（PR #3）

后端内部修复，前端无需改动。修复了素材ID字段包含非数字时导致500的问题。

`/internal/staff/batch-detail` 现在返回完整 StaffVO（之前只返回部分字段）。

---

## 部署说明

需重启：**hl-product-service**、**hl-resource-service**

测试环境需执行建表SQL：
```sql
CREATE TABLE product_study_gain (
    id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    category VARCHAR(50) NOT NULL,
    name VARCHAR(100) NOT NULL,
    description VARCHAR(500) DEFAULT NULL,
    icon VARCHAR(100) DEFAULT NULL,
    sort_order INT DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    deleted_at DATETIME DEFAULT NULL,
    PRIMARY KEY (id),
    KEY idx_product_id (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
