12.08.2026 17:30 Логика формирования отчетов работает, все отсутствия учитываются, логика присутствия сотрудников в случае сбоя СКУД на работе настроена.
This commit is contained in:
+40
-9
@@ -71,7 +71,6 @@ def print_snapshots_list(date_str=None):
|
||||
snap_time = r[2] if r[2] else '—'
|
||||
count = r[3]
|
||||
|
||||
# Извлекаем время (ЧЧ:ММ:СС) из snapshot_time, если оно есть
|
||||
time_part = "—"
|
||||
if snap_time and " " in snap_time:
|
||||
time_part = snap_time.split(" ")[1]
|
||||
@@ -155,6 +154,30 @@ def inspect_scud(snapshot_id=None, date_str=None, export_xlsx=None):
|
||||
print("=" * 90 + "\n")
|
||||
|
||||
|
||||
def print_absences(date_str=None):
|
||||
"""Выводит список официально отсутствующих сотрудников из 1С:ЗУП за выбранный день."""
|
||||
target_date = date_str if date_str else DATE_TODAY
|
||||
print("\n" + "=" * 90)
|
||||
print(f"📋 ОФИЦИАЛЬНЫЕ ОТСУТСТВИЯ ИЗ 1С:ЗУП ЗА ДАТУ [{target_date}]:")
|
||||
print("=" * 90)
|
||||
|
||||
with get_connection() as conn:
|
||||
df = pd.read_sql_query(
|
||||
"SELECT fio as 'ФИО', absence_type as 'Причина отсутствия 1С' FROM zup_absences WHERE absence_date = ? ORDER BY absence_type, fio",
|
||||
conn,
|
||||
params=(target_date,)
|
||||
)
|
||||
|
||||
if df.empty:
|
||||
print(f"Записи об отсутствиях 1С за {target_date} в базе не найдены.")
|
||||
else:
|
||||
print(f"Всего зафиксировано документов 1С: {len(df)}")
|
||||
print("-" * 90)
|
||||
print(df.to_string(index=False))
|
||||
|
||||
print("=" * 90 + "\n")
|
||||
|
||||
|
||||
def print_anomalies():
|
||||
"""Выводит список аномалий СКУД из БД."""
|
||||
print("\n" + "=" * 80)
|
||||
@@ -193,6 +216,7 @@ def dump_all_to_excel(out_filename="db_dump_full.xlsx"):
|
||||
df.to_excel(writer, sheet_name=table[:31], index=False)
|
||||
print(f"[✓] Дамп успешно сохранен: {out_path}\n")
|
||||
|
||||
|
||||
def print_system_prompts():
|
||||
"""Выводит все системные промпты из базы данных."""
|
||||
print("\n" + "=" * 80)
|
||||
@@ -211,6 +235,7 @@ def print_system_prompts():
|
||||
print(f"{r[4]}\n")
|
||||
print("=" * 80 + "\n")
|
||||
|
||||
|
||||
def print_session_states():
|
||||
"""Выводит текущие активные сессии и превью (session_states)."""
|
||||
print("\n" + "=" * 80)
|
||||
@@ -230,14 +255,14 @@ def print_session_states():
|
||||
print("=" * 80 + "\n")
|
||||
|
||||
|
||||
def main():
|
||||
help_text = """
|
||||
HELP_TEXT = """
|
||||
CLI-утилита инспекции и управления SQLite базой данных СКУД (scud_orion_ai.db)
|
||||
|
||||
ДОСТУПНЫЕ КОМАНДЫ:
|
||||
stats -- Общая статистика строк по всем таблицам БД
|
||||
snapshots [ДД.ММ.ГГГГ] -- Посмотреть реестр снапшотов (опционально за конкретную дату)
|
||||
scud [ДД.ММ.ГГГГ] [--snapshot ID] [--export-xlsx NAME] -- Инспекция логов СКУД по дате/снапшоту и экспорт в Excel
|
||||
absences [ДД.ММ.ГГГГ] -- Посмотреть список официально отсутствующих из 1С:ЗУП
|
||||
anomalies -- Посмотреть историю найденных аномалий СКУД ⟷ 1С
|
||||
rules -- Посмотреть правила Базы Знаний ИИ из SQLite
|
||||
prompts -- Посмотреть системные промпты (system_prompts)
|
||||
@@ -250,22 +275,26 @@ CLI-утилита инспекции и управления SQLite базой
|
||||
python scripts/db_cli.py snapshots 06.08.2026
|
||||
python scripts/db_cli.py scud 06.08.2026 --export-xlsx срез_четверг
|
||||
python scripts/db_cli.py scud --snapshot Y20260805-007
|
||||
python scripts/db_cli.py absences 07.08.2026
|
||||
python scripts/db_cli.py prompts
|
||||
python scripts/db_cli.py sessions
|
||||
python scripts/db_cli.py snapshot del Y20260805-007
|
||||
python scripts/db_cli.py snapshot del --day 04.08.2026
|
||||
python scripts/db_cli.py dump my_dump.xlsx
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
if any(arg in sys.argv for arg in ['-h', '--help']):
|
||||
print(help_text)
|
||||
print(HELP_TEXT)
|
||||
sys.exit(0)
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=help_text,
|
||||
description=HELP_TEXT,
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
add_help=False # Отключаем стандартный вывод справки argparse
|
||||
add_help=False
|
||||
)
|
||||
parser.add_argument('command', nargs='?', default=None, choices=['stats', 'snapshots', 'scud', 'anomalies', 'rules', 'prompts', 'sessions', 'dump', 'snapshot'], help="Основная команда")
|
||||
parser.add_argument('command', nargs='?', default=None, choices=['stats', 'snapshots', 'scud', 'absences', 'anomalies', 'rules', 'prompts', 'sessions', 'dump', 'snapshot'], help="Основная команда")
|
||||
parser.add_argument('action', nargs='?', default=None, help="Дополнительное действие (например, 'del')")
|
||||
parser.add_argument('param', nargs='?', default=None, help="Параметр (дата, ID снапшота или имя файла)")
|
||||
parser.add_argument('--snapshot', type=str, default=None, help="ID конкретного снапшота для инспекции")
|
||||
@@ -278,7 +307,6 @@ CLI-утилита инспекции и управления SQLite базой
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Валидация команд
|
||||
if args.command == 'stats':
|
||||
print_stats()
|
||||
elif args.command == 'snapshots':
|
||||
@@ -286,6 +314,9 @@ CLI-утилита инспекции и управления SQLite базой
|
||||
print_snapshots_list(date_str=date_val)
|
||||
elif args.command == 'scud':
|
||||
inspect_scud(snapshot_id=args.snapshot, date_str=args.param, export_xlsx=args.export_xlsx)
|
||||
elif args.command == 'absences':
|
||||
date_val = args.param or args.action
|
||||
print_absences(date_str=date_val)
|
||||
elif args.command == 'anomalies':
|
||||
print_anomalies()
|
||||
elif args.command == 'rules':
|
||||
@@ -311,7 +342,7 @@ CLI-утилита инспекции и управления SQLite базой
|
||||
print("Используйте: python scripts/db_cli.py snapshot del [ID или --day 'ДД.ММ.ГГГГ']\n")
|
||||
else:
|
||||
print(f"\n[❌] Ошибка: Неизвестная команда.")
|
||||
parser.print_help()
|
||||
print(HELP_TEXT)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user