diff --git a/changelogs/2026-04/30_frontend_cost-desc-panel-missing-youwan-feetype.md b/changelogs/2026-04/30_frontend_cost-desc-panel-missing-youwan-feetype.md new file mode 100644 index 0000000..aa4da11 --- /dev/null +++ b/changelogs/2026-04/30_frontend_cost-desc-panel-missing-youwan-feetype.md @@ -0,0 +1,99 @@ +# 前端 BUG: CostDescPanel 不展示「游玩项目」类型 + +**类型**: 前端 BUG(后端零改动) +**前端处理者**: yst / mmg +**日期**: 2026-04-30 +**影响范围**: 管理后台「产品编辑 → 补充信息 → 费用说明」页面 — 自动生成的费用包含列表 + +--- + +## 现象 + +产品编辑页 → 补充信息 → 费用说明 →「根据行程自动生成」按钮加载后,用户实测产品 `2045018534152478721`「游牧的森林·南线经典」: + +- 期望显示 **3 行**:景区 / **游玩项目** / 住宿 +- 实际只显示 **2 行**:景区 / 住宿 +- **「游玩项目」那行没出现** + +## 后端验证(测试服已部署 PR #1568 + #1577 + #1579 + #1581 + #1583) + +```bash +curl https://api.test.1814.love:9443/admin/product/item/2045018534152478721/fee-deduction-preview \ + -H "Authorization: Bearer " +``` + +**实测响应(3 条齐全)**: + +```jsonc +{ + "code": 200, + "data": [ + { + "feeType": "景区", + "name": "黑山头,白桦林景区,莫日格勒河,莫日格勒河断崖,呼伦湖,阿尔山火车站", + "source": "AUTO", + "sourceNodeName": null, + "icon": null + }, + { + "feeType": "游玩项目", // ← 后端有这条! + "name": "ATV全地形越野车穿越,驯鹿拉车体验", + "source": "AUTO", + "sourceNodeName": null, + "icon": null + }, + { + "feeType": "住宿", + "name": "海拉尔洲季酒店,呼伦贝尔香格里拉大酒店,额尔古纳玖成万豪水汇智能酒店,额尔古纳豪星酒店,额尔古纳白桦大酒店,海拉尔海棠酒店,满洲里饭店(百年俄式),敖根栖息地,阿尔善国际维景度假温泉酒店", + "source": "AUTO", + "sourceNodeName": null, + "icon": null + } + ] +} +``` + +后端返 3 条,前端展示 2 条 → **前端过滤掉了「游玩项目」**。 + +## 推测原因 + +后端 `feeType` 字段值演进历史(2026-04-30 同日): +- 旧值:`门票 / 活动 / 住宿 / 餐饮 / 交通`(NodeTypeEnum.getFeeLabel()) +- 新值:**`景区 / 游玩项目 / 住宿 / 餐饮 / 交通`**(PR #1581 加 displayLabel 映射) + +可能性 A:前端有 feeType 白名单(只允许 `门票/活动/住宿/餐饮/交通`),收到新的 `景区`/`游玩项目` 不在白名单被 filter 掉 → 但用户截图能看到「景区」chip,说明白名单包含「景区」却不含「游玩项目」(可能是前端字典只补了一半) + +可能性 B:前端有 feeType→中文显示名映射字典(比如 `{门票:'景区', 活动:'游玩项目'}`),后端改成直接返显示名后,字典里查不到 `游玩项目`(因为 key 是 `活动`),返 null/undefined 被 v-if 过滤 + +可能性 C:某个数据预处理 `data.filter(...)` 用了硬编码 feeType 列表 + +## 排查建议 + +请前端检查 `D:\work2\hl-ui\src\views\product\edit\components\supplement\CostDescPanel.vue`(或对应实际页面所在的 vue 组件),关键看: + +1. 数据加载后是否有 `filter`/`map` 处理 feeType +2. `