добавлен фильтр количеста вывода записей на странице История тревог

This commit is contained in:
2026-02-03 21:46:20 +03:00
parent 5e58f6ef76
commit 79e4845870
10 changed files with 1209 additions and 89 deletions

View File

@@ -158,3 +158,97 @@ export function aggregateChartDataByDaysAverage(
return dailyData
}
/**
* Интерфейс для данных с разделением по типам событий
*/
export interface SeverityChartDataPoint {
timestamp: string
critical: number
warning: number
label?: string
}
/**
* Агрегирует данные тревог по дням с разделением по severity
* @param alerts - Массив тревог с полями timestamp и severity
* @param timePeriod - Период в часах ('24', '72', '168', '720')
* @returns Агрегированные данные с разделением по critical/warning
*/
export function aggregateAlertsBySeverity(
alerts: Array<{ timestamp?: string; created_at?: string; severity?: string }>,
timePeriod: string
): SeverityChartDataPoint[] {
if (!Array.isArray(alerts) || alerts.length === 0) {
return []
}
// Группируем по дням
const dailyMap = new Map<string, { critical: number; warning: number; date: Date }>()
alerts.forEach(alert => {
const timestampField = alert.timestamp || alert.created_at
if (!timestampField) return
const date = new Date(timestampField)
const dateKey = date.toISOString().split('T')[0]
if (!dailyMap.has(dateKey)) {
dailyMap.set(dateKey, { critical: 0, warning: 0, date })
}
const entry = dailyMap.get(dateKey)!
if (alert.severity === 'critical') {
entry.critical += 1
} else if (alert.severity === 'warning') {
entry.warning += 1
}
})
// Преобразуем в массив и сортируем по дате
const dailyData = Array.from(dailyMap.entries())
.sort((a, b) => new Date(a[0]).getTime() - new Date(b[0]).getTime())
.map(([dateKey, data]) => {
const date = new Date(dateKey)
// Форматируем подпись в зависимости от периода
let label = ''
if (timePeriod === '24') {
// День - показываем время
label = date.toLocaleDateString('ru-RU', {
day: '2-digit',
month: '2-digit',
hour: '2-digit'
})
} else if (timePeriod === '72') {
// 3 дня - показываем день недели и дату
label = date.toLocaleDateString('ru-RU', {
weekday: 'short',
day: '2-digit',
month: '2-digit'
})
} else if (timePeriod === '168') {
// Неделя - показываем день недели
label = date.toLocaleDateString('ru-RU', {
weekday: 'short',
day: '2-digit'
})
} else if (timePeriod === '720') {
// Месяц - показываем дату
label = date.toLocaleDateString('ru-RU', {
day: '2-digit',
month: '2-digit'
})
}
return {
timestamp: date.toISOString(),
critical: data.critical,
warning: data.warning,
label
}
})
return dailyData
}