diff --git a/client/src/pages/gps/RoutesTab.tsx b/client/src/pages/gps/RoutesTab.tsx index 12d9f31..a294620 100644 --- a/client/src/pages/gps/RoutesTab.tsx +++ b/client/src/pages/gps/RoutesTab.tsx @@ -332,6 +332,12 @@ export function GpsRoutesTab() { {trackData?.sampled && ` (всего ${trackData.total}, показана каждая N-я)`} {pointsThinned && `, маркеров на карте: ${displayedPoints.length}`} + {(trackData?.filteredCount ?? 0) > 0 && ( + + Отфильтровано мусорных точек:{' '} + {trackData!.filteredCount} + + )} Пробег: {stats.distance.toFixed(1)} км diff --git a/client/src/pages/gps/SettingsTab.tsx b/client/src/pages/gps/SettingsTab.tsx index e25f02a..e7da7ef 100644 --- a/client/src/pages/gps/SettingsTab.tsx +++ b/client/src/pages/gps/SettingsTab.tsx @@ -11,12 +11,13 @@ import { useToast } from '@/hooks/use-toast'; interface GpsSettings { success: boolean; jitterMeters: number; + maxJumpSpeedKmh: number; } /** * Таб «Настройки» GPS-модуля. - * Секция «Трекинг»: фильтр дрожания позиции (джиттер) — сервер не записывает - * точки ближе N метров при скорости < 5 км/ч. Сюда же позже добавятся + * Секция «Трекинг»: фильтры входящих точек — дрожание позиции (джиттер) + * и максимальный скачок скорости (LBS-прыжки). Сюда же позже добавятся * другие настройки модуля — структура секций-Card под это готова. */ export function GpsSettingsTab() { @@ -26,15 +27,22 @@ export function GpsSettingsTab() { }); const [jitterMeters, setJitterMeters] = useState('0'); + const [maxJumpSpeedKmh, setMaxJumpSpeedKmh] = useState('0'); useEffect(() => { - if (data) setJitterMeters(String(data.jitterMeters)); + if (data) { + setJitterMeters(String(data.jitterMeters)); + setMaxJumpSpeedKmh(String(data.maxJumpSpeedKmh)); + } }, [data]); const saveMutation = useMutation({ mutationFn: async () => { - const value = Number(jitterMeters); - const res = await apiRequest('PUT', '/api/gps/settings', { jitterMeters: value }); + // Оба поля сохраняются одним PUT (непереданные на сервере сохраняются) + const res = await apiRequest('PUT', '/api/gps/settings', { + jitterMeters: Number(jitterMeters), + maxJumpSpeedKmh: Number(maxJumpSpeedKmh), + }); return res.json(); }, onSuccess: () => { @@ -49,7 +57,9 @@ export function GpsSettingsTab() { }, }); - const jitterValid = /^\d+$/.test(jitterMeters.trim()) && Number(jitterMeters) >= 0 && Number(jitterMeters) <= 1000; + const isIntInRange = (v: string, max: number) => /^\d+$/.test(v.trim()) && Number(v) >= 0 && Number(v) <= max; + const jitterValid = isIntInRange(jitterMeters, 1000); + const jumpValid = isIntInRange(maxJumpSpeedKmh, 5000); return (
@@ -84,10 +94,29 @@ export function GpsSettingsTab() {

Целое число от 0 до 1000

)}
+ +
+ + setMaxJumpSpeedKmh(e.target.value)} + /> +

+ 0 = выключен. Точки, требующие перемещения быстрее N км/ч от предыдущей, + отбрасываются — отсекает LBS-прыжки на вышки при потере GPS. Действует на новые точки. +

+ {!jumpValid && ( +

Целое число от 0 до 5000

+ )} +
+