Документация

Основные алгоритмы и бизнес-логика

Этот документ описывает ключевые процессы, лежащие в основе 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 отслеживает количество созданных тикетов и может отправлять эти данные во внешнюю систему из фонового задания.