127 lines
5.7 KiB
Python
127 lines
5.7 KiB
Python
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}") |