/
baelorsw
/
Alarma_Engine
Обзор
Документация
Войти
/
baelorsw
/
Alarma_Engine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
ui/dashboard.py
96 строк
3 KB
baelorsw
вывод в дащборд, нудно разобраться с временами
12 май 2026, 00:18
12 май 2026, 00:18
90bd2aa
Код
Авторство
О чём код?
# ui/dashboard.py import streamlit as st import requests import pandas as pd from datetime import datetime import time st.set_page_config(page_title="SLA Операторская", layout="wide") st.title("📊 Панель оператора SLA") # Настройки API API_URL = "http://localhost:8000" # Кэширование данных с автообновлением @st.cache_data(ttl=5) # Обновлять каждые 5 секунд def load_requests(): try: response = requests.get(f"{API_URL}/requests") if response.status_code == 200: return response.json() else: st.error(f"Ошибка загрузки: {response.status_code}") return [] except Exception as e: st.error(f"Не удалось подключиться к API: {e}") return [] # Заголовок и автообновление col1, col2 = st.columns([3, 1]) with col1: st.subheader("Активные обращения") with col2: if st.button("🔄 Обновить"): load_requests.clear() # Очищаем кэш функции st.rerun() # Загружаем данные data = load_requests() if data: # Преобразуем в DataFrame df = pd.DataFrame(data) # Приводим даты к читаемому виду df["created_at"] = pd.to_datetime(df["created_at"]) df["sla_deadline"] = pd.to_datetime(df["sla_deadline"]) now = datetime.now() # Считаем остаток времени df["seconds_left"] = (df["sla_deadline"] - now).dt.total_seconds() df["minutes_left"] = (df["seconds_left"] / 60).round(1) # Определяем статус def get_status(row): if row["status"] == "closed": return "✅ Закрыто" elif row["seconds_left"] < 0: return "🔴 Просрочено" elif row["seconds_left"] < 300: # <5 мин return "🔥 Горит!" elif row["seconds_left"] < 900: # <15 мин return "🟡 Внимание" else: return "🟢 В норме" df["Статус"] = df.apply(get_status, axis=1) # Форматируем столбцы display_df = df[[ "id", "text", "category", "urgency", "minutes_left", "Статус" ]].rename(columns={ "id": "ID", "text": "Текст", "category": "Категория", "urgency": "Срочность", "minutes_left": "Осталось, мин" }) # Отображаем таблицу st.dataframe( display_df, use_container_width=True, height=500, column_config={ "Статус": st.column_config.TextColumn( "Статус", help="Индикация срочности обработки", ) } ) else: st.info("Нет данных для отображения") # Автообновление (опционально) time.sleep(5) st.rerun()