feat(scud): добавление таблицы scud_events_raw и сохранение детальной ленты проходов
This commit is contained in:
@@ -237,4 +237,40 @@ def delete_snapshots_by_date(date_str: str) -> int:
|
||||
cursor.execute("DELETE FROM scud_logs WHERE log_date = ? OR snapshot_id LIKE ?", (date_str, f"%{date_str.replace('.', '')}%"))
|
||||
cnt = cursor.rowcount
|
||||
conn.commit()
|
||||
return cnt
|
||||
return cnt
|
||||
|
||||
def save_raw_events_to_db(df_raw_events: pd.DataFrame, date_str: str) -> int:
|
||||
"""
|
||||
Сохраняет ленту сырых физических проходов турникетов в таблицу scud_events_raw.
|
||||
Перезаписывает сырые события за указанную дату для исключения дубликатов.
|
||||
"""
|
||||
if df_raw_events is None or df_raw_events.empty:
|
||||
return 0
|
||||
|
||||
records = [
|
||||
(
|
||||
date_str,
|
||||
str(r.get('TimeVal', '')),
|
||||
int(r.get('HozOrgan', 0)),
|
||||
str(r.get('Сотрудник', '')),
|
||||
str(r.get('fio_clean', '')),
|
||||
str(r.get('Подразделение', '')),
|
||||
int(r.get('Event', 0)),
|
||||
int(r.get('Mode', 0)),
|
||||
str(r.get('Direction', 'OTHER'))
|
||||
)
|
||||
for _, r in df_raw_events.iterrows()
|
||||
]
|
||||
|
||||
with get_connection() as conn:
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("DELETE FROM scud_events_raw WHERE log_date = ?", (date_str,))
|
||||
cursor.executemany("""
|
||||
INSERT INTO scud_events_raw (
|
||||
log_date, time_val, hoz_organ, fio, fio_clean,
|
||||
department, event_code, mode, direction
|
||||
)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""", records)
|
||||
conn.commit()
|
||||
return len(records)
|
||||
@@ -38,6 +38,23 @@ def init_all_tables() -> None:
|
||||
);
|
||||
""")
|
||||
|
||||
# 1.1 Сырые физические события турникетов СКУД (для перекуров и оперативного статуса)
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS scud_events_raw (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
log_date TEXT NOT NULL,
|
||||
time_val TEXT NOT NULL,
|
||||
hoz_organ INTEGER NOT NULL,
|
||||
fio TEXT NOT NULL,
|
||||
fio_clean TEXT NOT NULL,
|
||||
department TEXT,
|
||||
event_code INTEGER NOT NULL,
|
||||
mode INTEGER NOT NULL,
|
||||
direction TEXT NOT NULL, -- 'IN' или 'OUT'
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
""")
|
||||
|
||||
# 2. Кадровые реестры 1С
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS zup_staff (
|
||||
@@ -172,5 +189,7 @@ def init_all_tables() -> None:
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS idx_scud_date ON scud_logs(log_date);")
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS idx_scud_fio ON scud_logs(fio_clean);")
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS idx_mapping_scud ON person_identity_mapping(scud_fio);")
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS idx_raw_events_date_hoz ON scud_events_raw(log_date, hoz_organ);")
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS idx_raw_events_date_time ON scud_events_raw(log_date, time_val);")
|
||||
|
||||
conn.commit()
|
||||
Reference in New Issue
Block a user