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

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

@@ -68,6 +68,7 @@ export interface NavigationStore {
showNotifications: boolean
showListOfDetectors: boolean
showSensors: boolean
showSensorHighlights: boolean
selectedDetector: DetectorType | null
showDetectorMenu: boolean
@@ -100,6 +101,8 @@ export interface NavigationStore {
closeListOfDetectors: () => void
openSensors: () => void
closeSensors: () => void
toggleSensorHighlights: () => void
setSensorHighlights: (show: boolean) => void
closeAllMenus: () => void
clearSelections: () => void
@@ -114,6 +117,9 @@ export interface NavigationStore {
isOnNavigationPage: () => boolean
getCurrentRoute: () => string | null
getActiveSidebarItem: () => number
// Навигация к датчику на 3D-модели
navigateToSensor: (sensorSerialNumber: string, floor: number | null, viewType: 'building' | 'floor') => Promise<string | null>
}
const useNavigationStore = create<NavigationStore>()(
@@ -137,6 +143,7 @@ const useNavigationStore = create<NavigationStore>()(
showNotifications: false,
showListOfDetectors: false,
showSensors: false,
showSensorHighlights: true,
selectedDetector: null,
showDetectorMenu: false,
@@ -316,6 +323,9 @@ const useNavigationStore = create<NavigationStore>()(
currentSubmenu: null
}),
toggleSensorHighlights: () => set((state) => ({ showSensorHighlights: !state.showSensorHighlights })),
setSensorHighlights: (show: boolean) => set({ showSensorHighlights: show }),
closeAllMenus: () => {
set({
showMonitoring: false,
@@ -361,6 +371,105 @@ const useNavigationStore = create<NavigationStore>()(
if (showListOfDetectors) return 7 // Список датчиков
if (showSensors) return 8 // Сенсоры
return 2 // Навигация (базовая)
},
// Навигация к датчику на 3D-модели
navigateToSensor: async (sensorSerialNumber: string, floor: number | null, viewType: 'building' | 'floor') => {
const { currentObject, loadZones } = get()
if (!currentObject.id) {
console.error('[navigateToSensor] No current object selected')
return null
}
// Загружаем зоны для объекта (из кэша или API)
await loadZones(currentObject.id)
const { currentZones } = get()
if (!currentZones || currentZones.length === 0) {
console.error('[navigateToSensor] No zones available for object', currentObject.id)
return null
}
let targetZone: Zone | undefined
if (viewType === 'building') {
// Для общего вида здания - ищем самую верхнюю зону (первую в списке)
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
)
if (hasSensor) {
targetZone = zone
console.log('[navigateToSensor] Found sensor in zone:', zone.name, 'sensors:', zone.sensors.length)
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)
}
}
// Fallback на общий вид, если не нашли зону этажа
if (!targetZone) {
console.warn(`[navigateToSensor] No zone found with sensor ${sensorSerialNumber} or floor ${floor}, falling back to building view`)
targetZone = currentZones[0]
}
}
if (!targetZone || !targetZone.model_path) {
console.error('[navigateToSensor] No valid zone with model_path found')
return null
}
// Устанавливаем состояние для навигации
set({
currentModelPath: targetZone.model_path,
// Открываем Зоны контроля (Monitoring) - она автоматически закроется после загрузки модели
showMonitoring: true,
// Закрываем остальные меню
showFloorNavigation: false,
showNotifications: false,
showListOfDetectors: false,
// НЕ закрываем showSensors - оставляем как есть для подсветки датчиков
// showSensors: false, <- Убрали!
showDetectorMenu: false,
showAlertMenu: false,
selectedDetector: null,
selectedAlert: null,
})
console.log('[navigateToSensor] Navigation prepared:', {
sensorSerialNumber,
floor,
viewType,
modelPath: targetZone.model_path,
zoneName: targetZone.name,
zoneId: targetZone.id
})
// Возвращаем serial_number для установки focusedSensorId в компоненте
return sensorSerialNumber
}
}),
{