diff --git a/python_parser/adapters/parsers/svodka_pm.py b/python_parser/adapters/parsers/svodka_pm.py index df473ca..3901a08 100644 --- a/python_parser/adapters/parsers/svodka_pm.py +++ b/python_parser/adapters/parsers/svodka_pm.py @@ -160,13 +160,23 @@ class SvodkaPMParser(ParserPort): if last_good_name: new_columns.append(last_good_name) else: - # Если нет хорошего имени, пропускаем - continue + # Если нет хорошего имени, используем имя по умолчанию + new_columns.append(f"col_{len(new_columns)}") else: # Это хорошая колонка last_good_name = col_str new_columns.append(col_str) + # Убеждаемся, что количество столбцов совпадает + if len(new_columns) != len(df_final.columns): + # Если количество не совпадает, обрезаем или дополняем + if len(new_columns) > len(df_final.columns): + new_columns = new_columns[:len(df_final.columns)] + else: + # Дополняем недостающие столбцы + while len(new_columns) < len(df_final.columns): + new_columns.append(f"col_{len(new_columns)}") + # Применяем новые заголовки df_final.columns = new_columns @@ -256,8 +266,9 @@ class SvodkaPMParser(ParserPort): ''' Служебная функция получения данных по одному ОГ ''' result = {} - fact_df = pm_dict['facts'][id] - plan_df = pm_dict['plans'][id] + # Безопасно получаем данные, проверяя их наличие + fact_df = pm_dict.get('facts', {}).get(id) if 'facts' in pm_dict else None + plan_df = pm_dict.get('plans', {}).get(id) if 'plans' in pm_dict else None # Определяем, какие столбцы из какого датафрейма брать for col in columns: @@ -266,6 +277,7 @@ class SvodkaPMParser(ParserPort): if col in ['ПП', 'БП']: if plan_df is None: print(f"❌ Невозможно обработать '{col}': нет данных плана для {id}") + col_result = {code: None for code in codes} else: for code in codes: val = self.get_svodka_value(plan_df, code, col, search_value) @@ -274,6 +286,7 @@ class SvodkaPMParser(ParserPort): elif col in ['ТБ', 'СЭБ', 'НЭБ']: if fact_df is None: print(f"❌ Невозможно обработать '{col}': нет данных факта для {id}") + col_result = {code: None for code in codes} else: for code in codes: val = self.get_svodka_value(fact_df, code, col, search_value) diff --git a/python_parser/app/main.py b/python_parser/app/main.py index 302eaed..d3151bf 100644 --- a/python_parser/app/main.py +++ b/python_parser/app/main.py @@ -323,7 +323,7 @@ async def get_svodka_pm_single_og( try: # Создаем запрос request_dict = request_data.model_dump() - request_dict['mode'] = 'single' + request_dict['mode'] = 'single_og' request = DataRequest( report_type='svodka_pm', get_params=request_dict @@ -377,7 +377,7 @@ async def get_svodka_pm_total_ogs( try: # Создаем запрос request_dict = request_data.model_dump() - request_dict['mode'] = 'total' + request_dict['mode'] = 'total_ogs' request = DataRequest( report_type='svodka_pm', get_params=request_dict diff --git a/python_parser/core/services.py b/python_parser/core/services.py index e2d1146..bb29f53 100644 --- a/python_parser/core/services.py +++ b/python_parser/core/services.py @@ -138,6 +138,20 @@ class ReportService: success=False, message="Парсер не имеет доступных геттеров" ) + elif request.report_type == 'svodka_pm': + # Для svodka_pm определяем геттер из параметра mode + getter_name = get_params.pop("mode", None) + if not getter_name: + # Если режим не указан, берем первый доступный + available_getters = list(parser.getters.keys()) + if available_getters: + getter_name = available_getters[0] + print(f"⚠️ Режим не указан, используем первый доступный: {getter_name}") + else: + return DataResult( + success=False, + message="Парсер не имеет доступных геттеров" + ) else: # Для других парсеров определяем из параметра mode getter_name = get_params.pop("mode", None) diff --git a/python_parser/test_app.py b/python_parser/test_app.py new file mode 100644 index 0000000..3431ec7 --- /dev/null +++ b/python_parser/test_app.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +""" +Простой тест для проверки работы FastAPI +""" +from fastapi import FastAPI + +app = FastAPI(title="Test API") + +@app.get("/") +async def root(): + return {"message": "Test API is working"} + +@app.get("/health") +async def health(): + return {"status": "ok"} + +if __name__ == "__main__": + import uvicorn + print("Starting test server...") + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file