110 lines
5.0 KiB
Python
110 lines
5.0 KiB
Python
"""
|
||
UI модуль для ремонта СА
|
||
"""
|
||
import streamlit as st
|
||
import pandas as pd
|
||
from api_client import upload_file_to_api, make_api_request, get_available_ogs
|
||
from config import REPAIR_TYPES
|
||
|
||
|
||
def render_svodka_repair_ca_tab():
|
||
"""Рендер вкладки ремонта СА"""
|
||
st.header("🔧 Ремонт СА - Управление ремонтными работами")
|
||
|
||
# Секция загрузки файлов
|
||
st.subheader("📤 Загрузка файлов")
|
||
|
||
uploaded_file = st.file_uploader(
|
||
"Выберите Excel файл или ZIP архив с данными о ремонте СА",
|
||
type=['xlsx', 'xlsm', 'xls', 'zip'],
|
||
key="repair_ca_upload"
|
||
)
|
||
|
||
if uploaded_file is not None:
|
||
if st.button("📤 Загрузить файл", key="repair_ca_upload_btn"):
|
||
with st.spinner("Загружаю файл..."):
|
||
file_data = uploaded_file.read()
|
||
result, status = upload_file_to_api("/svodka_repair_ca/upload", file_data, uploaded_file.name)
|
||
|
||
if status == 200:
|
||
st.success("✅ Файл успешно загружен")
|
||
st.json(result)
|
||
else:
|
||
st.error(f"❌ Ошибка загрузки: {result.get('message', 'Неизвестная ошибка')}")
|
||
|
||
st.markdown("---")
|
||
|
||
# Секция получения данных
|
||
st.subheader("🔍 Получение данных")
|
||
|
||
col1, col2 = st.columns(2)
|
||
|
||
with col1:
|
||
st.subheader("Фильтры")
|
||
|
||
# Получаем доступные ОГ динамически
|
||
available_ogs = get_available_ogs("svodka_repair_ca")
|
||
|
||
# Фильтр по ОГ
|
||
og_ids = st.multiselect(
|
||
"Выберите ОГ (оставьте пустым для всех)",
|
||
available_ogs if available_ogs else ["KNPZ", "ANHK", "SNPZ", "BASH", "UNH", "NOV"], # fallback
|
||
key="repair_ca_og_ids"
|
||
)
|
||
|
||
# Фильтр по типам ремонта
|
||
repair_types = st.multiselect(
|
||
"Выберите типы ремонта (оставьте пустым для всех)",
|
||
REPAIR_TYPES,
|
||
key="repair_ca_types"
|
||
)
|
||
|
||
# Включение плановых/фактических данных
|
||
include_planned = st.checkbox("Включать плановые данные", value=True, key="repair_ca_planned")
|
||
include_factual = st.checkbox("Включать фактические данные", value=True, key="repair_ca_factual")
|
||
|
||
with col2:
|
||
st.subheader("Действия")
|
||
|
||
if st.button("🔍 Получить данные о ремонте", key="repair_ca_get_btn"):
|
||
with st.spinner("Получаю данные..."):
|
||
data = {
|
||
"include_planned": include_planned,
|
||
"include_factual": include_factual
|
||
}
|
||
|
||
# Добавляем фильтры только если они выбраны
|
||
if og_ids:
|
||
data["og_ids"] = og_ids
|
||
if repair_types:
|
||
data["repair_types"] = repair_types
|
||
|
||
result, status = make_api_request("/svodka_repair_ca/get_data", data)
|
||
|
||
if status == 200:
|
||
st.success("✅ Данные получены")
|
||
|
||
# Отображаем данные в виде таблицы, если возможно
|
||
if result.get("data") and isinstance(result["data"], list):
|
||
df_data = []
|
||
for item in result["data"]:
|
||
df_data.append({
|
||
"ID ОГ": item.get("id", ""),
|
||
"Наименование": item.get("name", ""),
|
||
"Тип ремонта": item.get("type", ""),
|
||
"Дата начала": item.get("start_date", ""),
|
||
"Дата окончания": item.get("end_date", ""),
|
||
"План": item.get("plan", ""),
|
||
"Факт": item.get("fact", ""),
|
||
"Простой": item.get("downtime", "")
|
||
})
|
||
|
||
if df_data:
|
||
df = pd.DataFrame(df_data)
|
||
st.dataframe(df, use_container_width=True)
|
||
else:
|
||
st.info("📋 Нет данных для отображения")
|
||
else:
|
||
st.json(result)
|
||
else:
|
||
st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") |