diff --git a/services/scud_export.py b/services/scud_export.py index 074ff26..227a429 100644 --- a/services/scud_export.py +++ b/services/scud_export.py @@ -85,12 +85,16 @@ WITH DailyLogs AS ( log.TimeVal, log.Event, log.Mode, + -- Приоритет отдается физическому направлению контроллера (Mode): CASE - WHEN log.Mode = 2 OR log.Event IN (2, 27, 29, 33, 55, 65) THEN 'OUT' - WHEN log.Mode = 1 OR log.Event IN (1, 21, 26, 28, 32, 54, 64) THEN 'IN' + WHEN log.Mode = 2 THEN 'OUT' + WHEN log.Mode = 1 THEN 'IN' + WHEN log.Event IN (2, 27, 29, 33, 55, 65) THEN 'OUT' + WHEN log.Event IN (1, 21, 26, 54, 64) THEN 'IN' ELSE 'OTHER' END AS Direction, - ROW_NUMBER() OVER (PARTITION BY log.HozOrgan ORDER BY log.TimeVal DESC) AS RowNumDesc + -- Вычисляем самое последнее событие сотрудника за день: + ROW_NUMBER() OVER (PARTITION BY log.HozOrgan ORDER BY log.TimeVal DESC, log.Event DESC) AS RnLast FROM pLogData log WITH (NOLOCK) WHERE log.TimeVal BETWEEN @StartDate AND @EndDate AND log.HozOrgan IS NOT NULL @@ -102,20 +106,22 @@ Passages AS ( EmployeeID, MIN(TimeVal) AS FirstRawEvent, MAX(TimeVal) AS LastRawEvent, + -- Первый вход за день: MIN(CASE WHEN Direction = 'IN' THEN TimeVal END) AS FirstIn, - -- Реальный выход: должен быть позже входа минимум на 5 минут (отсекает проезд через шлагбаум/парковку) - MAX(CASE WHEN Direction = 'OUT' THEN TimeVal END) AS RawLastOut + -- Фиксируем выход ТОЛЬКО если самое последнее событие за день было именно выходом (OUT): + MAX(CASE WHEN RnLast = 1 AND Direction = 'OUT' THEN TimeVal END) AS FinalOut FROM DailyLogs GROUP BY EmployeeID ), EvaluatedPassages AS ( SELECT p.*, + -- Время выхода проставляется только при окончательном уходе сотрудника из здания: CASE - WHEN p.RawLastOut IS NOT NULL + WHEN p.FinalOut IS NOT NULL AND p.FirstIn IS NOT NULL - AND p.RawLastOut > DATEADD(MINUTE, 5, p.FirstIn) - THEN p.RawLastOut + AND p.FinalOut > DATEADD(MINUTE, 5, p.FirstIn) + THEN p.FinalOut ELSE NULL END AS FilteredLastOut FROM Passages p