feat(gps): режим «потерян GPS» — LBS-точки помечаются (is_lbs), примерная позиция на карте, пунктир в треке; OSRM map matching трека (matched endpoint + переключатель «По дорогам»)

This commit is contained in:
2026-08-28 17:22:57 +03:00
parent 5d45084af1
commit 60bd52b75a
15 changed files with 374 additions and 42 deletions

View File

@@ -3998,6 +3998,10 @@ export const gpsAssets = pgTable("gps_assets", {
// Время последнего GPS-фикса по устройству (из stale re-send = замороженный fix, либо свежая принятая точка)
lastGpsFixAt: timestamp("last_gps_fix_at"), // время ПРИЁМА последней точки сервером (онлайн-индикатор)
lastRecordedAt: timestamp("last_recorded_at"), // время последней точки по устройству (fixTime)
// Режим «потерян GPS»: трекер присылает stale re-send'ы, свежие точки считаются LBS
gpsLost: boolean("gps_lost").notNull().default(false),
// Последняя принятая точка — LBS (координаты сотовой вышки, не GPS)
lastIsLbs: boolean("last_is_lbs").notNull().default(false),
createdAt: timestamp("created_at").defaultNow(),
}, (table) => ({
orgIdx: index("gps_assets_org_idx").on(table.organizationId),
@@ -4018,6 +4022,9 @@ export const gpsPositions = pgTable("gps_positions", {
speed: doublePrecision("speed"),
course: doublePrecision("course"),
accuracy: doublePrecision("accuracy"),
// Точка — координаты сотовой вышки (LBS), а не GPS-фикс; сохраняется и
// отображается (пунктир), но не участвует в логике геозон
isLbs: boolean("is_lbs").notNull().default(false),
recordedAt: timestamp("recorded_at").notNull(),
createdAt: timestamp("created_at").defaultNow(),
}, (table) => ({