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>
这个提交包含在:
父节点
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` 来源于资源类型:`景区 / 游玩项目 / 餐饮 / 交通` → 这些是合理的分类主标题。
|
||||||
- 但**手动添加**的项被前端塞了 `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`
|
**文件**: `src/views/product/edit/components/supplement/CostDescPanel.vue`
|
||||||
**位置**: 第 159 行 `confirmAdd` 函数内
|
**位置**: 第 159 行 `confirmIncludedAdd` 函数内
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
- const item = { feeType: '手动', name, sourceNodeName: '' }
|
- 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
|
### 用户明确不要的改动(不要做)
|
||||||
|
|
||||||
**文件**: 同上
|
- ❌ 不要把 `feeType` 改成 `null` (用户原话:"手动改为其他 不需要改了")
|
||||||
**位置**: 第 231 行模板
|
- ❌ 不要给 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 条历史脏数据需要清理:
|
mmg 前端发版到**正式环境**后,正式数据库有 1 条历史脏数据需要清理:
|
||||||
|
|
||||||
- **产品 ID**: `2056554654480248833`
|
- **产品 ID**: `2056554654480248833`
|
||||||
- **脏记录**: `product_fee_item` 表中 `name = '升级满洲里套娃酒店' AND fee_type = '手动'` 这条 (sourceNodeName 为空)
|
- **脏记录**: `product_fee_item` 表中 `name = '升级满洲里套娃酒店' AND fee_type = '手动'`
|
||||||
- **清理方式**: 运营在 admin 产品编辑页 → 补充信息 → 费用说明 → 费用包含,**找到"升级满洲里套娃酒店"那张卡片,点删除,然后重新点"添加项目"再加一次即可**。新版前端会存 `feeType=null`,C 端就不会再显示"手动"主标题。
|
- **清理方式 A (推荐)**: 运营在 admin 产品编辑页 → 补充信息 → 费用说明 → 费用包含,**找到"升级满洲里套娃酒店"那张卡片,点删除,然后重新点"添加项目"再加一次**。新版前端会存 `feeType='其他'`,C 端主标题就变成"其他",不再是"手动"。
|
||||||
- **不需要后端 SQL 操作,运营自助即可完成**。
|
- **清理方式 B (兜底,wx 自行决定是否动正式 DB)**:
|
||||||
|
|
||||||
如果运营嫌麻烦不愿意手动重操作,可以让后端 (wx) 跑一条 update:
|
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
UPDATE product_fee_item
|
UPDATE product_fee_item
|
||||||
SET fee_type = NULL
|
SET fee_type = '其他'
|
||||||
WHERE name = '升级满洲里套娃酒店' AND fee_type = '手动' AND product_id = 2056554654480248833;
|
WHERE name = '升级满洲里套娃酒店' AND fee_type = '手动' AND product_id = 2056554654480248833;
|
||||||
```
|
```
|
||||||
|
|
||||||
但**建议优先走运营自助路径**,避免直接动正式 DB。
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 五、不需要后端配合
|
## 五、不需要后端配合
|
||||||
@ -141,7 +119,7 @@ WHERE name = '升级满洲里套娃酒店' AND fee_type = '手动' AND product_i
|
|||||||
- ✅ 无 Nacos 配置变更
|
- ✅ 无 Nacos 配置变更
|
||||||
- ✅ 无 gateway 路由调整
|
- ✅ 无 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 测试环境登录,进入任意产品编辑页 → 补充信息 → 费用说明 → 费用包含
|
1. admin 测试环境登录,进入任意产品编辑页 → 补充信息 → 费用说明 → 费用包含
|
||||||
2. 点"添加项目",输入名称 (例如"测试手动项 xxx"),保存
|
2. 点"添加项目",输入名称 (例如"测试其他项 xxx"),保存
|
||||||
3. 检查 Network 面板:`PUT /admin/product-v2/{id}/supplement` 请求 body 里这条新增项的 `feeType` 字段应为 `null` (或不存在该 key),**不是字符串 "手动"**
|
3. 检查 Network 面板:请求 body 里这条新增项的 `feeType` 字段应为 `"其他"`,**不是 `"手动"`**
|
||||||
4. admin 页面回到查看模式,这张卡片左上角**不应有绿色"手动" chip**
|
4. admin 页面回到查看模式,这张卡片左上角绿色 chip 应显示 **"其他"**(不是"手动",也不是空白)
|
||||||
5. 小程序对应产品的详情页「费用包含」区块,这条项**主标题应是项目名 (不是"手动")**
|
5. 小程序对应产品的详情页「费用包含」区块,这条项**主标题应显示"其他"**(副标题是项目名)
|
||||||
|
|
||||||
全部 OK 再发正式。
|
全部 OK 再发正式。
|
||||||
|
|||||||
正在加载...
x
在新工单中引用
屏蔽一个用户