日程详情卡:行程条目没有出发地和目的地(FbCalEventFull 缺字段) #69

Open
opened 2026-11-05 08:18:22 +00:00 by laoyang · 1 comment
Owner

日程详情卡:行程条目没有出发地和目的地

用户(2026-11-05)

「点击行程里旅行日历本里的信息时,弹出来的那个框是在首页上弹出的,
还是没有出发地和目的地。」

现状

FbEventSheet(日程详情卡)只渲染三样与位置有关的东西:

this.event.location   → 一行「地点」

而行程派生条目(kind = 'trip')根本没有 location ——
服务端 Calendar::month() 的 trip 段从来没输出过 location 字段,
它输出的是 from_place / to_place(#67 才刚补上)。

于是详情卡里:

时间      2026-11-07 16:50–21:41
日历本    旅行
重复      ...
(没有地点行,因为 location 是空串)
备注      ...

用户看不到「北京南站 → 青岛北站」,也无法从详情卡导航。

根因链

  1. 服务端 trip 段不输出 location(正确 —— 行程没有单一"地点"概念)
  2. FbCalEvent 已在 #67 加上 fromPlace / toPlace 和坐标 ✅
  3. 但 FbCalEventFull 没有这三个字段 ← 断点在这
  4. shellOf() 只把 b.place 塞进 location
  5. FbEventSheet 只读 event.location

改法

① FbCalEventFull 加字段

fromPlace: string;
toPlace: string;
fromLng: string; fromLat: string;
toLng: string; toLat: string;

② shellOf() 传递

首页 FbHomePage.shellOf() 与日程页 FbCalendarPage.shellOf() 两处都要改
(两个独立实现,容易只改一处)。

③ FbEventSheet 增加两行

navRow 现在硬编码标签「地点」,改成接受标签参数(仍是有限个参数,
但要守住「@Builder 多值参数不参与状态观察」这条坑
—— 详情卡是每次打开才重建,
不存在"数据变了行不刷新"的场景,所以安全)。

渲染顺序:

条件 显示
有 fromPlace 「出发地 xxx」可导航
有 toPlace 「目的地 xxx」可导航
有 location 「地点 xxx」可导航(普通日程走这条)

三者互不冲突:行程条目通常只有前两个,普通日程只有第三个。

④ 导航目标

出发地 → 用 fromLng/fromLat;目的地 → 用 toLng/toLat。
没有坐标时传地名让 FbNav 自己地理编码。

验收

  • 点日程里行程条目 → 详情卡显示「出发地」「目的地」两行
  • 两行都能点,点了能导航
  • 普通日程仍显示「地点」一行(行为不变)
  • 首页和日程页两个入口表现一致

相关:#67(服务端已带出 from_place/to_place 与坐标,本单是端上详情卡没消费)


为什么单独建单

#67 改的是日历卡片列表上的显示与 Calendar::month() 的输出;本单是端上详情浮层(FbEventSheet)没消费那两个字段,断点在 FbCalEventFull 与 shellOf()。同一需求的下游一环,但文件与验收点不同。

# 日程详情卡:行程条目没有出发地和目的地 ## 用户(2026-11-05) > 「点击行程里旅行日历本里的信息时,弹出来的那个框是在首页上弹出的, > 还是没有出发地和目的地。」 ## 现状 `FbEventSheet`(日程详情卡)只渲染三样与位置有关的东西: ``` this.event.location → 一行「地点」 ``` 而**行程派生条目**(`kind = 'trip'`)根本没有 `location` —— 服务端 `Calendar::month()` 的 trip 段从来没输出过 `location` 字段, 它输出的是 `from_place` / `to_place`(#67 才刚补上)。 于是详情卡里: ``` 时间 2026-11-07 16:50–21:41 日历本 旅行 重复 ... (没有地点行,因为 location 是空串) 备注 ... ``` 用户看不到「北京南站 → 青岛北站」,也无法从详情卡导航。 ## 根因链 1. 服务端 trip 段不输出 `location`(正确 —— 行程没有单一"地点"概念) 2. `FbCalEvent` 已在 #67 加上 `fromPlace` / `toPlace` 和坐标 ✅ 3. **但 `FbCalEventFull` 没有这三个字段** ← 断点在这 4. `shellOf()` 只把 `b.place` 塞进 `location` 5. `FbEventSheet` 只读 `event.location` ## 改法 ### ① `FbCalEventFull` 加字段 ```typescript fromPlace: string; toPlace: string; fromLng: string; fromLat: string; toLng: string; toLat: string; ``` ### ② `shellOf()` 传递 首页 `FbHomePage.shellOf()` 与日程页 `FbCalendarPage.shellOf()` **两处都要改** (两个独立实现,容易只改一处)。 ### ③ `FbEventSheet` 增加两行 `navRow` 现在硬编码标签「地点」,改成接受标签参数(**仍是有限个参数, 但要守住「@Builder 多值参数不参与状态观察」这条坑** —— 详情卡是每次打开才重建, 不存在"数据变了行不刷新"的场景,所以安全)。 渲染顺序: | 条件 | 显示 | |---|---| | 有 fromPlace | 「出发地 xxx」可导航 | | 有 toPlace | 「目的地 xxx」可导航 | | 有 location | 「地点 xxx」可导航(普通日程走这条) | 三者互不冲突:行程条目通常只有前两个,普通日程只有第三个。 ### ④ 导航目标 出发地 → 用 `fromLng`/`fromLat`;目的地 → 用 `toLng`/`toLat`。 没有坐标时传地名让 `FbNav` 自己地理编码。 ## 验收 - [ ] 点日程里行程条目 → 详情卡显示「出发地」「目的地」两行 - [ ] 两行都能点,点了能导航 - [ ] 普通日程仍显示「地点」一行(行为不变) - [ ] 首页和日程页两个入口表现一致 相关:#67(服务端已带出 from_place/to_place 与坐标,本单是端上详情卡没消费) --- ### 为什么单独建单 #67 改的是日历卡片列表上的显示与 Calendar::month() 的输出;本单是端上详情浮层(FbEventSheet)没消费那两个字段,断点在 FbCalEventFull 与 shellOf()。同一需求的下游一环,但文件与验收点不同。
Author
Owner

二次反馈修复(2026-11-05 17:21)

用户反馈原话:

「导航的,点进去导航之后,为什么目的地地址前面有个问号」

根因:我把 URI 语法用在了普通文本上

上一轮的 navTargetOf() 拼的是:

return lat + ',' + lng + '?' + place;   // ❌

那个 ? 是照抄 geo:lat,lng?q=地名 这个 URI 的写法。
但这里拼出来的字符串不是 URI,它是交给 fbOpenNavigation() 的普通文本。

FbNav.parseGeoOf() 的实际动作是:

  1. 正则抓 数字,数字 当坐标
  2. clean = 把坐标从原文里剪掉之后剩下的文字,用作显示地名

所以:

输入  36.168977,120.375693?青岛北站
剪掉坐标后剩  ?青岛北站        ← 问号留下了

这个 clean 直接进了高德的 dname 参数,于是目的地标题显示成「?青岛北站」。

修法

改成地名在前、空格、坐标在后:

return place + ' ' + lat + ',' + lng;   // ✅
输入  青岛北站 36.168977,120.375693
剪掉坐标后剩  青岛北站          ← 干净

实测验证(复刻 parseGeoOf 逻辑跑)

=== 旧写法(带问号)===
输入: 36.168977,120.375693?青岛北站
坐标: 36.168977 120.375693   地名(clean):[?青岛北站]  ← ❌

=== 新写法 ===
输入: 青岛北站 36.168977,120.375693
坐标: 36.168977 120.375693   地名(clean):[青岛北站]   ← ✅

=== 无坐标 ===
输入: 青岛北站
ok: false(走系统地理编码,正确)

两处都改了

文件 位置
FbEventSheet.ets navTargetOf()(#69 新增的)
FbDayEventPanel.ets 行程卡片 onClick(#67 里同一个错误)

第二处是 #67 留下的同一类 bug —— 当时拼的也是 lat,lng?地名,
只是那次没人点导航所以没暴露。这次一并修掉。

## 二次反馈修复(2026-11-05 17:21) 用户反馈原话: > 「导航的,点进去导航之后,为什么目的地地址前面有个问号」 ### 根因:我把 URI 语法用在了普通文本上 上一轮的 `navTargetOf()` 拼的是: ```typescript return lat + ',' + lng + '?' + place; // ❌ ``` 那个 `?` 是照抄 `geo:lat,lng?q=地名` 这个 **URI** 的写法。 但这里拼出来的字符串**不是 URI**,它是交给 `fbOpenNavigation()` 的普通文本。 `FbNav.parseGeoOf()` 的实际动作是: 1. 正则抓 `数字,数字` 当坐标 2. **`clean` = 把坐标从原文里剪掉之后剩下的文字**,用作显示地名 所以: ``` 输入 36.168977,120.375693?青岛北站 剪掉坐标后剩 ?青岛北站 ← 问号留下了 ``` 这个 `clean` 直接进了高德的 `dname` 参数,于是目的地标题显示成「?青岛北站」。 ### 修法 改成**地名在前、空格、坐标在后**: ```typescript return place + ' ' + lat + ',' + lng; // ✅ ``` ``` 输入 青岛北站 36.168977,120.375693 剪掉坐标后剩 青岛北站 ← 干净 ``` ### 实测验证(复刻 `parseGeoOf` 逻辑跑) ``` === 旧写法(带问号)=== 输入: 36.168977,120.375693?青岛北站 坐标: 36.168977 120.375693 地名(clean):[?青岛北站] ← ❌ === 新写法 === 输入: 青岛北站 36.168977,120.375693 坐标: 36.168977 120.375693 地名(clean):[青岛北站] ← ✅ === 无坐标 === 输入: 青岛北站 ok: false(走系统地理编码,正确) ``` ### 两处都改了 | 文件 | 位置 | |---|---| | `FbEventSheet.ets` | `navTargetOf()`(#69 新增的) | | `FbDayEventPanel.ets` | 行程卡片 onClick(#67 里同一个错误) | 第二处是 #67 留下的同一类 bug —— 当时拼的也是 `lat,lng?地名`, 只是那次没人点导航所以没暴露。这次一并修掉。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/FamilyBook#69