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

@@ -146,10 +146,11 @@ export class GpsStorage {
* Обновление последней позиции объекта (и перевод в online).
* last_seen_at = время ПРИЁМА сервером (new Date() здесь),
* last_recorded_at = время точки по устройству (recordedAt).
* isLbs = последняя точка — LBS (координаты вышки), см. режим «потерян GPS».
*/
async updateAssetLastPosition(
assetId: number,
data: { lat: number; lng: number; speed?: number | null; course?: number | null; recordedAt: Date }
data: { lat: number; lng: number; speed?: number | null; course?: number | null; recordedAt: Date; isLbs?: boolean }
): Promise<void> {
await db
.update(gpsAssets)
@@ -160,11 +161,24 @@ export class GpsStorage {
lastCourse: data.course ?? null,
lastSeenAt: new Date(),
lastRecordedAt: data.recordedAt,
lastIsLbs: data.isLbs ?? false,
isOnline: true,
})
.where(eq(gpsAssets.id, assetId));
}
/**
* Переключение режима «потерян GPS» у объекта.
* true — трекер присылает stale re-send'ы (не видит спутники), свежие точки
* помечаются как LBS; false — нормальный режим.
*/
async setGpsLost(assetId: number, lost: boolean): Promise<void> {
await db
.update(gpsAssets)
.set({ gpsLost: lost })
.where(eq(gpsAssets.id, assetId));
}
/**
* Отметка «устройство живо» без обновления координат
* (точка отброшена фильтром джиттера, но приём был).