147 lines
8.5 KiB
Python
147 lines
8.5 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, get_system_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("📊 Получение данных")
|
||
|
||
# Получаем доступные ОГ из системного API
|
||
system_ogs = get_system_ogs()
|
||
available_ogs = system_ogs.get("single_ogs", [])
|
||
|
||
# Фильтр по ОГ
|
||
og_ids = st.multiselect(
|
||
"Выберите ОГ (оставьте пустым для всех)",
|
||
available_ogs if available_ogs else get_available_ogs(), # 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', 'Неизвестная ошибка')}") |