From 908fb330f4fbe03ad01e8c2dceb97d86f35451f5 Mon Sep 17 00:00:00 2001 From: Maksim Date: Fri, 29 Aug 2025 15:22:17 +0300 Subject: [PATCH] streamlit fix --- python_parser/streamlit_app.py | 264 ++++++++++++++++----------------- 1 file changed, 129 insertions(+), 135 deletions(-) diff --git a/python_parser/streamlit_app.py b/python_parser/streamlit_app.py index 98c4736..ec49848 100644 --- a/python_parser/streamlit_app.py +++ b/python_parser/streamlit_app.py @@ -94,93 +94,44 @@ def main(): for parser in parsers: st.write(f"• {parser}") - # Основные вкладки - tab1, tab2, tab3, tab4 = st.tabs([ - "📤 Загрузка файлов", + # Основные вкладки - по одной на каждый парсер + tab1, tab2, tab3 = st.tabs([ "📊 Сводки ПМ", "🏭 Сводки СА", "⛽ Мониторинг топлива" ]) - # Вкладка 1: Загрузка файлов + # Вкладка 1: Сводки ПМ - полный функционал with tab1: - st.header("📤 Загрузка файлов") + st.header("📊 Сводки ПМ - Полный функционал") - col1, col2 = st.columns(2) - - with col1: - 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', 'Неизвестная ошибка')}") - - with col2: - st.subheader("Мониторинг топлива") - uploaded_fuel = st.file_uploader( - "Выберите ZIP архив с мониторингом топлива", - type=['zip'], - key="fuel_upload" - ) - - if uploaded_fuel is not None: - if st.button("📤 Загрузить мониторинг топлива", key="upload_fuel_btn"): - with st.spinner("Загружаю файл..."): - result, status = upload_file_to_api( - "/monitoring_fuel/upload-zip", - uploaded_fuel.read(), - uploaded_fuel.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.subheader("Сводка СА") - uploaded_ca = st.file_uploader( - "Выберите Excel файл сводки СА", - type=['xlsx', 'xlsm', 'xls'], - key="ca_upload" + # Секция загрузки файлов + st.subheader("📤 Загрузка файлов") + uploaded_pm = st.file_uploader( + "Выберите ZIP архив со сводками ПМ", + type=['zip'], + key="pm_upload" ) - if uploaded_ca is not None: - if st.button("📤 Загрузить сводку СА", key="upload_ca_btn"): + if uploaded_pm is not None: + if st.button("📤 Загрузить сводки ПМ", key="upload_pm_btn"): with st.spinner("Загружаю файл..."): - try: - files = {"file": (uploaded_ca.name, uploaded_ca.read(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} - response = requests.post(f"{API_BASE_URL}/svodka_ca/upload", files=files) - result = response.json() - - if response.status_code == 200: - st.success(f"✅ {result.get('message', 'Файл загружен')}") - st.info(f"ID объекта: {result.get('object_id', 'N/A')}") - else: - st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") - except Exception as e: - st.error(f"❌ Ошибка: {str(e)}") - - # Вкладка 2: Сводки ПМ - with tab2: - st.header("📊 Сводки ПМ") + 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) @@ -204,18 +155,12 @@ def main(): columns = st.multiselect( "Выберите столбцы", - ["ПП", "БП", "ТБ", "СЭБ", "НЭБ"], - default=["ПП", "СЭБ"], + ["БП", "ПП", "СЭБ", "Факт", "План"], + default=["БП", "ПП"], key="pm_single_columns" ) - search = st.selectbox( - "Фильтр", - [None, "Итого"], - key="pm_single_search" - ) - - if st.button("🔍 Получить данные", key="pm_single_btn"): + if st.button("🔍 Получить данные по ОГ", key="pm_single_btn"): if codes and columns: with st.spinner("Получаю данные..."): data = { @@ -223,8 +168,6 @@ def main(): "codes": codes, "columns": columns } - if search: - data["search"] = search result, status = make_api_request("/svodka_pm/get_single_og", data) @@ -242,23 +185,17 @@ def main(): codes_total = st.multiselect( "Выберите коды строк", [78, 79, 394, 395, 396, 397, 81, 82, 83, 84], - default=[78, 79], + default=[78, 79, 394, 395], key="pm_total_codes" ) columns_total = st.multiselect( "Выберите столбцы", - ["ПП", "БП", "ТБ", "СЭБ", "НЭБ"], - default=["ПП", "СЭБ"], + ["БП", "ПП", "СЭБ", "Факт", "План"], + default=["БП", "ПП", "СЭБ"], key="pm_total_columns" ) - search_total = st.selectbox( - "Фильтр", - [None, "Итого"], - key="pm_total_search" - ) - if st.button("🔍 Получить данные по всем ОГ", key="pm_total_btn"): if codes_total and columns_total: with st.spinner("Получаю данные..."): @@ -266,8 +203,6 @@ def main(): "codes": codes_total, "columns": columns_total } - if search_total: - data["search"] = search_total result, status = make_api_request("/svodka_pm/get_total_ogs", data) @@ -279,50 +214,109 @@ def main(): else: st.warning("⚠️ Выберите коды и столбцы") - # Вкладка 3: Сводки СА + # Вкладка 2: Сводки СА - полный функционал + with tab2: + st.header("🏭 Сводки СА - Полный функционал") + + # Секция загрузки файлов + st.subheader("📤 Загрузка файлов") + uploaded_ca = st.file_uploader( + "Выберите Excel файл сводки СА", + type=['xlsx', 'xlsm', 'xls'], + key="ca_upload" + ) + + if uploaded_ca is not None: + if st.button("📤 Загрузить сводку СА", key="upload_ca_btn"): + with st.spinner("Загружаю файл..."): + try: + files = {"file": (uploaded_ca.name, uploaded_ca.read(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} + response = requests.post(f"{API_BASE_URL}/svodka_ca/upload", files=files) + result = response.json() + + if response.status_code == 200: + st.success(f"✅ {result.get('message', 'Файл загружен')}") + st.info(f"ID объекта: {result.get('object_id', 'N/A')}") + else: + st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") + except Exception as e: + st.error(f"❌ Ошибка: {str(e)}") + + st.markdown("---") + + # Секция получения данных + st.subheader("🔍 Получение данных") + + col1, col2 = st.columns(2) + + with col1: + st.subheader("Параметры запроса") + + modes = st.multiselect( + "Выберите режимы", + ["План", "Факт", "Норматив"], + default=["План", "Факт"], + key="ca_modes" + ) + + tables = st.multiselect( + "Выберите таблицы", + ["ТиП", "Топливо", "Потери"], + default=["ТиП", "Топливо"], + key="ca_tables" + ) + + with col2: + st.subheader("Результат") + if st.button("🔍 Получить данные СА", key="ca_btn"): + if modes and tables: + with st.spinner("Получаю данные..."): + data = { + "modes": modes, + "tables": tables + } + + result, status = make_api_request("/svodka_ca/get_data", data) + + if status == 200: + st.success("✅ Данные получены") + st.json(result) + else: + st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") + else: + st.warning("⚠️ Выберите режимы и таблицы") + + # Вкладка 3: Мониторинг топлива - полный функционал with tab3: - st.header("🏭 Сводки СА") + st.header("⛽ Мониторинг топлива - Полный функционал") - st.subheader("Получение данных из сводки СА") - - modes = st.multiselect( - "Выберите режимы", - ["plan", "fact", "normativ"], - default=["plan", "fact"], - key="ca_modes" + # Секция загрузки файлов + st.subheader("📤 Загрузка файлов") + uploaded_fuel = st.file_uploader( + "Выберите ZIP архив с мониторингом топлива", + type=['zip'], + key="fuel_upload" ) - tables = st.multiselect( - "Выберите таблицы", - ["ТиП, %", "Топливо итого, тонн", "Топливо итого, %", - "Топливо на технологию, тонн", "Топливо на технологию, %", - "Топливо на энергетику, тонн", "Топливо на энергетику, %", - "Потери итого, тонн", "Потери итого, %"], - default=["ТиП, %", "Топливо итого, тонн"], - key="ca_tables" - ) - - if st.button("🔍 Получить данные СА", key="ca_btn"): - if modes and tables: - with st.spinner("Получаю данные..."): - data = { - "modes": modes, - "tables": tables - } - - result, status = make_api_request("/svodka_ca/get_data", data) + if uploaded_fuel is not None: + if st.button("📤 Загрузить мониторинг топлива", key="upload_fuel_btn"): + with st.spinner("Загружаю файл..."): + result, status = upload_file_to_api( + "/monitoring_fuel/upload-zip", + uploaded_fuel.read(), + uploaded_fuel.name + ) if status == 200: - st.success("✅ Данные получены") - st.json(result) + st.success(f"✅ {result.get('message', 'Файл загружен')}") + st.info(f"ID объекта: {result.get('object_id', 'N/A')}") else: st.error(f"❌ Ошибка: {result.get('message', 'Неизвестная ошибка')}") - else: - st.warning("⚠️ Выберите режимы и таблицы") - - # Вкладка 4: Мониторинг топлива - with tab4: - st.header("⛽ Мониторинг топлива") + + st.markdown("---") + + # Секция получения данных + st.subheader("🔍 Получение данных") col1, col2 = st.columns(2)