diff --git a/client/src/pages/gps/AssetsTab.tsx b/client/src/pages/gps/AssetsTab.tsx
index d97d871..25a822c 100644
--- a/client/src/pages/gps/AssetsTab.tsx
+++ b/client/src/pages/gps/AssetsTab.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react';
-import { useMutation } from '@tanstack/react-query';
+import { useMutation, useQuery } from '@tanstack/react-query';
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
@@ -9,7 +9,7 @@ import { Switch } from '@/components/ui/switch';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
-import { Loader2, Pencil, Plus, Trash2, BellRing } from 'lucide-react';
+import { Loader2, Pencil, Plus, Trash2, BellRing, Satellite } from 'lucide-react';
import { apiRequest } from '@/lib/queryClient';
import { useToast } from '@/hooks/use-toast';
import { invalidateGps, useGpsAssetSubscribers, useGpsAssets, useOrgUsers } from '@/hooks/useGps';
@@ -21,6 +21,12 @@ function formatDateTime(value: string | null): string {
return new Date(value).toLocaleString('ru-RU');
}
+/** Потерян ли GPS: последний фикс старше порога (часов) */
+function isGpsLost(lastGpsFixAt: string | null | undefined, thresholdHours: number): boolean {
+ if (!lastGpsFixAt) return false; // данных ещё не было — не пугаем
+ return Date.now() - new Date(lastGpsFixAt).getTime() > thresholdHours * 3600_000;
+}
+
function userLabel(u: { firstName?: string; lastName?: string; email: string; fullName?: string }): string {
return u.fullName || `${u.firstName || ''} ${u.lastName || ''}`.trim() || u.email;
}
@@ -50,6 +56,13 @@ const EMPTY_FORM: AssetFormState = {
export function GpsAssetsTab() {
const { toast } = useToast();
const { data, isLoading } = useGpsAssets();
+ // Порог потери GPS (часов) из настроек организации
+ const { data: gpsSettings } = useQuery<{ gpsLostHours?: number }>({
+ queryKey: ['/api/gps/settings'],
+ queryFn: async () => (await apiRequest('GET', '/api/gps/settings')).json(),
+ staleTime: 60_000,
+ });
+ const gpsLostHours = gpsSettings?.gpsLostHours ?? 5;
const { data: usersData } = useOrgUsers();
const assets = data?.assets || [];
const users = usersData?.users || [];
@@ -173,6 +186,15 @@ export function GpsAssetsTab() {
style={{ backgroundColor: asset.isOnline ? '#22c55e' : '#9ca3af' }}
/>
{asset.isOnline ? 'Онлайн' : 'Офлайн'}
+ {isGpsLost(asset.lastGpsFixAt, gpsLostHours) && (
+
+
Целое число от 0 до 5000
}+ Если трекер не видел спутники дольше N часов (шлёт только старый фикс + или позицию по вышкам), на вкладке «Объекты» показывается предупреждение + «Нет GPS» с временем последнего фикса. +
+ {!gpsLostValid &&Целое число от 1 до 72
} +