import sys import os import sqlite3 import pandas as pd SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) PROJECT_ROOT = os.path.dirname(SCRIPT_DIR) sys.path.append(PROJECT_ROOT) from config import DATA_DIR DB_PATH = os.path.join(DATA_DIR, "scud_orion_ai.db") def query_db(sql, params=()): """Выполняет SQL-запрос к локальной БД и возвращает результат в виде DataFrame.""" if not os.path.exists(DB_PATH): print(f"❌ База данных не найдена: {DB_PATH}") return None try: conn = sqlite3.connect(DB_PATH) df = pd.read_sql_query(sql, conn, params=params) conn.close() return df except Exception as e: print(f"❌ Ошибка выполнения запроса: {e}") return None def print_db_stats(): """Выводит статистику по количеству записей во всех таблицах базы данных.""" if not os.path.exists(DB_PATH): print(f"❌ База данных не найдена: {DB_PATH}") return conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") tables = [t[0] for t in cursor.fetchall() if t[0] != 'sqlite_sequence'] print("\n" + "=" * 55) print(f"📊 СТАТИСТИКА ЛОКАЛЬНОЙ БАЗЫ ДАННЫХ: {DB_PATH}") print("=" * 55) for t in tables: cursor.execute(f"SELECT COUNT(*) FROM {t}") count = cursor.fetchone()[0] print(f" • {t:<22} : {count} строк") conn.close() print("=" * 55 + "\n") if __name__ == "__main__": if len(sys.argv) < 2: print("\nИспользование CLI-модуля базы данных:") print(" python scripts/db_cli.py stats -- Посмотреть статистику таблиц БД") print(" python scripts/db_cli.py anomalies -- Просмотреть все обнаруженные аномалии") print(" python scripts/db_cli.py rules -- Просмотреть все правила Базы Знаний ИИ") print(" python scripts/db_cli.py scud 03.08.2026 -- Посмотреть логи СКУД за конкретную дату") print(" python scripts/db_cli.py staff 03.08.2026 -- Посмотреть Штатное расписание за дату") print(" python scripts/db_cli.py absences 03.08.2026 -- Посмотреть отсутствия из 1С за дату") print(" python scripts/db_cli.py dump [filename.xlsx] -- Дамп всей базы SQLite в Excel-файл") sys.exit(0) cmd = sys.argv[1].lower() if cmd == "stats": print_db_stats() elif cmd == "anomalies": df = query_db("SELECT * FROM anomalies_history ORDER BY id DESC") if df is not None: print("\n🚨 РЕЕСТР НАЙДЕННЫХ АНОМАЛИЙ СКУД ⟷ 1С:") print(df.to_string(index=False) if not df.empty else "Аномалий в базе пока нет.") elif cmd == "rules": df = query_db("SELECT id, added_by, created_at, rule_text FROM ai_knowledge_base ORDER BY id ASC") if df is not None and not df.empty: print("\n🧠 ПРАВИЛА БАЗЫ ЗНАНИЙ ИИ (ОБУЧЕНИЕ):") print("=" * 80) for _, row in df.iterrows(): print(f"📌 [ID: {row['id']}] | Добавил: {row['added_by']} | Дата: {row['created_at']}") print(f"{row['rule_text']}") print("-" * 80) else: print("\n🧠 База знаний пуста.") elif cmd == "scud" and len(sys.argv) > 2: date_str = sys.argv[2] df = query_db("SELECT * FROM scud_logs WHERE log_date = ?", (date_str,)) if df is not None: print(f"\n🚪 ЛОГИ СКУД ЗА {date_str} ({len(df)} записей):") print(df.head(20).to_string(index=False)) elif cmd == "staff" and len(sys.argv) > 2: date_str = sys.argv[2] df = query_db("SELECT * FROM zup_staff WHERE snapshot_date = ?", (date_str,)) if df is not None: print(f"\n📋 ШТАТНОЕ РАСПИСАНИЕ 1С ЗА {date_str} ({len(df)} сотрудников):") print(df.head(20).to_string(index=False)) elif cmd == "absences" and len(sys.argv) > 2: date_str = sys.argv[2] df = query_db("SELECT * FROM zup_absences WHERE absence_date = ?", (date_str,)) if df is not None: print(f"\n🏥 ДОКУМЕНТЫ ОТСУТСТВИЙ 1С ЗА {date_str} ({len(df)} записей):") print(df.to_string(index=False) if not df.empty else f"Отсутствий за {date_str} не зарегистрировано.") elif cmd == "dump": out_path = sys.argv[2] if len(sys.argv) > 2 else "db_dump.xlsx" if not os.path.exists(DB_PATH): print(f"❌ Файл базы {DB_PATH} не найден.") sys.exit(1) conn = sqlite3.connect(DB_PATH) tables = ["scud_logs", "zup_staff", "zup_absences", "anomalies_history", "ai_knowledge_base"] with pd.ExcelWriter(out_path, engine='openpyxl') as writer: for table in tables: df = pd.read_sql_query(f"SELECT * FROM {table}", conn) df.to_excel(writer, sheet_name=table, index=False) conn.close() print(f"✅ Вся база данных успешно экспортирована в Excel-файл: {out_path}") else: print(f"❌ Неизвестная команда: {cmd}")