# 【行为变更·管理后台】新建订单「选主题/选产品」：热门改手动标签口径 + 小蒙马(GROUP)起价修复读班期

> 页面：管理后台 → 新建订单(order-v2/new) 第1步「选主题」+ 第2步「选产品」 | 服务：hl-product-service-v2 | PR #3925 + #3927 | 已合并 dev-v3 + 部署测试服 + API 实测通过(2026-06-17) | 负责：mmg
> 触发：wx 在页面反馈①热门应按运营手动标签②「起价都不对」。审计定位 + 修复。

## ⚠️ 关键变更(3 项,前端需知)

### 1. 第1步「选主题」热门口径：自动计算 → 手动标签
- **变更前**：`hot` 由后端按「近90天下单量前30%」自动算。
- **变更后**：`hot` = 该主题 `tags` 是否包含「热门」标签(运营在『产品线管理』手动打的 product_tag 字典标签,**所见即所得**)。
- **前端**：「热」角标 + 「热门主题·直接进入」入口仍只看 `hot` 字段;入口 = 本地 `filter(hot==true)`,无独立接口。运营打了「热门」标签的主题才热。

### 2. 第1步「选主题」VO 新增返回 `tags` / `seasons`
`GET /admin/product/line/order-picker` 的 `OrderPickerThemeVO` 新增两字段:
| 字段 | 类型 | 含义 |
|---|---|---|
| `tags` | List\<String> | 主题标签(product_tag 字典:热门/新品/限定/硬核/治愈) |
| `seasons` | List\<String> | 适用季节(spring/summer/autumn/winter) |

前端如需在主题卡展示标签/季节可直接用(此前精简 VO 不返回,需前端自渲染)。

### 3. 小蒙马(GROUP)起价修复:第1步 `fromPrice` + 第2步 `startPrice`/`tierPrices`
- **Bug**：GROUP(小蒙马)真实价在班期表 `group_tour_batch.adult_price`,但选主题/选产品接口此前只读价格日历 → **所有小蒙马起价恒为 null(页面显示空白/价待定)**。
- **修复后**：GROUP 起价改读班期表未来最低成人价(CORE/CUSTOM 仍走价格日历,口径与产品编辑页 min-price 一致)。
- **实测**(测试服,部署后):

| 主题 | 类型 | 修复前 fromPrice | 修复后 fromPrice |
|---|---|---|---|
| 阿斯蒂芬撒点 | GROUP | null(空白) | **2925.00** |
| 测试小蒙马-yst | GROUP | null(空白) | **1635.00** |

  第2步选产品:测试小蒙马 4 个产品 startPrice 均 = 1635.00,各档位 tierPrices 同价。

> 注:CORE/CUSTOM 主题若仍显示「价待定」,是该主题下产品**未设未来可售价格日历**(真·无价),非 bug,与本次无关。

## 金额字段口径(前端注意)
- `OrderPickerThemeVO.fromPrice`、`OrderPickerProductVO.startPrice`、`tierPrices[].startPrice` 均为**字符串**(@JsonSerialize ToString,防大数精度丢失),前端展示前 `parseFloat` + null 兜底。
- ⚠️ 本次给 `TierPriceInfo.startPrice` 补了字符串序列化,**同时影响**产品详情/产品列表接口里的 `tierPrices[].startPrice`(由数字变字符串)。如这两个页面对该字段做了数字运算,请改 `parseFloat`。

## SKU 总数 / 产品数 口径澄清(顺带答疑)
- 主题卡「X 个 SKU」= **档位(tier/规格)总数** = 该主题下各已上架产品的档位数之和。
- 第2步「X 个产品可选」= **产品(版本)数**。
- 二者单位不同,不矛盾。例:测试小蒙马 4 个产品(多档2+多档2+单档1+单档1)= 6 个 SKU,故主题卡显示「6 个 SKU」、第2步显示「4 个产品可选」,均正确。
- 头部「SKU 总数」= 各主题 skuCount 之和(前端派生,无独立接口)。

## 不变项
- 第2步选产品的 `hot`(热销)**仍是计算口径**(近90天下单量),本次未改;但第2步 VO 已返回 `tags`,前端如需也可按「热门」标签渲染。
