streamlit рефактор
This commit is contained in:
146
streamlit_app/parsers_ui/statuses_repair_ca_ui.py
Normal file
146
streamlit_app/parsers_ui/statuses_repair_ca_ui.py
Normal file
@@ -0,0 +1,146 @@
|
||||
"""
|
||||
UI модуль для статусов ремонта СА
|
||||
"""
|
||||
import streamlit as st
|
||||
import pandas as pd
|
||||
from api_client import upload_file_to_api, make_api_request, get_available_ogs
|
||||
|
||||
|
||||
def render_statuses_repair_ca_tab():
|
||||
"""Рендер вкладки статусов ремонта СА"""
|
||||
st.header("📋 Статусы ремонта СА")
|
||||
|
||||
# Секция загрузки файлов
|
||||
st.subheader("📤 Загрузка файлов")
|
||||
uploaded_file = st.file_uploader(
|
||||
"Выберите файл статусов ремонта СА",
|
||||
type=['xlsx', 'xlsm', 'xls', 'zip'],
|
||||
key="statuses_repair_ca_upload"
|
||||
)
|
||||
|
||||
if uploaded_file is not None:
|
||||
if st.button("📤 Загрузить файл", key="statuses_repair_ca_upload_btn"):
|
||||
with st.spinner("Загружаем файл..."):
|
||||
file_data = uploaded_file.read()
|
||||
result, status_code = upload_file_to_api("/statuses_repair_ca/upload", file_data, uploaded_file.name)
|
||||
|
||||
if status_code == 200:
|
||||
st.success("✅ Файл успешно загружен!")
|
||||
st.json(result)
|
||||
else:
|
||||
st.error(f"❌ Ошибка загрузки: {result}")
|
||||
|
||||
# Секция получения данных
|
||||
st.subheader("📊 Получение данных")
|
||||
|
||||
# Получаем доступные ОГ динамически
|
||||
available_ogs = get_available_ogs("statuses_repair_ca")
|
||||
|
||||
# Фильтр по ОГ
|
||||
og_ids = st.multiselect(
|
||||
"Выберите ОГ (оставьте пустым для всех)",
|
||||
available_ogs if available_ogs else ["KNPZ", "ANHK", "SNPZ", "BASH", "UNH", "NOV"], # fallback
|
||||
key="statuses_repair_ca_og_ids"
|
||||
)
|
||||
|
||||
# Предустановленные ключи для извлечения
|
||||
st.subheader("🔑 Ключи для извлечения данных")
|
||||
|
||||
# Основные ключи
|
||||
include_basic_keys = st.checkbox("Основные данные", value=True, key="statuses_basic_keys")
|
||||
include_readiness_keys = st.checkbox("Готовность к КР", value=True, key="statuses_readiness_keys")
|
||||
include_contract_keys = st.checkbox("Заключение договоров", value=True, key="statuses_contract_keys")
|
||||
include_supply_keys = st.checkbox("Поставка МТР", value=True, key="statuses_supply_keys")
|
||||
|
||||
# Формируем ключи на основе выбора
|
||||
keys = []
|
||||
if include_basic_keys:
|
||||
keys.append(["Дата начала ремонта"])
|
||||
keys.append(["Отставание / опережение подготовки к КР", "Отставание / опережение"])
|
||||
keys.append(["Отставание / опережение подготовки к КР", "Динамика за прошедшую неделю"])
|
||||
|
||||
if include_readiness_keys:
|
||||
keys.append(["Готовность к КР", "Факт"])
|
||||
|
||||
if include_contract_keys:
|
||||
keys.append(["Заключение договоров на СМР", "Договор", "%"])
|
||||
|
||||
if include_supply_keys:
|
||||
keys.append(["Поставка МТР", "На складе, позиций", "%"])
|
||||
|
||||
# Кнопка получения данных
|
||||
if st.button("📊 Получить данные", key="statuses_repair_ca_get_data_btn"):
|
||||
if not keys:
|
||||
st.warning("⚠️ Выберите хотя бы одну группу ключей для извлечения")
|
||||
else:
|
||||
with st.spinner("Получаем данные..."):
|
||||
request_data = {
|
||||
"ids": og_ids if og_ids else None,
|
||||
"keys": keys
|
||||
}
|
||||
|
||||
result, status_code = make_api_request("/statuses_repair_ca/get_data", request_data)
|
||||
|
||||
if status_code == 200 and result.get("success"):
|
||||
st.success("✅ Данные успешно получены!")
|
||||
|
||||
data = result.get("data", {}).get("value", [])
|
||||
if data:
|
||||
# Отображаем данные в виде таблицы
|
||||
if isinstance(data, list) and len(data) > 0:
|
||||
# Преобразуем в DataFrame для лучшего отображения
|
||||
df_data = []
|
||||
for item in data:
|
||||
row = {
|
||||
"ID": item.get("id", ""),
|
||||
"Название": item.get("name", ""),
|
||||
}
|
||||
|
||||
# Добавляем основные поля
|
||||
if "Дата начала ремонта" in item:
|
||||
row["Дата начала ремонта"] = item["Дата начала ремонта"]
|
||||
|
||||
# Добавляем готовность к КР
|
||||
if "Готовность к КР" in item:
|
||||
readiness = item["Готовность к КР"]
|
||||
if isinstance(readiness, dict) and "Факт" in readiness:
|
||||
row["Готовность к КР (Факт)"] = readiness["Факт"]
|
||||
|
||||
# Добавляем отставание/опережение
|
||||
if "Отставание / опережение подготовки к КР" in item:
|
||||
delay = item["Отставание / опережение подготовки к КР"]
|
||||
if isinstance(delay, dict):
|
||||
if "Отставание / опережение" in delay:
|
||||
row["Отставание/опережение"] = delay["Отставание / опережение"]
|
||||
if "Динамика за прошедшую неделю" in delay:
|
||||
row["Динамика за неделю"] = delay["Динамика за прошедшую неделю"]
|
||||
|
||||
# Добавляем договоры
|
||||
if "Заключение договоров на СМР" in item:
|
||||
contracts = item["Заключение договоров на СМР"]
|
||||
if isinstance(contracts, dict) and "Договор" in contracts:
|
||||
contract = contracts["Договор"]
|
||||
if isinstance(contract, dict) and "%" in contract:
|
||||
row["Договоры (%)"] = contract["%"]
|
||||
|
||||
# Добавляем поставки МТР
|
||||
if "Поставка МТР" in item:
|
||||
supply = item["Поставка МТР"]
|
||||
if isinstance(supply, dict) and "На складе, позиций" in supply:
|
||||
warehouse = supply["На складе, позиций"]
|
||||
if isinstance(warehouse, dict) and "%" in warehouse:
|
||||
row["МТР на складе (%)"] = warehouse["%"]
|
||||
|
||||
df_data.append(row)
|
||||
|
||||
if df_data:
|
||||
df = pd.DataFrame(df_data)
|
||||
st.dataframe(df, use_container_width=True)
|
||||
else:
|
||||
st.info("📋 Нет данных для отображения")
|
||||
else:
|
||||
st.json(result)
|
||||
else:
|
||||
st.info("📋 Нет данных для отображения")
|
||||
else:
|
||||
st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}")
|
||||
Reference in New Issue
Block a user