From 17c960fa347b2c5a313a18d699638c146c14993d Mon Sep 17 00:00:00 2001 From: manoraga Date: Mon, 7 Sep 2026 17:41:59 +0300 Subject: [PATCH] =?UTF-8?q?fix(scud):=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B0=D0=BF=D0=BF?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0=20Mode=20(1=3DIN,=202=3DOUT)=20=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B0=20FilteredL?= =?UTF-8?q?astOut=20=D0=BA=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=D1=83=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8E?= =?UTF-8?q?=20=D0=B4=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/scud_export.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) 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