108 lines
5.3 KiB
Python
108 lines
5.3 KiB
Python
"""
|
||
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', 'Неизвестная ошибка')}") |