feat(web): стабилизация UI, Gemini-скроллинг, роутеры контекста/снапшотов и актуализация роадмапа
This commit is contained in:
+62
-6
@@ -19,6 +19,7 @@ from services.scud_etl.anomaly_detector import detect_registry_anomalies
|
||||
from services.scud_etl.svodka_generator import generate_svodka_service
|
||||
from services.scud_etl.otchet_generator import generate_otchet_service
|
||||
from services.text_reporter import generate_markdown_report
|
||||
from services.snapshots.retention import cleanup_old_intermediate_snapshots
|
||||
|
||||
from services.scud_export import run_export
|
||||
from services.share_copier import copy_1c_files_from_share
|
||||
@@ -27,19 +28,69 @@ from services.excel_exporter import export_raw_scud
|
||||
logging.basicConfig(level=logging.INFO, format="[%(asctime)s] [%(levelname)s] %(message)s")
|
||||
|
||||
|
||||
def print_help():
|
||||
print("""
|
||||
===============================================================================
|
||||
🛠️ SCUD ORION AI — СИСТЕМА КОНТРОЛЛИНГА И СВОДНЫХ ОТЧЕТОВ
|
||||
===============================================================================
|
||||
Использование:
|
||||
python main_etl.py [ОПЦИИ]
|
||||
|
||||
Доступные аргументы:
|
||||
-h, --help, help Показать эту справку и выйти
|
||||
--date ДД.ММ.ГГГГ Дата расчета (по умолчанию: текущий рабочий день)
|
||||
--time ЧЧ:ММ Время среза для сводки (например: 14:30)
|
||||
Ищет ближайший срез (±20 мин) или запрашивает On-Demand экспорт
|
||||
--snapshot ID Точный ID снапшота для расчета (например: 20260827-002)
|
||||
--skip-export Пропустить выгрузку СКУД из MS SQL (работать только с SQLite)
|
||||
--export-only ТОЛЬКО сделать экспорт/снапшот СКУД в БД без построения отчетов
|
||||
-d, --debug Включить режим расширенной отладки
|
||||
|
||||
Примеры использования:
|
||||
python main_etl.py
|
||||
👉 Полный суточный цикл: экспорт -> отчет за вчера -> сводка за сегодня -> ИИ.
|
||||
|
||||
python main_etl.py --export-only
|
||||
👉 Почасовой тихий срез в БД (для cron) без генерации отчетов.
|
||||
|
||||
python main_etl.py --date 27.08.2026 --time 12:15 --skip-export
|
||||
👉 Построить сводку за 27.08 на 12:15 без запроса к внешнему MS SQL.
|
||||
|
||||
python main_etl.py --snapshot 20260827-001 --skip-export
|
||||
👉 Расчет отчетов строго по выбранному снапшоту из SQLite.
|
||||
===============================================================================
|
||||
""")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Модульный контроллинг СКУД ⟷ 1С")
|
||||
parser.add_argument("-d", "--debug", action="store_true", help="Режим отладки")
|
||||
parser.add_argument("--skip-export", action="store_true", help="Пропустить выгрузку СКУД из MS SQL")
|
||||
parser.add_argument("--date", type=str, default=None, help="Дата расчета в формате ДД.ММ.ГГГГ")
|
||||
parser.add_argument("--time", type=str, default=None, help="Время среза для сводки (например, 14:30)")
|
||||
parser.add_argument("--snapshot", type=str, default=None, help="Точный ID снапшота для расчета")
|
||||
if len(sys.argv) > 1 and sys.argv[1] in ("-h", "--help", "help"):
|
||||
print_help()
|
||||
sys.exit(0)
|
||||
|
||||
parser = argparse.ArgumentParser(add_help=False)
|
||||
parser.add_argument("-h", "--help", action="store_true")
|
||||
parser.add_argument("-d", "--debug", action="store_true")
|
||||
parser.add_argument("--skip-export", action="store_true")
|
||||
parser.add_argument("--export-only", action="store_true")
|
||||
parser.add_argument("--date", type=str, default=None)
|
||||
parser.add_argument("--time", type=str, default=None)
|
||||
parser.add_argument("--snapshot", type=str, default=None)
|
||||
|
||||
args = parser.parse_args()
|
||||
if args.help:
|
||||
print_help()
|
||||
sys.exit(0)
|
||||
|
||||
print("=" * 60)
|
||||
print(f"ЗАПУСК СИСТЕМЫ МОДУЛЬНОГО КОНТРОЛЛИНГА СКУД ⟷ 1С {'[DEBUG]' if args.debug else ''}")
|
||||
print("=" * 60)
|
||||
|
||||
# Автоматическая ротация архивных почасовых срезов
|
||||
if not args.skip_export and not args.snapshot:
|
||||
deleted_count = cleanup_old_intermediate_snapshots(days_to_keep_all=2)
|
||||
if deleted_count > 0:
|
||||
print(f"[🧹] Ротация БД: очищено {deleted_count} строк промежуточных архивных срезов.")
|
||||
|
||||
now = datetime.now()
|
||||
if args.date:
|
||||
today_str = args.date.replace('_', '.')
|
||||
@@ -60,6 +111,11 @@ def main():
|
||||
else:
|
||||
print("\n[0/5] Пропуск прямого экспорта СКУД из MS SQL (--skip-export)...")
|
||||
|
||||
# Если запрошен режим тихого почасового среза — выходим без тяжелых генераций
|
||||
if args.export_only:
|
||||
print(f"\n[✓] Режим --export-only: срез зафиксирован в SQLite. Генерация отчетов пропущена.")
|
||||
sys.exit(0)
|
||||
|
||||
# [Этап 0.5] Синхронизация файлов с шары 1С
|
||||
if not args.snapshot and not args.skip_export:
|
||||
print(f"\n[0.5/5] Проверка и копирование файлов 1С с шары...")
|
||||
|
||||
Reference in New Issue
Block a user