docs(changelog): 19_fix_hl_ui feetype 方案调整 '手动' → '其他'

用户决策更新:不要 null + v-if 那套,改为最小一行字面量替换:
feeType: '手动' → feeType: '其他'。"其他" 是合法分类,admin chip 和
C 端主标题都正常显示。脏数据清理 SQL 同步改为 UPDATE = '其他'。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
这个提交包含在:
API Changelog Bot 2026-05-19 15:14:54 +08:00
父节点 c03a32b4ac
当前提交 b2618f97e8

查看文件

@ -11,7 +11,7 @@
## ⚠️ 关键变化
**前端 `CostDescPanel.vue` 把字符串字面量 `"手动"` 硬编码塞进 `feeType` 字段,导致 C 端小程序把这条"手动添加"的费用项渲染成独立分类卡片"手动",和「景区/游玩项目/餐饮/交通」等自动推导的分类并列,严重混淆视听。改 `feeType: '手动'``feeType: null` 即可。**
**前端 `CostDescPanel.vue` 把字符串字面量 `"手动"` 硬编码塞进 `feeType` 字段,导致 C 端小程序把这条"手动添加"的费用项渲染成独立分类卡片"手动",和「景区/游玩项目/餐饮/交通」等自动推导的分类并列。用户决策:`feeType: '手动'``feeType: '其他'`,**一行字面量改动,其他都不动**。**
---
@ -63,50 +63,32 @@ const secondary = feeType ? label : '' // 项目名降级作副标题
- 后端"自动推导"的 `feeType` 来源于资源类型:`景区 / 游玩项目 / 餐饮 / 交通` → 这些是合理的分类主标题。
- 但**手动添加**的项被前端塞了 `feeType="手动"`,走的是同一套逻辑,于是"手动"两个字就赫然摆在主标题位置,看起来像个独立分类。
### 顺带的 admin 侧问题 (第 231 行)
```vue
<div class="included-card__title">
<span class="included-card__type">{{ item.feeType }}</span> <!-- 第 231 行 -->
<span class="included-card__name">{{ item.name }}</span>
</div>
```
`<span class="included-card__type">` 是一个绿色小标签 chip,当 `feeType` 为 null 时会渲染成一个空白小绿块,影响 admin 卡片视觉。需要 `v-if` 跳过。
---
## 三、修复方案
## 三、修复方案(用户最终决策:**只改这一行,其他都不动**)
### 改动 1 (必须):去掉硬编码 "手动"
### 唯一改动:把硬编码的 "手动" 改成 "其他"
**文件**: `src/views/product/edit/components/supplement/CostDescPanel.vue`
**位置**: 第 159 行 `confirmAdd` 函数内
**位置**: 第 159 行 `confirmIncludedAdd` 函数内
```diff
- const item = { feeType: '手动', name, sourceNodeName: '' }
+ const item = { feeType: null, name, sourceNodeName: '' }
+ const item = { feeType: '其他', name, sourceNodeName: '' }
```
(或者更彻底,直接去掉 `feeType` 字段,JSON 序列化时不带这个 key,后端 VO 字段保持可空即可。两种写法效果等价,推荐 `feeType: null` 以显式表达"无分类"语义。)
效果:运营手动添加的费用项,C 端主标题显示"其他",和「景区/游玩项目/餐饮/交通」等并列,作为一个合理的"杂项"分类,语义清晰。admin 卡片左上角绿色 chip 显示"其他",也是正常态。
### 改动 2 (必须):admin 卡片避免渲染空白 chip
### 用户明确不要的改动(不要做)
**文件**: 同上
**位置**: 第 231 行模板
- ❌ 不要把 `feeType` 改成 `null` (用户原话:"手动改为其他 不需要改了")
- ❌ 不要给 admin 卡片 chip 加 `v-if` (因为新值"其他"是合法值,需要正常显示)
- ❌ 不要全局 grep 排查其他 `feeType:` 硬编码 (用户判断没必要)
- ❌ 不要动 C 端 `detail.js`
- ❌ 不要动后端任何代码 (不需要加 feeType 枚举校验)
```diff
- <span class="included-card__type">{{ item.feeType }}</span>
+ <span v-if="item.feeType" class="included-card__type">{{ item.feeType }}</span>
```
### 改动 3 (可选,建议同步检查)
第 111 行附近 `confirmAdd` for **费用不含** 那一侧的添加逻辑当前是写 `type: 'OTHER'` 而不是 `feeType`,跟"费用包含"侧不是同一字段,C 端渲染也走的另一条路径,**目前看着没问题,可以不动**。但建议 mmg 顺手 grep 一下整个 hl-ui 项目里所有 `feeType:` 的硬编码字符串,确认没有其他类似的字面量泄漏到数据库。
### C 端是否需要同步改
不需要。C 端 `detail.js:428` 那段 `primary = feeType ? feeType : label` 的逻辑本身**是对的** — 当 `feeType` 真的有合法分类值 (景区/餐饮等) 时确实应该作主标题。问题在于**不该有"手动"这种非分类字符串混进 feeType**,所以从源头 (admin 前端) 修就够了。
### 一行改动即可,无后续连锁修改
---
@ -115,20 +97,16 @@ const secondary = feeType ? label : '' // 项目名降级作副标题
mmg 前端发版到**正式环境**后,正式数据库有 1 条历史脏数据需要清理:
- **产品 ID**: `2056554654480248833`
- **脏记录**: `product_fee_item` 表中 `name = '升级满洲里套娃酒店' AND fee_type = '手动'` 这条 (sourceNodeName 为空)
- **清理方式**: 运营在 admin 产品编辑页 → 补充信息 → 费用说明 → 费用包含,**找到"升级满洲里套娃酒店"那张卡片,点删除,然后重新点"添加项目"再加一次即可**。新版前端会存 `feeType=null`,C 端就不会再显示"手动"主标题。
- **不需要后端 SQL 操作,运营自助即可完成**
如果运营嫌麻烦不愿意手动重操作,可以让后端 (wx) 跑一条 update:
- **脏记录**: `product_fee_item` 表中 `name = '升级满洲里套娃酒店' AND fee_type = '手动'`
- **清理方式 A (推荐)**: 运营在 admin 产品编辑页 → 补充信息 → 费用说明 → 费用包含,**找到"升级满洲里套娃酒店"那张卡片,点删除,然后重新点"添加项目"再加一次**。新版前端会存 `feeType='其他'`,C 端主标题就变成"其他",不再是"手动"。
- **清理方式 B (兜底,wx 自行决定是否动正式 DB)**:
```sql
UPDATE product_fee_item
SET fee_type = NULL
SET fee_type = '其他'
WHERE name = '升级满洲里套娃酒店' AND fee_type = '手动' AND product_id = 2056554654480248833;
```
但**建议优先走运营自助路径**,避免直接动正式 DB。
---
## 五、不需要后端配合
@ -141,7 +119,7 @@ WHERE name = '升级满洲里套娃酒店' AND fee_type = '手动' AND product_i
- ✅ 无 Nacos 配置变更
- ✅ 无 gateway 路由调整
mmg 直接在 hl-ui 改完 3 行,本地 `npm run build` 后发版即可。
mmg 直接在 hl-ui 改完 1 行(L159 `'手动'``'其他'`),本地 `npm run build` 后发版即可。
---
@ -150,9 +128,9 @@ mmg 直接在 hl-ui 改完 3 行,本地 `npm run build` 后发版即可。
发版到测试环境后,按以下步骤验证:
1. admin 测试环境登录,进入任意产品编辑页 → 补充信息 → 费用说明 → 费用包含
2. 点"添加项目",输入名称 (例如"测试手动项 xxx"),保存
3. 检查 Network 面板:`PUT /admin/product-v2/{id}/supplement` 请求 body 里这条新增项的 `feeType` 字段应为 `null` (或不存在该 key),**不是字符串 "手动"**
4. admin 页面回到查看模式,这张卡片左上角**不应有绿色"手动" chip**
5. 小程序对应产品的详情页「费用包含」区块,这条项**主标题应是项目名 (不是"手动")**
2. 点"添加项目",输入名称 (例如"测试其他项 xxx"),保存
3. 检查 Network 面板:请求 body 里这条新增项的 `feeType` 字段应为 `"其他"`,**不是 `"手动"`**
4. admin 页面回到查看模式,这张卡片左上角绿色 chip 应显示 **"其他"**(不是"手动",也不是空白)
5. 小程序对应产品的详情页「费用包含」区块,这条项**主标题应显示"其他"**(副标题是项目名)
全部 OK 再发正式。