行程:#47~#51 打包 —— 双轨状态、动态类型、动作按钮、去提示 (#51)

#47 编辑浮层居中、类型换行、去掉手动状态选择、按钮改胶囊
#48 计划/实际双轨:完成即转实际行程,取消≠删除,记真实开始/结束时间
#50 类型点击无反应(@Builder 值传参不建立依赖)
#51 节点类型动态加载(服务端9种,原端上硬编码5种)+ 地址结构化回调

API 新增:GET /trips/<id>/node-types、PATCH /trips/<id>/nodes/action
DB 新增:trip_nodes.actual_started_at / actual_ended_at
This commit is contained in:
2026-11-05 12:40:57 +08:00
parent a1140437a1
commit f58a128816
9 changed files with 1361 additions and 46 deletions
+16
View File
@@ -1542,6 +1542,22 @@ SQL,
"ADD COLUMN `revised_at` DATETIME DEFAULT NULL COMMENT '最后一次修正时间' AFTER `stage`");
self::addColumn($db, 'trip_nodes', 'revision_n',
"ADD COLUMN `revision_n` INT NOT NULL DEFAULT 0 COMMENT '修正次数' AFTER `revised_at`");
/* 🔴 #48(2026-11-05):**真实开始 / 结束时间**。
用户:「我计划今天 8:00 到 10:00 开车去公园,但我可能出门晚了,
8:10 或 8:30 才点『开始』按钮。这时候就要记录住 8:30 这个时间,
因为 8:30 会成为实际行程的开始时间。也就是说,
**原来计划的时间和现在真正开始的时间都要记录**。」
⚠️ 不能复用 `starts_at` / `ends_at`(那是**计划**时间),
改掉等于把计划丢了。两者并存才能"计划 8:00–10:00 / 实际 8:30–10:30"。
⚠️ 列名带 `actual_` 前缀,与 `starts_at` 形成清晰对照。 */
self::addColumn($db, 'trip_nodes', 'actual_started_at',
"ADD COLUMN `actual_started_at` DATETIME DEFAULT NULL
COMMENT '真实开始时间(点「开始」那一刻;NULL=还没开始)' AFTER `ends_at`");
self::addColumn($db, 'trip_nodes', 'actual_ended_at',
"ADD COLUMN `actual_ended_at` DATETIME DEFAULT NULL
COMMENT '真实结束时间(点「完成」那一刻;NULL=还没完成)' AFTER `actual_started_at`");
// ② 建修正历史表(老库没有)
self::tryStep('建行程修正历史表', static function () use ($db) {
$db->exec(<<<'SQL'