обновление бизнес логики

This commit is contained in:
2026-02-05 18:53:25 +03:00
parent f275db88c9
commit 44473a8d9d
24 changed files with 712 additions and 5397 deletions

View File

@@ -71,14 +71,18 @@ const DetectorMenu: React.FC<DetectorMenuProps> = ({ detector, isOpen, onClose,
// Группируем уведомления по дням за последний месяц
const now = new Date()
const monthAgo = new Date(now.getTime() - DAYS_COUNT * 24 * 60 * 60 * 1000)
// Устанавливаем время на начало текущего дня для корректного подсчёта
now.setHours(0, 0, 0, 0)
// Начальная дата: DAYS_COUNT-1 дней назад (чтобы включить текущий день)
const startDate = new Date(now.getTime() - (DAYS_COUNT - 1) * 24 * 60 * 60 * 1000)
// Создаём карту: дата -> { critical: count, warning: count }
const dayMap: Record<string, { critical: number; warning: number }> = {}
// Инициализируем все дни нулями
// Инициализируем все дни нулями (включая текущий день)
for (let i = 0; i < DAYS_COUNT; i++) {
const date = new Date(monthAgo.getTime() + i * 24 * 60 * 60 * 1000)
const date = new Date(startDate.getTime() + i * 24 * 60 * 60 * 1000)
const dateKey = date.toISOString().split('T')[0]
dayMap[dateKey] = { critical: 0, warning: 0 }
}
@@ -91,7 +95,9 @@ const DetectorMenu: React.FC<DetectorMenuProps> = ({ detector, isOpen, onClose,
}
const notifDate = new Date(notification.timestamp)
if (notifDate >= monthAgo && notifDate <= now) {
// Проверяем что уведомление попадает в диапазон от startDate до конца текущего дня
const endOfToday = new Date(now.getTime() + 24 * 60 * 60 * 1000)
if (notifDate >= startDate && notifDate < endOfToday) {
const dateKey = notifDate.toISOString().split('T')[0]
if (dayMap[dateKey]) {
const notifType = String(notification.type || '').toLowerCase()
@@ -121,6 +127,8 @@ const DetectorMenu: React.FC<DetectorMenuProps> = ({ detector, isOpen, onClose,
// Определение типа детектора и его отображаемого названия
const rawDetectorTypeCode = (detector.detector_type || '').toUpperCase()
// Извлекаем код из текстового поля type
const deriveCodeFromType = (): string => {
const t = (detector.type || '').toLowerCase()
if (!t) return ''
@@ -129,7 +137,15 @@ const DetectorMenu: React.FC<DetectorMenuProps> = ({ detector, isOpen, onClose,
if (t.includes('гидроуров')) return 'GLE'
return ''
}
const effectiveDetectorTypeCode = rawDetectorTypeCode || deriveCodeFromType()
// Fallback: извлекаем код из префикса серийного номера (GLE-3 -> GLE)
const deriveCodeFromSerialNumber = (): string => {
const serial = (detector.serial_number || '').toUpperCase()
if (!serial) return ''
// Ищем префикс до дефиса или цифры
const match = serial.match(/^([A-Z]+)[-\d]/)
return match ? match[1] : ''
}
// Карта соответствия кодов типов детекторов их русским названиям
const detectorTypeLabelMap: Record<string, string> = {
@@ -137,6 +153,15 @@ const DetectorMenu: React.FC<DetectorMenuProps> = ({ detector, isOpen, onClose,
PE: 'Тензометр',
GLE: 'Гидроуровень',
}
// Определяем эффективный код типа датчика с fallback
let effectiveDetectorTypeCode = rawDetectorTypeCode
// Если rawDetectorTypeCode не найден в карте - используем fallback
if (!detectorTypeLabelMap[effectiveDetectorTypeCode]) {
effectiveDetectorTypeCode = deriveCodeFromType() || deriveCodeFromSerialNumber()
}
const displayDetectorTypeLabel = detectorTypeLabelMap[effectiveDetectorTypeCode] || '—'
// Обработчик клика по кнопке "Отчет" - навигация на страницу отчетов с выбранным детектором