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