изменение логики работы поиска датчиков из дашборд и истории тревог по конкретному этажу
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}),
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user