81 lines
3.9 KiB
Python
81 lines
3.9 KiB
Python
"""
|
|
===============================================================================
|
|
FILE: main_etl.py
|
|
PROJECT: SCUD Orion AI (Unified Architecture)
|
|
ROLE: Главная точка входа ETL-конвейера СКУД ⟷ 1С:ЗУП.
|
|
===============================================================================
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import logging
|
|
from datetime import datetime, timedelta
|
|
|
|
from services.scud_etl.pipeline import load_best_snapshot_for_date, load_1c_files_for_date
|
|
from services.scud_etl.merger import merge_scud_and_1c, calculate_summary_metrics
|
|
from services.scud_etl.anomaly_detector import detect_registry_anomalies
|
|
from services.text_reporter.service import format_controlling_summary_markdown
|
|
|
|
# Корректные импорты из папки services/
|
|
from services.scud_export import run_scud_export_today_and_yesterday
|
|
from services.share_copier import sync_1c_files_from_share
|
|
from services.excel_exporter import build_daily_summary_excel, build_detailed_yesterday_excel
|
|
|
|
logging.basicConfig(level=logging.INFO, format="[%(asctime)s] [%(levelname)s] %(message)s")
|
|
|
|
|
|
def main():
|
|
print("=" * 60)
|
|
print("ЗАПУСК СИСТЕМЫ МОДУЛЬНОГО КОНТРОЛЛИНГА СКУД ⟷ 1С")
|
|
print("=" * 60)
|
|
|
|
now = datetime.now()
|
|
today_str = now.strftime("%d.%m.%Y")
|
|
yesterday_str = (now - timedelta(days=1)).strftime("%d.%m.%Y")
|
|
|
|
# [Этап 0] Выгрузка свежих данных СКУД
|
|
print(f"\n[0/5] Экспорт данных СКУД за {today_str} и {yesterday_str}...")
|
|
run_scud_export_today_and_yesterday()
|
|
|
|
# [Этап 0.5] Синхронизация файлов с шары 1С
|
|
print(f"\n[0.5/5] Проверка и копирование файлов 1С с шары...")
|
|
sync_1c_files_from_share()
|
|
|
|
# [Этап 1-2] Загрузка данных
|
|
print(f"\n[1-2/5] Загрузка срезов: Сегодня = {today_str}, Накануне = {yesterday_str}...")
|
|
df_scud_yesterday = load_best_snapshot_for_date(yesterday_str, prefer_final_y=True)
|
|
df_scud_today = load_best_snapshot_for_date(today_str, prefer_final_y=False)
|
|
|
|
df_staff_yesterday, df_abs_yesterday = load_1c_files_for_date(yesterday_str)
|
|
df_staff_today, df_abs_today = load_1c_files_for_date(today_str)
|
|
|
|
# [Этап 3] Детальный отчет за вчера (на базе финального Y-снапшота)
|
|
print(f"\n[3/5] Обработка и построение детального отчета за ВЧЕРА ({yesterday_str})...")
|
|
df_merged_yesterday = merge_scud_and_1c(df_scud_yesterday, df_staff_yesterday, df_abs_yesterday)
|
|
build_detailed_yesterday_excel(df_merged_yesterday, yesterday_str)
|
|
|
|
# [Этап 4] Сводка за сегодня
|
|
print(f"\n[4/5] Обработка и построение Ежедневной сводки за {today_str}...")
|
|
df_merged_today = merge_scud_and_1c(df_scud_today, df_staff_today, df_abs_today)
|
|
metrics_today = calculate_summary_metrics(df_merged_today)
|
|
anomalies_today = detect_registry_anomalies(df_merged_today)
|
|
build_daily_summary_excel(df_merged_today, metrics_today, today_str)
|
|
|
|
# [Этап 5] Формирование текстового отчета и вывод в консоль
|
|
print(f"\n[5/5] Формирование Markdown-сводки...")
|
|
summary_md = format_controlling_summary_markdown(today_str, metrics_today, anomalies_today)
|
|
|
|
os.makedirs("output", exist_ok=True)
|
|
md_file_path = f"output/Сводка_контроллинга_{today_str}.md"
|
|
with open(md_file_path, "w", encoding="utf-8") as f:
|
|
f.write(summary_md)
|
|
print(f"[✓] Текстовый отчет сохранен в: {md_file_path}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("ГОТОВАЯ ТЕКСТОВАЯ СВОДКА ИИ-АУДИТОРА:")
|
|
print("=" * 60)
|
|
print(summary_md)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |