""" UI модуль для мониторинга ТЭР """ import streamlit as st import pandas as pd import json from api_client import upload_file_to_api, make_api_request from config import TAR_MODES def render_monitoring_tar_tab(): """Рендер вкладки мониторинга ТЭР""" st.header("⚡ Мониторинг ТЭР (Топливно-энергетических ресурсов)") # Секция загрузки файлов st.subheader("📤 Загрузка файлов") uploaded_file = st.file_uploader( "Выберите ZIP архив с файлами мониторинга ТЭР", type=['zip'], key="monitoring_tar_upload" ) if uploaded_file is not None: if st.button("📤 Загрузить файл", key="monitoring_tar_upload_btn"): with st.spinner("Загружаем файл..."): file_data = uploaded_file.read() result, status_code = upload_file_to_api("/monitoring_tar/upload", file_data, uploaded_file.name) if status_code == 200: st.success("✅ Файл успешно загружен!") st.json(result) else: st.error(f"❌ Ошибка загрузки: {result}") # Секция получения данных st.subheader("📊 Получение данных") # Выбор формата отображения display_format = st.radio( "Формат отображения:", ["JSON", "Таблица"], key="monitoring_tar_display_format", horizontal=True ) # Выбор режима данных mode = st.selectbox( "Выберите режим данных:", TAR_MODES, help="total - строки 'Всего' (агрегированные данные), last_day - последние строки данных, all - все данные", key="monitoring_tar_mode" ) if st.button("📊 Получить данные", key="monitoring_tar_get_data_btn"): with st.spinner("Получаем данные..."): # Выбираем эндпоинт в зависимости от режима if mode == "all": # Используем полный эндпоинт result, status_code = make_api_request("/monitoring_tar/get_full_data", {}) else: # Используем фильтрованный эндпоинт request_data = {"mode": mode} result, status_code = make_api_request("/monitoring_tar/get_data", request_data) if status_code == 200 and result.get("success"): st.success("✅ Данные успешно получены!") # Показываем данные data = result.get("data", {}).get("value", {}) if data: st.subheader("📋 Результат:") # Парсим данные, если они пришли как строка if isinstance(data, str): try: data = json.loads(data) st.write("✅ JSON успешно распарсен") except json.JSONDecodeError as e: st.error(f"❌ Ошибка при парсинге JSON данных: {e}") st.write("Сырые данные:", data) return if display_format == "JSON": # Отображаем как JSON st.json(data) else: # Отображаем как таблицы if isinstance(data, dict): # Показываем данные по установкам for installation_id, installation_data in data.items(): with st.expander(f"🏭 {installation_id}"): if isinstance(installation_data, dict): # Показываем структуру данных for data_type, type_data in installation_data.items(): st.write(f"**{data_type}:**") if isinstance(type_data, list) and type_data: df = pd.DataFrame(type_data) st.dataframe(df) else: st.write("Нет данных") else: st.write("Нет данных") else: st.json(data) else: st.info("📋 Нет данных для отображения") else: st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}")