# 【行为变更·管理后台】新建订单「选主题/选产品」:热门改手动标签口径 + 小蒙马(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\ | 主题标签(product_tag 字典:热门/新品/限定/硬核/治愈) | | `seasons` | List\ | 适用季节(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`,前端如需也可按「热门」标签渲染。