diff --git a/changelogs/2026-04/30_fe-bug_product_itinerary-gather-place-render-mismatch.md b/changelogs/2026-04/30_fe-bug_product_itinerary-gather-place-render-mismatch.md new file mode 100644 index 0000000..23a093b --- /dev/null +++ b/changelogs/2026-04/30_fe-bug_product_itinerary-gather-place-render-mismatch.md @@ -0,0 +1,81 @@ +# 前端 BUG 通知:产品行程编排 DAY 1「开始」集合地渲染缺字 + +**类型**: 前端 BUG (后端零改动) +**关联**: 经验 `nselect-tag-mode-stringify-race.md` (2026-04-20 同类) + `two-render-paths-same-data-isolate-component-bug.md` +**日期**: 2026-04-30 +**前端处理者**: yst / mmg +**复现路径**: `web.test.1814.love:9443/product/edit?id=2045018534152478721` → Step 2 行程编排 → DAY 1 "专车接机+自由活动" + +--- + +## 现象 + +DAY 1 卡片: +- **「开始」(集合地)** 输入框显示 `海拉尔` ← **缺"区"字** +- **「结束」(解散地)** 输入框显示 `海拉尔区` ← 正常 + +二者使用同一个 CitySelect 组件,**同一份数据,两处渲染结果不一致**。 + +## 后端排查 (零问题) + +### DB 实际值 (192.168.100.236 / hl_product_service / product_itinerary_day) + +```jsonc +gather_place: {"name": "海拉尔区", "level": "district", "adcode": "150702", "fullPath": "内蒙古自治区/呼伦贝尔市/海拉尔区", "levelName": "区/县"} +dismissal_place: {"name": "海拉尔区", "level": "district", "adcode": "150702", "fullPath": "内蒙古自治区/呼伦贝尔市/海拉尔区", "levelName": "区/县"} +``` + +**两字段值完全相同**,name 都是"海拉尔区"。 + +### 后端 RespVO 结构 (`ItineraryDayRespVO.java:24-26`) + +```java +private Object gatherPlace; // line 24 +private Object dismissalPlace; // line 26 +``` + +两字段都是 `Object` 类型对称返回,JSON 输出格式一致。**后端零嫌疑**。 + +## 根因 + +memory 经验 `experience/backend-dev/nselect-tag-mode-stringify-race.md` (2026-04-20) 直接命中: + +> CitySelect 集合地/解散地下拉框显示 JSON 串/原 ID 而非中文。三件套触发: tag 开 + value 是 JSON 对象 + options 异步。不影响保存仅显示。 + +本次"海拉尔" vs "海拉尔区" 缺字也是同根: **CitySelect tag 模式下 watch 异步,在 options 还没加载完时,直接对 value.name 字符串做了截断/部分匹配显示**。两个字段渲染时机不同导致一处对一处错。 + +## 前端待修 + +### 复现步骤 + +1. 进入产品 `2045018534152478721` 编辑页 +2. 切到 Step 2 行程编排 +3. DAY 1 "专车接机+自由活动" 展开 +4. 看「开始」和「结束」两个输入框 → "开始" 显示 `海拉尔` (缺字),"结束" 显示 `海拉尔区` (正常) + +### 待排查方向 + +参考 4-20 经验文件,可能修复方向: +1. CitySelect 组件 `value` 与 `options` 加载完成的同步问题 — 等 options 都 ready 再渲染 tag +2. tag 模式 + JSON value 对象 + 异步 options 三件套是否其中之一可去掉 +3. 显示层用 `fullPath` 兜底而不是 `name`?或者用 `name` 时确保完整字符串不被截断 +4. 4-20 那次只修了部分场景(可能某个组件路径或某个父组件的 props 传递),这次新的复现说明遗漏 + +### 验证 + +修完后: +- 重新进入同一产品编辑页 +- DAY 1 "开始" 和 "结束" 都应显示 `海拉尔区` +- 切换 DAY 2/3/4/5 同样验证 +- 切换 Step 后再回 Step 2 验证 watch 复测 +- 保存后 reload 页面再验证 + +## 后端不动 + +后端 RespVO 字段类型对称,DB 数据正确,gather_place 与 dismissal_place 完全等价。本次纯 UI 渲染 BUG,后端零改动。 + +## 关联经验沉淀 + +- `experience/backend-dev/nselect-tag-mode-stringify-race.md` — 4-20 同根问题 +- `experience/bug-analyst/two-render-paths-same-data-isolate-component-bug.md` — 同对象两处渲染不一致 = 锁定组件 BUG +- `feedback_frontend-bug-no-issue-changelog-only.md` — 前端 BUG 不建工单只发 changelog