baldav/docs/session-logs/2026-09-18_merge-rides.md

3.9 KiB
Raw Blame History

Сессия 2026-09-18 - объединение поездок (склейка треков)

Контекст

Трек 16 сен: реально 5 заездов, но первый оказался в отдельной сессии (запись несколькими кусками). Нужна склейка: долгий тап = выделение, 2+ = объединить, разрыв >5 мин по времени - предупреждать но не мешать, только склейка (разрез/вырез были проблемными, позже). После склейки «Разбор повторов» должен увидеть все 5.

Сделано

  • Миграция: gps_points.orig_session_id TEXT - исходная сессия точки (для будущего разделения; склейка обратима без потери данных).
  • DB.mergeGpsSessions(idStrs) (db.js): сессии сортируются по времени, target = самая ранняя; точки остальных переносятся (session_id=target, orig_session_id=COALESCE(...)), end_time продлевается, лишние сессии удаляются. seq=NULL у объединённого трека - иначе совпадающие seq (у каждой сессии были 1..N) перемешивают порядок в getGpsPoints. Ids - строками с CAST в INTEGER (i64 corruption).
  • UI (renderGpsScreen): долгий тап 500мс (touch+mouse) -> режим выделения (.selected, плавающая #gps-sel-bar: «Выбрано N», «Объединить» (>=2), «Отмена»). Тап в режиме переключает. Клик после long-press подавляется. Диалог appConfirm с пометкой об обратимости; предупреждение о разрыве >5 мин. После склейки - recalculateSession (noDelete), тост, ре-рендер.
  • CSS: .gps-session-item.selected, .gps-sel-bar, фикс [hidden] (правило display:flex перебивало атрибут hidden - панель висела всегда).

Баги по пути (и фиксы)

  • Панель выделения показывалась всегда: .gps-sel-bar{display:flex} перебивал hidden. Фикс: .gps-sel-bar[hidden]{display:none}.
  • После склейки в приложении: участок 43 км, скорости 6745 км/ч. Причина: у трёх сессий seq совпадали (1..N), getGpsPoints (ORDER BY seq) перемешивал треки. В node-тесте я сортировал по ts и не поймал. Фикс: seq=NULL при склейке -> порядок по ts.

Проверка (десктоп Xvfb, подсажены 3 сессии 16 сен, БД восстановлена из бэкапа)

  • Node: склейка 3 сессий -> detectRepeats 5 заездов, 1572м, [21.4,20.1,21.1,20.9,22.5], 105% (по отдельности: две малые - «нет повторов», большая - 4).
  • В приложении: долгий тап выделил 11:38 (рамка+фон, «Выбрано 1»), тап добрал 11:50/12:04 («Выбрано 3»), «Объединить» -> диалог -> 3 сессии стали одной (11:38, 19.89 км, суммарно). Открыл: «Разбор повторов» = 5 заездов, совпало с node, каденс 88-93, вердикт 105%. Скрины.
  • Далее: сборка APK + проверка на телефоне (реальный трек 16 сен там же).

Не сделано (по просьбе - позже)

Разрезание и вырезание треков (были проблемы). Сейчас только склейка.