Основные алгоритмы и бизнес-логика
Этот документ описывает ключевые процессы, лежащие в основе Crisis-Monitor. Понимание их поможет новым разработчикам быстрее ориентироваться в коде.
Обработка тикетов
Создание тикета
Метод TicketService.create формирует объект CrisisTicket на основе данных формы. Числовые поля проверяются, вложения сохраняются, действие логируется, создаётся информационная запись в логах и отправляется уведомление через event_stream. После коммита увеличивается счётчик метрик.
Поиск дубликатов
find_duplicate_ticket ищет существующий тикет с похожим заголовком и временем инцидента ±24 часа. При совпадении идентификатор записывается в ActivityLog, а пользователи получают уведомление.
Изменение тикета и логика SLA
TicketService.update применяет новые значения полей и создаёт запись TicketAudit. При смене статуса выполняются дополнительные действия: - При переходе в В работе поле time_response заполняется и при просроченном дедлайне отправляется событие о нарушении SLA. - При переходе в Ликвидирован фиксируется time_resolved и выполняется такая же проверка.
Контроль просроченных тикетов
check_overdue_tickets периодически ищет не закрытые тикеты с прошедшим дедлайном. Для каждого случая создаётся запись sla_breached и отправляется сообщение в поток событий.
Статистика SLA
Функция sla_stats подсчитывает количество тикетов, выполненных вовремя, с опозданием и просроченных. В выборку выполненных попадают только карточки с зафиксированным time_resolved; последующее редактирование карточки не меняет исторический результат SLA. Карточки без измеримого времени закрытия выводятся отдельно как unmeasured и не считаются ни успешными, ни просроченными.
Качество данных
Отчёт data-quality-audit использует формулу crisis-quality-v2. Итоговый индекс является вторичным ориентиром и складывается из пяти явно доступных компонентов: полнота 35%, свежесть 15%, происхождение 25%, операторская проверка 15% и уникальность 10%. Свежесть усредняется по всему активному корпусу по диапазонам 1/3/7/30 дней. Критические минимумы полноты, происхождения и уникальности работают как ворота готовности и не могут быть компенсированы высоким значением другого компонента.
Уверенность CAP
Тяжесть, срочность и уверенность хранят разный смысл. Уверенность Observed требует подтверждённого источника или нескольких проверенных независимых источников, Likely – проверенного источника с уверенностью выше 50%, а непроверенные ссылки дают не более Possible. Уровень риска не используется как доказательство истинности.
Автоклассификация тяжести
Формула hazard-impact-v2 использует самый сильный обнаруженный тип угрозы как базовый сигнал и отдельно добавляет подтверждённые числовые показатели ущерба (магнитуда, погибшие, пострадавшие). Коррелирующие синонимы не суммируются как независимые доказательства, а отрицания наподобие «жертв нет» исключаются из оценки воздействия. Критический уровень требует нескольких индикаторов или явного масштаба последствий. Результат является предложением для триажа, а не вероятностью и не заменяет решение оператора.
Операционная аналитика
Временные ряды используют полные календарные интервалы и всегда включают текущий день/час/неделю. Почасовая выдача ограничена 31 днём, остальные окна – 365 днями. Доля эскалаций считается по уникальным инцидентам когорты, а число уведомлений выводится отдельно. Средние, SLA и перцентили показываются только при наличии измеримой выборки; отрицательные длительности исключаются как ошибочные данные.
Предложение тегов
utils/tag_suggest.suggest_tags сначала ищет фразы‑синонимы, напрямую сопоставленные с тегами. Если совпадений нет, из текста извлекаются именованные сущности и глаголы с помощью библиотеки Natasha. После добавления этих ключевых слов выполняется поиск по TF‑IDF среди имеющегося словаря тегов.
Поиск временных кластеров
utils/analytics.find_time_clusters скользящим окном просматривает время создания тикетов и выявляет периоды, когда число записей заметно выше среднего. Статистическое раннее предупреждение выполняется отдельно через проверенный примитив qazstack.analytics.evaluate_ews и при недостаточной выборке возвращает явное состояние insufficient, а не прогноз.
Напоминания о дедлайнах
utils/reminders.send_deadline_reminders выбирает ближайшие дедлайны и рассылает уведомления по e-mail или в Telegram. Отправленные напоминания сохраняются, чтобы избежать повторов.
Поток событий и метрики
utils.event_stream реализует простую очередь подписчиков для SSE. Модуль utils.metrics отслеживает количество созданных тикетов и может отправлять эти данные во внешнюю систему из фонового задания.