# 集合地/解散地迁移到每日行程

- **日期**: 2026-04-16
- **服务**: hl-product-service-v2
- **PR**: #617
- **类型**: refactor (破坏性变更)

## ⚠️ 破坏性变更

`gatherPlace` 和 `dismissalPlace` 从**产品级**迁移到**每日行程天级**。

### 之前（已废弃）

```
PUT /admin/product/item/{id}/itinerary
{
  "gatherPlace": "海拉尔",     ← 产品级，已删除
  "dismissalPlace": "海拉尔",  ← 产品级，已删除
  "days": [...]
}
```

### 现在

⚠️ **字段类型改为JSON对象**（存高德行政区搜索返回的完整数据）

```
PUT /admin/product/item/{id}/itinerary
{
  "days": [{
    "dayNumber": 1,
    "gatherPlace": {
      "name": "海拉尔区",
      "adcode": "150702",
      "center": "119.736279,49.212189",
      "level": "district"
    },
    "dismissalPlace": {
      "name": "额尔古纳市",
      "adcode": "150784",
      "center": "120.180506,50.243102",
      "level": "city"
    },
    "dayTitle": "D1",
    "nodes": [...]
  }, {
    "dayNumber": 2,
    "gatherPlace": {"name": "额尔古纳市", "adcode": "150784", "center": "120.18,50.24", "level": "city"},
    "dismissalPlace": {"name": "满洲里市", "adcode": "150781", "center": "117.45,49.59", "level": "city"},
    ...
  }]
}
```

### 管理端详情响应

`GET /admin/product/item/{id}` 的 `itinerary[]` 中每天包含：

| 字段 | 类型 | 说明 |
|------|------|------|
| `gatherPlace` | Object | 当日集合地 `{name, adcode, center, level}` |
| `dismissalPlace` | Object | 当日解散地 `{name, adcode, center, level}` |
| `dailyMileage` | BigDecimal | 当日里程(km)，自动计算 |
| `dailyDuration` | Integer | 当日驾车时长(分钟)，自动计算 |

### 小程序端详情响应

`GET /mp/product/{id}` 的 `itinerary[]` 中每天同样包含 `gatherPlace`/`dismissalPlace`/`dailyMileage`/`dailyDuration`。

**产品级不再有这两个字段。**

### Step3路线与备品

`PUT /admin/product/item/{id}/route` 也不再有 `gatherPlace`/`dismissalPlace`。

### 途经路线自动生成

每天的途经路线格式：`当天集合地 → 景区/活动节点 → 当天解散地`
