# fix(product-v2): /mp/product/** 全量补 CUSTOM 支持（#900 follow-up）

> **服务**: hl-product-service-v2
> **PR**: #903（接续 #900）
> **Issue**: #901
> **日期**: 2026-04-19
> **前端是否需要改动**: **可能需要，视前端是否已调 B 类接口**（详见下文）

---

## 一、背景

PR #900 只修了 `/mp/product/{id}` 主详情，其他 5 个 `/mp/product/{id}/**` 子接口对 CUSTOM 产品仍 404。本 PR 一次性收口 `/mp/product/**` 下所有子接口的 CUSTOM 支持。

---

## 二、变更接口（10 个子接口分 3 类处理）

### A 类 - 行为修复：放行 CUSTOM（1 个）

| 接口 | 方法 | 路径 | 新行为 |
|------|------|------|-------|
| 日酒店详情 | GET | `/mp/product/{id}/day/{dayNumber}/hotels` | CUSTOM + COMPLETED/ORDERED 放行返回 200 |

### B 类 - 行为修复：明确拒绝 CUSTOM（4 个）

业务上 CUSTOM 产品是一口价、无班期、无多档位，这些接口本来就不适用。原来模糊 404，现在改为**明确业务异常**：

| 接口 | 方法 | 路径 | CUSTOM 产品新响应 |
|------|------|------|------------------|
| 价格日历 | GET | `/mp/product/{id}/price-calendar?month=xxx` | `{"code":500,"message":"定制产品不支持本接口","success":false}` |
| 班期 | GET | `/mp/product/{id}/schedules` | 同上 |
| 档位对比 | GET | `/mp/product/{id}/tier-compare` | 同上 |
| 算价 | POST | `/mp/product/{id}/quote` | 同上 |

> **注**：`code=500` 是项目 BusinessException 的默认业务码，HTTP 状态仍是 200。前端应按 `message="定制产品不支持本接口"` 字面识别，不要按 `code` 跳转错误页。

### C 类 - 无变化（5 个）

- `/mp/product/{id}` (PR #900 已修)
- `/mp/product/{id}/day/{dayNumber}` (PR #900 已修)
- `/mp/product/hotel/**`、`/mp/product/room-type/**`（产品无关）
- `/mp/product/compare`（自然过滤）

---

## 三、前端行动项

### 如果前端**没有**对 CUSTOM 产品调用 B 类接口：无需改动

### 如果前端**有**调用：

**推荐**：前端详情页按产品 productType 隐藏/禁用无意义的入口：
- CUSTOM 产品详情页 **不渲染**：价格日历 / 班期列表 / 档位对比 tab / 立即报价按钮
- CUSTOM 产品只展示：基本信息、行程、每日酒店、描述、图集

**兜底**：如果没法按 productType 前置判断，收到 `message="定制产品不支持本接口"` 时静默降级，不要弹全局错误。

### 清理历史 workaround

| 可清理 | 原因 |
|--------|------|
| 对 `/mp/product/{id}/day/{n}/hotels` 的 CUSTOM 特殊兜底 | 现已正常返回 |
| CUSTOM 产品详情页对主接口 404 的全局兜底 | PR #900 已修 |

---

## 四、完整状态可见性矩阵

| productType | status | 详情/日酒店 | 日历/班期/档位/算价 |
|-------------|--------|------------|---------------------|
| CORE / GROUP | DRAFT/PENDING_REVIEW | 404 | 404 |
| CORE / GROUP | PUBLISHED | **200** | **200** |
| CUSTOM | DRAFT/PENDING_REVIEW | 404 | 404 |
| CUSTOM | COMPLETED/ORDERED | **200**（本次修复） | **500 "定制产品不支持本接口"**（本次明确拒） |

---

## 五、测试环境已验证

CUSTOM 产品 `2045390643479412737`（7天6晚草原VIP私定）：
```
GET /tier-compare           → 500 "定制产品不支持本接口" ✓
GET /price-calendar         → 500 "定制产品不支持本接口" ✓
GET /schedules              → 500 "定制产品不支持本接口" ✓
POST /quote                 → 500 "定制产品不支持本接口" ✓
GET /day/1/hotels           → 200（含 dayNumber/tiers）✓
```

CORE 产品 `2045424500610125825`：
```
GET /price-calendar         → 200 ✓
GET /tier-compare           → 200 ✓
GET /schedules              → 200 ✓
```
