118 lines
4.3 KiB
Python
118 lines
4.3 KiB
Python
"""
|
||
UI модуль для парсера сводок ПМ
|
||
"""
|
||
import streamlit as st
|
||
from api_client import upload_file_to_api, make_api_request
|
||
from config import PM_CODES, PM_COLUMNS, DEFAULT_OGS
|
||
|
||
|
||
def render_svodka_pm_tab():
|
||
"""Рендер вкладки сводок ПМ"""
|
||
st.header("📊 Сводки ПМ - Полный функционал")
|
||
|
||
# Секция загрузки файлов
|
||
st.subheader("📤 Загрузка файлов")
|
||
uploaded_pm = st.file_uploader(
|
||
"Выберите ZIP архив со сводками ПМ",
|
||
type=['zip'],
|
||
key="pm_upload"
|
||
)
|
||
|
||
if uploaded_pm is not None:
|
||
if st.button("📤 Загрузить сводки ПМ", key="upload_pm_btn"):
|
||
with st.spinner("Загружаю файл..."):
|
||
result, status = upload_file_to_api(
|
||
"/svodka_pm/upload-zip",
|
||
uploaded_pm.read(),
|
||
uploaded_pm.name
|
||
)
|
||
|
||
if status == 200:
|
||
st.success(f"✅ {result.get('message', 'Файл загружен')}")
|
||
st.info(f"ID объекта: {result.get('object_id', 'N/A')}")
|
||
else:
|
||
st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}")
|
||
|
||
st.markdown("---")
|
||
|
||
# Секция получения данных
|
||
st.subheader("🔍 Получение данных")
|
||
|
||
col1, col2 = st.columns(2)
|
||
|
||
with col1:
|
||
st.subheader("Данные по одному ОГ")
|
||
|
||
og_id = st.selectbox(
|
||
"Выберите ОГ",
|
||
DEFAULT_OGS,
|
||
key="pm_single_og"
|
||
)
|
||
|
||
codes = st.multiselect(
|
||
"Выберите коды строк",
|
||
PM_CODES,
|
||
default=[78, 79],
|
||
key="pm_single_codes"
|
||
)
|
||
|
||
columns = st.multiselect(
|
||
"Выберите столбцы",
|
||
PM_COLUMNS,
|
||
default=["БП", "ПП"],
|
||
key="pm_single_columns"
|
||
)
|
||
|
||
if st.button("🔍 Получить данные по ОГ", key="pm_single_btn"):
|
||
if codes and columns:
|
||
with st.spinner("Получаю данные..."):
|
||
data = {
|
||
"id": og_id,
|
||
"codes": codes,
|
||
"columns": columns
|
||
}
|
||
|
||
result, status = make_api_request("/svodka_pm/get_single_og", data)
|
||
|
||
if status == 200:
|
||
st.success("✅ Данные получены")
|
||
st.json(result)
|
||
else:
|
||
st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}")
|
||
else:
|
||
st.warning("⚠️ Выберите коды и столбцы")
|
||
|
||
with col2:
|
||
st.subheader("Данные по всем ОГ")
|
||
|
||
codes_total = st.multiselect(
|
||
"Выберите коды строк",
|
||
PM_CODES,
|
||
default=[78, 79, 394, 395],
|
||
key="pm_total_codes"
|
||
)
|
||
|
||
columns_total = st.multiselect(
|
||
"Выберите столбцы",
|
||
PM_COLUMNS,
|
||
default=["БП", "ПП", "СЭБ"],
|
||
key="pm_total_columns"
|
||
)
|
||
|
||
if st.button("🔍 Получить данные по всем ОГ", key="pm_total_btn"):
|
||
if codes_total and columns_total:
|
||
with st.spinner("Получаю данные..."):
|
||
data = {
|
||
"codes": codes_total,
|
||
"columns": columns_total
|
||
}
|
||
|
||
result, status = make_api_request("/svodka_pm/get_total_ogs", data)
|
||
|
||
if status == 200:
|
||
st.success("✅ Данные получены")
|
||
st.json(result)
|
||
else:
|
||
st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}")
|
||
else:
|
||
st.warning("⚠️ Выберите коды и столбцы") |