изменение логики работы поиска датчиков из дашборд и истории тревог по конкретному этажу

This commit is contained in:
2026-02-05 22:21:25 +03:00
parent 6caf1c9dbb
commit bad3b63911
13 changed files with 2861 additions and 793 deletions

View File

@@ -119,7 +119,7 @@ export interface NavigationStore {
getActiveSidebarItem: () => number
// Навигация к датчику на 3D-модели
navigateToSensor: (sensorSerialNumber: string, floor: number | null, viewType: 'building' | 'floor') => Promise<string | null>
navigateToSensor: (sensorSerialNumber: string, floor: number | null, viewType: 'building' | 'floor') => Promise<{ sensorSerialNumber: string; modelPath: string } | null>
}
const useNavigationStore = create<NavigationStore>()(
@@ -399,40 +399,54 @@ const useNavigationStore = create<NavigationStore>()(
targetZone = currentZones[0]
console.log('[navigateToSensor] Building view - selected first zone:', targetZone?.name)
} else if (viewType === 'floor') {
// Для вида на этаже - ищем зону, где есть этот датчик
// Сначала проверяем зоны с sensors массивом
for (const zone of currentZones) {
if (zone.sensors && Array.isArray(zone.sensors)) {
const hasSensor = zone.sensors.some(s =>
s.serial_number === sensorSerialNumber ||
s.name === sensorSerialNumber
// Для вида на этаже - ищем зону, где есть этот датчик (исключая order=0)
// Фильтруем зоны: исключаем общий план (order=0)
const floorZones = currentZones.filter(z => z.order !== 0 && z.model_path)
console.log('[navigateToSensor] Searching in floor zones (excluding order=0):', floorZones.length)
console.log('[navigateToSensor] Floor zones:', floorZones.map(z => ({ id: z.id, name: z.name, order: z.order, floor: z.floor })))
console.log('[navigateToSensor] Looking for sensor:', sensorSerialNumber)
// Загружаем датчики для каждой зоны и ищем нужный
for (const zone of floorZones) {
try {
console.log(`[navigateToSensor] Checking zone: ${zone.name} (id: ${zone.id}, order: ${zone.order}, floor: ${zone.floor})`)
const res = await fetch(`/api/get-detectors?zone_id=${zone.id}`, { cache: 'no-store' })
if (!res.ok) {
console.warn(`[navigateToSensor] API request failed for zone ${zone.id}:`, res.status, res.statusText)
continue
}
const payload = await res.json()
const data = payload?.data ?? payload
const detectorsObj = (data?.detectors ?? {}) as Record<string, any>
const detectorsList = Object.values(detectorsObj)
console.log(`[navigateToSensor] Zone ${zone.name} has ${detectorsList.length} detectors:`, detectorsList.map((d: any) => d.serial_number || d.name))
// Проверяем есть ли датчик в этой зоне
const hasSensor = detectorsList.some((d: any) =>
d.serial_number === sensorSerialNumber ||
d.name === sensorSerialNumber
)
console.log(`[navigateToSensor] Sensor ${sensorSerialNumber} found in zone ${zone.name}:`, hasSensor)
if (hasSensor) {
targetZone = zone
console.log('[navigateToSensor] Found sensor in zone:', zone.name, 'sensors:', zone.sensors.length)
console.log('[navigateToSensor] ✅ FOUND! Selected zone:', zone.name, 'zoneId:', zone.id, 'model_path:', zone.model_path)
break
}
}
}
// Если не нашли по sensors, пробуем по floor
if (!targetZone && floor !== null) {
// Ищем зоны с соответствующим floor (кроме общего вида)
const floorZones = currentZones.filter(z =>
z.floor === floor &&
z.order !== 0 &&
z.model_path
)
if (floorZones.length > 0) {
targetZone = floorZones[0]
console.log('[navigateToSensor] Found zone by floor:', targetZone.name, 'floor:', floor)
} catch (e) {
console.error('[navigateToSensor] Failed to load detectors for zone:', zone.id, e)
continue
}
}
// Fallback на общий вид, если не нашли зону этажа
if (!targetZone) {
console.warn(`[navigateToSensor] No zone found with sensor ${sensorSerialNumber} or floor ${floor}, falling back to building view`)
console.warn(`[navigateToSensor] No floor zone found with sensor ${sensorSerialNumber}, falling back to building view`)
targetZone = currentZones[0]
}
}
@@ -468,8 +482,11 @@ const useNavigationStore = create<NavigationStore>()(
zoneId: targetZone.id
})
// Возвращаем serial_number для установки focusedSensorId в компоненте
return sensorSerialNumber
// Возвращаем объект с sensorSerialNumber и modelPath
return {
sensorSerialNumber,
modelPath: targetZone.model_path
}
}
}),
{