日程里的行程条目:图标按出行方式、去掉✓、显示出发地与目的地可导航 #67

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

首页/日程里的行程条目:图标按出行方式、去掉 ✓、显示出发地与目的地

用户(2026-11-05)

「鸿蒙端首页的行程,也就是日程里面,如果有行程添加到日程里,上边会显示一个目的地图标。
这个图标应该来自里面具体的交通工具,也就是说,如果是火车,就应该显示火车。」

「后面这个对号是什么意思?表示它是一个实际行程吗?我感觉没必要,直接把这个对号去掉。」

「如果行程里面有地址,也就是有出发地和目的地,应该像行程里显示的那样,
把它显示在下面,这样一点就可以导航。」

三件事

① 图标要用出行方式,不是节点类型

现状(app/Calendar.php 第 1667 行左右):

'title' => Trip::typeIcon((string)$n['node_type']) . ...

Trip::typeIcon('move') 恒为 🚗 —— 「赶路」永远显示汽车,哪怕实际坐的是火车。

改法:改用 Trip::leadIcon($node_type, $travel_mode, $family_id)。
这个方法是 2026-11-05 早些时候为旅行详情页做的(行程卡左侧图标),
优先级是「出行方式 > 节点类型」,与用户要的一致。

⚠️ SQL 要补 n.travel_mode 字段。

② 去掉 ✓

((string)($n['node_stage'] ?? 'plan') === 'actual' ? ' ✓ ' : ' ')

用户明确不要。直接删掉这段三元表达式,标题就是纯标题。

③ 显示出发地 → 目的地,且可点导航

SQL 现在只查了 node_type/status/stage/title/starts_at/ends_at,
完全没有 from_place / to_place。

要补:

  • n.from_place, n.to_place
  • n.from_lng, n.from_lat, n.to_lng, n.to_lat(导航用)

输出字段里加:

  • from_place / to_place:显示用
  • from_lng / from_lat / to_lng / to_lat:点击导航用

鸿蒙端 FbCalEvent 要加对应字段,并在渲染时分两行画在标题下面。
网页端 日历视图的条目太小,只在详情浮层的 rows 里补「出发地 / 目的地」两行即可。

范围

  • 服务端:app/Calendar.php 的 trip 派生段
  • 鸿蒙端:FbCalEvent 加字段 + FbDayEventPanel / FbDayTimeline 渲染
  • 网页端:fb_entry_json() 的 rows 补两行

验收

  • 火车行程在日程里显示 🚄,不是 🚗
  • 实际行程的标题前面没有 ✓
  • 有出发地/目的地的行程,卡片下方显示「出发地 → 目的地」
  • 点击该行可以打开导航

为什么单独建单

与 #58/#60 都无关:那两张是悬浮栏圆角和首页标题配色。本单是 Calendar::window() 里 trip_nodes 派生段的标题拼装与字段缺失,属日历模块的派生逻辑。

# 首页/日程里的行程条目:图标按出行方式、去掉 ✓、显示出发地与目的地 ## 用户(2026-11-05) > 「鸿蒙端首页的行程,也就是日程里面,如果有行程添加到日程里,上边会显示一个目的地图标。 > 这个图标应该来自里面具体的交通工具,也就是说,如果是火车,就应该显示火车。」 > > 「后面这个对号是什么意思?表示它是一个实际行程吗?我感觉没必要,直接把这个对号去掉。」 > > 「如果行程里面有地址,也就是有出发地和目的地,应该像行程里显示的那样, > 把它显示在下面,这样一点就可以导航。」 ## 三件事 ### ① 图标要用出行方式,不是节点类型 现状(`app/Calendar.php` 第 1667 行左右): ```php 'title' => Trip::typeIcon((string)$n['node_type']) . ... ``` `Trip::typeIcon('move')` 恒为 🚗 —— 「赶路」永远显示汽车,哪怕实际坐的是火车。 **改法**:改用 `Trip::leadIcon($node_type, $travel_mode, $family_id)`。 这个方法是 2026-11-05 早些时候为旅行详情页做的(行程卡左侧图标), 优先级是「出行方式 > 节点类型」,与用户要的一致。 ⚠️ SQL 要补 `n.travel_mode` 字段。 ### ② 去掉 ✓ ```php ((string)($n['node_stage'] ?? 'plan') === 'actual' ? ' ✓ ' : ' ') ``` 用户明确不要。直接删掉这段三元表达式,标题就是纯标题。 ### ③ 显示出发地 → 目的地,且可点导航 SQL 现在只查了 `node_type/status/stage/title/starts_at/ends_at`, **完全没有 from_place / to_place**。 要补: - `n.from_place`, `n.to_place` - `n.from_lng`, `n.from_lat`, `n.to_lng`, `n.to_lat`(导航用) 输出字段里加: - `from_place` / `to_place`:显示用 - `from_lng` / `from_lat` / `to_lng` / `to_lat`:点击导航用 **鸿蒙端** `FbCalEvent` 要加对应字段,并在渲染时分两行画在标题下面。 **网页端** 日历视图的条目太小,只在详情浮层的 rows 里补「出发地 / 目的地」两行即可。 ## 范围 - 服务端:`app/Calendar.php` 的 trip 派生段 - 鸿蒙端:`FbCalEvent` 加字段 + `FbDayEventPanel` / `FbDayTimeline` 渲染 - 网页端:`fb_entry_json()` 的 rows 补两行 ## 验收 - [ ] 火车行程在日程里显示 🚄,不是 🚗 - [ ] 实际行程的标题前面**没有** ✓ - [ ] 有出发地/目的地的行程,卡片下方显示「出发地 → 目的地」 - [ ] 点击该行可以打开导航 --- ### 为什么单独建单 与 #58/#60 都无关:那两张是悬浮栏圆角和首页标题配色。本单是 Calendar::window() 里 trip_nodes 派生段的标题拼装与字段缺失,属日历模块的派生逻辑。
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#67