обновление бизнес логики
This commit is contained in:
@@ -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] || '—'
|
||||
|
||||
// Обработчик клика по кнопке "Отчет" - навигация на страницу отчетов с выбранным детектором
|
||||
|
||||
Reference in New Issue
Block a user