разбор инцидента со сбоем базы скуд.
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,61 @@
|
|||||||
|
# ТЕХНИЧЕСКИЙ РАЗБОР АНОМАЛИИ СКУД И ТЗ НА ФИКС
|
||||||
|
> **Проблема скрытого маскирования сбоев турникетов и правила их устранения в проекте `scud_orion_ai`**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📋 Метаданные инцидента
|
||||||
|
|
||||||
|
| Параметр | Значение |
|
||||||
|
| :--- | :--- |
|
||||||
|
| **Дата инцидента:** | 04 августа 2026 г. |
|
||||||
|
| **Затронуто сотрудников:** | ~119 человек (из 276) |
|
||||||
|
| **Система:** | СКУД «Орион Pro» (MSSQL) + Python ETL + SQLite |
|
||||||
|
| **Статус решения:** | Требуется фикс валидации данных (В процессе) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Суть проблемы («Грабли»)
|
||||||
|
|
||||||
|
При утреннем сбое турникетов или контроллеров СКУД (08:00–10:00) события первичного прохода в базу не попадают. В результате у сотрудников в итоговом отчете формируется значение `Начало_дня = «Нет входа»`.
|
||||||
|
|
||||||
|
Однако в течение дня сотрудники перемещаются внутри здания, выходят на обед или прикладывают карты к внутренним считывателям, генерируя сырые транзакции в MSSQL (таблица `pLogData`).
|
||||||
|
|
||||||
|
> 🚨 **Главная баг-логика текущего алгоритма:**
|
||||||
|
> Скрипт перебирает все события за день и, видя любую дневную/вечернюю активность, **автоматически присваивает сотруднику флаг `is_present = 1` (`Статус = «Присутствовал»`)**.
|
||||||
|
>
|
||||||
|
> В итоге система «тихо сглаживает» аномалию: вместо того чтобы поднять тревогу о массовом сбое турникетов (70+ человек без утреннего входа), скрипт отправил 30+ человек в «Итого на работе», искусственно уменьшив список проблемных записей до 7 «неизвестных».
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Разбор механики расхождения отчетов (17:00 vs Конец дня)
|
||||||
|
|
||||||
|
Вопреки первоначальной гипотезе, вечерние выходы (17:42 и т.д.) у данных сотрудников не записывались в колонку `time_out` (там оставалось «Нет выхода»). Расхождение выгрузок было вызвано двумя факторами:
|
||||||
|
|
||||||
|
1. **В 17:00** в базе SQL 1С еще отсутствовал полный пакет кадровых документов за день, либо запуск производился без сверки с реестром исключений.
|
||||||
|
2. **При повторном прогоне** (вечером/ночью) скрипт подтянул полную базу 1С, а для оставшихся «безвходных» отработал скрытый флаг `is_present = 1`, маскируя технический сбой СКУД.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Техническое задание на исправление (Правила фикса)
|
||||||
|
|
||||||
|
* **Строгая валидация флага присутствия (Data Sanitization):**
|
||||||
|
Если `time_in == 'Нет входа'` и сотрудник отсутствует в `static_reason_workers.csv` (статичные удалёнщики/внештатники), код **ЗАПРЕЩАЕТ** автоматически проставлять `is_present = 1`, даже если выгрузка/агрегатор передает статус «Присутствовал».
|
||||||
|
|
||||||
|
* **Детектор аномалий и «Красный флаг» (Anomaly Detection):**
|
||||||
|
Если у человека `time_in == 'Нет входа'`, но при этом есть дневные проходы в `pLogData`, система помечает его статусом:
|
||||||
|
`🚨 АНОМАЛИЯ СКУД: Присутствие без утреннего входа (Зафиксирована активность в течение дня)`.
|
||||||
|
|
||||||
|
* **Группировка массовых сбоев:**
|
||||||
|
Если процент людей с подобной аномалией превышает **5% от штата**, ИИ/модуль аналитики генерирует системный алерт:
|
||||||
|
`«Внимание! Зафиксирован массовый сбой регистраторов входа СКУД»`.
|
||||||
|
|
||||||
|
* **Параметризация MSSQL СКУД по времени (`@CutoffDateTime`):**
|
||||||
|
Добавить возможность делать срезы базы СКУД на конкретный час (например, 17:00), чтобы видеть честное состояние контроллеров и транзакций на выбранный момент времени:
|
||||||
|
```sql
|
||||||
|
DECLARE @CutoffDateTime DATETIME = '2026-08-04 17:00:00';
|
||||||
|
SELECT * FROM pLogData WHERE TimeVal <= @CutoffDateTime;
|
||||||
|
|
||||||
|
Хранение истории выгрузок (snapshot_time):
|
||||||
|
Запретить перезапись (REPLACE) локальной БД SQLite в рамках одного дня. Каждая выгрузка за день должна сохраняться с меткой времени snapshot_time, чтобы сохранять историю срезов (12:00, 17:00, 19:00).
|
||||||
|
|
||||||
|
Документ зафиксирован в рамках проекта scud_orion_ai_v2.
|
||||||
Reference in New Issue
Block a user