""" =============================================================================== FILE: core/schema.py PROJECT: SCUD Orion AI (Unified Architecture) ROLE: DDL-схемы таблиц, создание индексов и инициализация базы данных. =============================================================================== """ import logging from core.connection import get_connection logger = logging.getLogger("DB_SCHEMA") def init_all_tables() -> None: """Инициализирует все таблицы и индексы системы.""" with get_connection() as conn: cursor = conn.cursor() # 1. Логи СКУД cursor.execute(""" CREATE TABLE IF NOT EXISTS scud_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, log_date TEXT NOT NULL, fio TEXT NOT NULL, fio_clean TEXT NOT NULL, department TEXT, position TEXT, time_in TEXT, first_activity TEXT DEFAULT '—', time_out TEXT, time_in_building TEXT, is_present INTEGER NOT NULL, anomaly_flag TEXT DEFAULT 'NONE', snapshot_time TEXT DEFAULT NULL, snapshot_id TEXT DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) # 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 ( id INTEGER PRIMARY KEY AUTOINCREMENT, snapshot_date TEXT NOT NULL, fio TEXT NOT NULL, fio_clean TEXT NOT NULL, department TEXT, position TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS zup_absences ( id INTEGER PRIMARY KEY AUTOINCREMENT, absence_date TEXT NOT NULL, fio TEXT NOT NULL, fio_clean TEXT NOT NULL, absence_type TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) # 3. Аномалии, база знаний и синонимы cursor.execute(""" CREATE TABLE IF NOT EXISTS anomalies_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, anomaly_date TEXT NOT NULL, fio TEXT NOT NULL, anomaly_type TEXT NOT NULL, details TEXT NOT NULL, human_status TEXT DEFAULT 'Pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS ai_knowledge_base ( id INTEGER PRIMARY KEY AUTOINCREMENT, rule_text TEXT UNIQUE NOT NULL, added_by TEXT DEFAULT 'Human', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS department_synonyms ( id INTEGER PRIMARY KEY AUTOINCREMENT, short_name TEXT UNIQUE NOT NULL, full_name TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) # 4. Исключения и Кэш сопоставлений личностей (ИИ / Ручной) cursor.execute(""" CREATE TABLE IF NOT EXISTS exceptions_registry ( id INTEGER PRIMARY KEY AUTOINCREMENT, category TEXT NOT NULL, value TEXT NOT NULL, comment TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(category, value) ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS person_identity_mapping ( id INTEGER PRIMARY KEY AUTOINCREMENT, scud_fio TEXT NOT NULL, zup_fio TEXT NOT NULL, scud_dept TEXT, zup_dept TEXT, match_source TEXT DEFAULT 'AI', -- 'AI', 'MANUAL', 'EXACT' status TEXT DEFAULT 'ACTIVE', -- 'ACTIVE', 'PROPOSED', 'REJECTED' confidence REAL DEFAULT 1.0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(scud_fio, zup_fio) ); """) # 5. Узлы системного промпта, сессии, сообщения и задачи cursor.execute(""" CREATE TABLE IF NOT EXISTS system_prompt_nodes ( id INTEGER PRIMARY KEY AUTOINCREMENT, prompt_name TEXT DEFAULT 'main_agent', section_id INTEGER NOT NULL, item_id INTEGER NOT NULL, content TEXT NOT NULL, is_active INTEGER DEFAULT 1, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(prompt_name, section_id, item_id) ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS session_states ( session_id TEXT PRIMARY KEY, state_type TEXT NOT NULL, pending_data TEXT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS chat_messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, is_ephemeral INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) cursor.execute(""" CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, task_id TEXT, module TEXT DEFAULT 'general', title TEXT NOT NULL, priority TEXT DEFAULT 'MEDIUM', status TEXT DEFAULT 'BACKLOG', due_date TEXT, user_id INTEGER DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """) # 6. Индексы 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()