Compare commits
7 Commits
816547d82c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f600b7b4af | |||
| b01320acde | |||
| db3788ac69 | |||
| 31fad98133 | |||
| 88294de506 | |||
| cb8e8b2483 | |||
| 4624442991 |
@@ -44,6 +44,21 @@ class MonitoringFuelParser(ParserPort):
|
|||||||
description="Получение временного ряда по ID и колонкам"
|
description="Получение временного ряда по ID и колонкам"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для мониторинга топлива"""
|
||||||
|
# Для monitoring_fuel определяем геттер из параметра mode
|
||||||
|
getter_name = get_params.pop("mode", None)
|
||||||
|
if not getter_name:
|
||||||
|
# Если режим не указан, берем первый доступный
|
||||||
|
available_getters = list(self.getters.keys())
|
||||||
|
if available_getters:
|
||||||
|
getter_name = available_getters[0]
|
||||||
|
logger.warning(f"⚠️ Режим не указан, используем первый доступный: {getter_name}")
|
||||||
|
else:
|
||||||
|
raise ValueError("Парсер не имеет доступных геттеров")
|
||||||
|
|
||||||
|
return getter_name
|
||||||
|
|
||||||
def _get_total_by_columns(self, params: dict):
|
def _get_total_by_columns(self, params: dict):
|
||||||
"""Агрегация данных по колонкам"""
|
"""Агрегация данных по колонкам"""
|
||||||
# Валидируем параметры с помощью схемы Pydantic
|
# Валидируем параметры с помощью схемы Pydantic
|
||||||
|
|||||||
@@ -24,6 +24,16 @@ class MonitoringTarParser(ParserPort):
|
|||||||
# Регистрируем геттеры
|
# Регистрируем геттеры
|
||||||
self.register_getter('get_tar_data', self._get_tar_data_wrapper, required_params=['mode'])
|
self.register_getter('get_tar_data', self._get_tar_data_wrapper, required_params=['mode'])
|
||||||
self.register_getter('get_tar_full_data', self._get_tar_full_data_wrapper, required_params=[])
|
self.register_getter('get_tar_full_data', self._get_tar_full_data_wrapper, required_params=[])
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для мониторинга ТАР"""
|
||||||
|
# Для monitoring_tar определяем геттер по параметрам
|
||||||
|
if 'mode' in get_params:
|
||||||
|
# Если есть параметр mode, используем get_tar_data
|
||||||
|
return 'get_tar_data'
|
||||||
|
else:
|
||||||
|
# Если нет параметра mode, используем get_tar_full_data
|
||||||
|
return 'get_tar_full_data'
|
||||||
|
|
||||||
def parse(self, file_path: str, params: Dict[str, Any] = None) -> pd.DataFrame:
|
def parse(self, file_path: str, params: Dict[str, Any] = None) -> pd.DataFrame:
|
||||||
"""Парсит ZIP архив с файлами мониторинга ТЭР"""
|
"""Парсит ZIP архив с файлами мониторинга ТЭР"""
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ class OperSpravkaTechPosParser(ParserPort):
|
|||||||
|
|
||||||
# Регистрируем геттер
|
# Регистрируем геттер
|
||||||
self.register_getter('get_tech_pos', self._get_tech_pos_wrapper, required_params=['id'])
|
self.register_getter('get_tech_pos', self._get_tech_pos_wrapper, required_params=['id'])
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для операционных справок технологических позиций"""
|
||||||
|
# Для oper_spravka_tech_pos всегда используем геттер get_tech_pos
|
||||||
|
return 'get_tech_pos'
|
||||||
|
|
||||||
def parse(self, file_path: str, params: Dict[str, Any] = None) -> pd.DataFrame:
|
def parse(self, file_path: str, params: Dict[str, Any] = None) -> pd.DataFrame:
|
||||||
"""Парсит ZIP архив с файлами операционных справок технологических позиций"""
|
"""Парсит ZIP архив с файлами операционных справок технологических позиций"""
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ class StatusesRepairCAParser(ParserPort):
|
|||||||
description="Получение статусов ремонта по ОГ и ключам"
|
description="Получение статусов ремонта по ОГ и ключам"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для статусов ремонта СА"""
|
||||||
|
# Для statuses_repair_ca всегда используем геттер get_repair_statuses
|
||||||
|
return 'get_repair_statuses'
|
||||||
|
|
||||||
def parse(self, file_path: str, params: dict) -> Dict[str, Any]:
|
def parse(self, file_path: str, params: dict) -> Dict[str, Any]:
|
||||||
"""Парсинг файла статусов ремонта СА"""
|
"""Парсинг файла статусов ремонта СА"""
|
||||||
logger.debug(f"🔍 StatusesRepairCAParser.parse вызван с файлом: {file_path}")
|
logger.debug(f"🔍 StatusesRepairCAParser.parse вызван с файлом: {file_path}")
|
||||||
|
|||||||
@@ -27,6 +27,23 @@ class SvodkaCAParser(ParserPort):
|
|||||||
description="Получение данных по режимам и таблицам"
|
description="Получение данных по режимам и таблицам"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для сводки СА"""
|
||||||
|
# Для svodka_ca определяем режим из данных или используем 'fact' по умолчанию
|
||||||
|
if hasattr(self, 'df') and self.df is not None and not self.df.empty:
|
||||||
|
modes_in_df = self.df['mode'].unique() if 'mode' in self.df.columns else ['fact']
|
||||||
|
# Используем первый найденный режим или 'fact' по умолчанию
|
||||||
|
default_mode = modes_in_df[0] if len(modes_in_df) > 0 else 'fact'
|
||||||
|
else:
|
||||||
|
default_mode = 'fact'
|
||||||
|
|
||||||
|
# Устанавливаем режим в параметры, если он не указан
|
||||||
|
if 'mode' not in get_params:
|
||||||
|
get_params['mode'] = default_mode
|
||||||
|
|
||||||
|
# Для svodka_ca всегда используем геттер get_ca_data
|
||||||
|
return 'get_ca_data'
|
||||||
|
|
||||||
def _get_data_wrapper(self, params: dict):
|
def _get_data_wrapper(self, params: dict):
|
||||||
"""Получение данных по режимам и таблицам"""
|
"""Получение данных по режимам и таблицам"""
|
||||||
logger.debug(f"🔍 _get_data_wrapper вызван с параметрами: {params}")
|
logger.debug(f"🔍 _get_data_wrapper вызван с параметрами: {params}")
|
||||||
|
|||||||
@@ -42,6 +42,21 @@ class SvodkaPMParser(ParserPort):
|
|||||||
description="Получение данных по всем ОГ из сводки ПМ"
|
description="Получение данных по всем ОГ из сводки ПМ"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для сводки ПМ"""
|
||||||
|
# Для svodka_pm определяем геттер из параметра mode
|
||||||
|
getter_name = get_params.pop("mode", None)
|
||||||
|
if not getter_name:
|
||||||
|
# Если режим не указан, берем первый доступный
|
||||||
|
available_getters = list(self.getters.keys())
|
||||||
|
if available_getters:
|
||||||
|
getter_name = available_getters[0]
|
||||||
|
logger.warning(f"⚠️ Режим не указан, используем первый доступный: {getter_name}")
|
||||||
|
else:
|
||||||
|
raise ValueError("Парсер не имеет доступных геттеров")
|
||||||
|
|
||||||
|
return getter_name
|
||||||
|
|
||||||
def parse(self, file_path: str, params: dict) -> Dict[str, pd.DataFrame]:
|
def parse(self, file_path: str, params: dict) -> Dict[str, pd.DataFrame]:
|
||||||
"""Парсинг ZIP архива со сводками ПМ и возврат словаря с DataFrame"""
|
"""Парсинг ZIP архива со сводками ПМ и возврат словаря с DataFrame"""
|
||||||
# Проверяем расширение файла
|
# Проверяем расширение файла
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ class SvodkaRepairCAParser(ParserPort):
|
|||||||
description="Получение данных о ремонтных работах"
|
description="Получение данных о ремонтных работах"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: dict) -> str:
|
||||||
|
"""Определение геттера для сводки ремонта СА"""
|
||||||
|
# Для svodka_repair_ca всегда используем геттер get_repair_data
|
||||||
|
return 'get_repair_data'
|
||||||
|
|
||||||
def _get_repair_data_wrapper(self, params: dict):
|
def _get_repair_data_wrapper(self, params: dict):
|
||||||
"""Получение данных о ремонтных работах"""
|
"""Получение данных о ремонтных работах"""
|
||||||
logger.debug(f"🔍 _get_repair_data_wrapper вызван с параметрами: {params}")
|
logger.debug(f"🔍 _get_repair_data_wrapper вызван с параметрами: {params}")
|
||||||
|
|||||||
@@ -164,10 +164,25 @@ async def get_server_info():
|
|||||||
"""Получение подробной информации о сервере"""
|
"""Получение подробной информации о сервере"""
|
||||||
import platform
|
import platform
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
|
import psutil
|
||||||
|
|
||||||
|
# Получаем информацию о процессе
|
||||||
|
process = psutil.Process()
|
||||||
|
parent_process = process.parent()
|
||||||
|
|
||||||
|
# Получаем информацию о системе
|
||||||
|
cpu_cores = psutil.cpu_count()
|
||||||
|
memory_info = psutil.virtual_memory()
|
||||||
|
memory_mb = memory_info.total / (1024 * 1024) # Конвертируем в MB
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"message": "Svodka Parser API",
|
"message": "Svodka Parser API",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
"process_id": process.pid,
|
||||||
|
"parent_id": parent_process.pid if parent_process else None,
|
||||||
|
"cpu_cores": cpu_cores,
|
||||||
|
"memory_mb": memory_mb,
|
||||||
"python_version": sys.version,
|
"python_version": sys.version,
|
||||||
"platform": platform.platform(),
|
"platform": platform.platform(),
|
||||||
"available_parsers": list(PARSERS.keys())
|
"available_parsers": list(PARSERS.keys())
|
||||||
|
|||||||
@@ -268,6 +268,7 @@ async def get_monitoring_fuel_series_by_id_and_columns(
|
|||||||
@router.post("/async/monitoring_fuel/upload-zip", tags=[MonitoringFuelParser.name],
|
@router.post("/async/monitoring_fuel/upload-zip", tags=[MonitoringFuelParser.name],
|
||||||
summary="Асинхронная загрузка файлов сводок мониторинга топлива одним ZIP-архивом",
|
summary="Асинхронная загрузка файлов сводок мониторинга топлива одним ZIP-архивом",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат архива или файлов"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат архива или файлов"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ async def get_monitoring_tar_full_data(
|
|||||||
@router.post("/async/monitoring_tar/upload", tags=[MonitoringTarParser.name],
|
@router.post("/async/monitoring_tar/upload", tags=[MonitoringTarParser.name],
|
||||||
summary="Асинхронная загрузка файла отчета мониторинга ТАР",
|
summary="Асинхронная загрузка файла отчета мониторинга ТАР",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
|
|||||||
@@ -41,20 +41,20 @@ def get_async_report_service() -> AsyncReportService:
|
|||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
},)
|
},)
|
||||||
async def upload_oper_spravka_tech_pos(
|
async def upload_oper_spravka_tech_pos(
|
||||||
file: UploadFile = File(..., description="Excel файл оперативной справки техпос (.xlsx, .xlsm, .xls)")
|
file: UploadFile = File(..., description="ZIP архив с файлами оперативной справки техпос (.zip)")
|
||||||
):
|
):
|
||||||
"""Загрузка и обработка отчета оперативной справки техпос"""
|
"""Загрузка и обработка отчета оперативной справки техпос"""
|
||||||
report_service = get_report_service()
|
report_service = get_report_service()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not file.filename.endswith(('.xlsx', '.xlsm', '.xls')):
|
if not file.filename.endswith('.zip'):
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
content=UploadErrorResponse(
|
content=UploadErrorResponse(
|
||||||
message="Поддерживаются только Excel файлы (.xlsx, .xlsm, .xls)",
|
message="Поддерживаются только ZIP архивы (.zip)",
|
||||||
error_code="INVALID_FILE_TYPE",
|
error_code="INVALID_FILE_TYPE",
|
||||||
details={
|
details={
|
||||||
"expected_formats": [".xlsx", ".xlsm", ".xls"],
|
"expected_formats": [".zip"],
|
||||||
"received_format": file.filename.split('.')[-1] if '.' in file.filename else "unknown"
|
"received_format": file.filename.split('.')[-1] if '.' in file.filename else "unknown"
|
||||||
}
|
}
|
||||||
).model_dump()
|
).model_dump()
|
||||||
@@ -115,9 +115,11 @@ async def get_oper_spravka_tech_pos_data(
|
|||||||
result = report_service.get_data(request)
|
result = report_service.get_data(request)
|
||||||
|
|
||||||
if result.success:
|
if result.success:
|
||||||
|
# Извлекаем данные из result.data["value"]
|
||||||
|
data = result.data.get("value", []) if isinstance(result.data, dict) else result.data
|
||||||
return OperSpravkaTechPosResponse(
|
return OperSpravkaTechPosResponse(
|
||||||
success=True,
|
success=True,
|
||||||
data=result.data
|
data=data
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(status_code=404, detail=result.message)
|
raise HTTPException(status_code=404, detail=result.message)
|
||||||
@@ -131,25 +133,26 @@ async def get_oper_spravka_tech_pos_data(
|
|||||||
@router.post("/async/oper_spravka_tech_pos/upload", tags=[OperSpravkaTechPosParser.name],
|
@router.post("/async/oper_spravka_tech_pos/upload", tags=[OperSpravkaTechPosParser.name],
|
||||||
summary="Асинхронная загрузка файла отчета оперативной справки техпос",
|
summary="Асинхронная загрузка файла отчета оперативной справки техпос",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
},)
|
},)
|
||||||
async def async_upload_oper_spravka_tech_pos(
|
async def async_upload_oper_spravka_tech_pos(
|
||||||
file: UploadFile = File(..., description="Excel файл оперативной справки техпос (.xlsx, .xlsm, .xls)")
|
file: UploadFile = File(..., description="ZIP архив с файлами оперативной справки техпос (.zip)")
|
||||||
):
|
):
|
||||||
"""Асинхронная загрузка и обработка отчета оперативной справки техпос"""
|
"""Асинхронная загрузка и обработка отчета оперативной справки техпос"""
|
||||||
async_service = get_async_report_service()
|
async_service = get_async_report_service()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not file.filename.endswith(('.xlsx', '.xlsm', '.xls')):
|
if not file.filename.endswith('.zip'):
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
content=UploadErrorResponse(
|
content=UploadErrorResponse(
|
||||||
message="Поддерживаются только Excel файлы (.xlsx, .xlsm, .xls)",
|
message="Поддерживаются только ZIP архивы (.zip)",
|
||||||
error_code="INVALID_FILE_TYPE",
|
error_code="INVALID_FILE_TYPE",
|
||||||
details={
|
details={
|
||||||
"expected_formats": [".xlsx", ".xlsm", ".xls"],
|
"expected_formats": [".zip"],
|
||||||
"received_format": file.filename.split('.')[-1] if '.' in file.filename else "unknown"
|
"received_format": file.filename.split('.')[-1] if '.' in file.filename else "unknown"
|
||||||
}
|
}
|
||||||
).model_dump()
|
).model_dump()
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ async def get_statuses_repair_ca_data(
|
|||||||
@router.post("/async/statuses_repair_ca/upload", tags=[StatusesRepairCAParser.name],
|
@router.post("/async/statuses_repair_ca/upload", tags=[StatusesRepairCAParser.name],
|
||||||
summary="Асинхронная загрузка файла отчета статусов ремонта СА",
|
summary="Асинхронная загрузка файла отчета статусов ремонта СА",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ async def get_svodka_ca_data(
|
|||||||
@router.post("/async/svodka_ca/upload", tags=[SvodkaCAParser.name],
|
@router.post("/async/svodka_ca/upload", tags=[SvodkaCAParser.name],
|
||||||
summary="Асинхронная загрузка файла отчета сводки СА",
|
summary="Асинхронная загрузка файла отчета сводки СА",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ async def get_svodka_pm_data(
|
|||||||
@router.post("/async/svodka_pm/upload-zip", tags=[SvodkaPMParser.name],
|
@router.post("/async/svodka_pm/upload-zip", tags=[SvodkaPMParser.name],
|
||||||
summary="Асинхронная загрузка файлов сводок ПМ одним ZIP-архивом",
|
summary="Асинхронная загрузка файлов сводок ПМ одним ZIP-архивом",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат архива или файлов"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат архива или файлов"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ async def get_svodka_repair_ca_data(
|
|||||||
@router.post("/async/svodka_repair_ca/upload", tags=[SvodkaRepairCAParser.name],
|
@router.post("/async/svodka_repair_ca/upload", tags=[SvodkaRepairCAParser.name],
|
||||||
summary="Асинхронная загрузка файла отчета сводки ремонта СА",
|
summary="Асинхронная загрузка файла отчета сводки ремонта СА",
|
||||||
response_model=UploadResponse,
|
response_model=UploadResponse,
|
||||||
|
include_in_schema=False,
|
||||||
responses={
|
responses={
|
||||||
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
400: {"model": UploadErrorResponse, "description": "Неверный формат файла"},
|
||||||
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
500: {"model": UploadErrorResponse, "description": "Внутренняя ошибка сервера"}
|
||||||
|
|||||||
@@ -84,6 +84,35 @@ class ParserPort(ABC):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Ошибка выполнения геттера '{getter_name}': {str(e)}")
|
raise ValueError(f"Ошибка выполнения геттера '{getter_name}': {str(e)}")
|
||||||
|
|
||||||
|
def determine_getter(self, get_params: Dict[str, Any]) -> str:
|
||||||
|
"""
|
||||||
|
Определение имени геттера на основе параметров запроса
|
||||||
|
|
||||||
|
Args:
|
||||||
|
get_params: Параметры запроса
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Имя геттера для выполнения
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: Если не удается определить геттер
|
||||||
|
"""
|
||||||
|
# По умолчанию используем первый доступный геттер
|
||||||
|
available_getters = list(self.getters.keys())
|
||||||
|
if not available_getters:
|
||||||
|
raise ValueError("Парсер не имеет доступных геттеров")
|
||||||
|
|
||||||
|
# Если указан режим, используем его
|
||||||
|
if 'mode' in get_params:
|
||||||
|
mode = get_params['mode']
|
||||||
|
if mode in self.getters:
|
||||||
|
return mode
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Режим '{mode}' не найден. Доступные: {available_getters}")
|
||||||
|
|
||||||
|
# Иначе используем первый доступный
|
||||||
|
return available_getters[0]
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def parse(self, file_path: str, params: dict) -> pd.DataFrame:
|
def parse(self, file_path: str, params: dict) -> pd.DataFrame:
|
||||||
"""Парсинг файла и возврат DataFrame"""
|
"""Парсинг файла и возврат DataFrame"""
|
||||||
|
|||||||
@@ -122,83 +122,14 @@ class ReportService:
|
|||||||
# Получаем параметры запроса
|
# Получаем параметры запроса
|
||||||
get_params = request.get_params or {}
|
get_params = request.get_params or {}
|
||||||
|
|
||||||
# Для svodka_ca определяем режим из данных или используем 'fact' по умолчанию
|
# Определяем имя геттера через парсер (делегируем логику в адаптер)
|
||||||
if request.report_type == 'svodka_ca':
|
try:
|
||||||
# Извлекаем режим из DataFrame или используем 'fact' по умолчанию
|
getter_name = parser.determine_getter(get_params)
|
||||||
if hasattr(parser, 'df') and parser.df is not None and not parser.df.empty:
|
except ValueError as e:
|
||||||
modes_in_df = parser.df['mode'].unique() if 'mode' in parser.df.columns else ['fact']
|
return DataResult(
|
||||||
# Используем первый найденный режим или 'fact' по умолчанию
|
success=False,
|
||||||
default_mode = modes_in_df[0] if len(modes_in_df) > 0 else 'fact'
|
message=str(e)
|
||||||
else:
|
)
|
||||||
default_mode = 'fact'
|
|
||||||
|
|
||||||
# Устанавливаем режим в параметры, если он не указан
|
|
||||||
if 'mode' not in get_params:
|
|
||||||
get_params['mode'] = default_mode
|
|
||||||
|
|
||||||
# Определяем имя геттера
|
|
||||||
if request.report_type == 'svodka_ca':
|
|
||||||
# Для svodka_ca используем геттер get_ca_data
|
|
||||||
getter_name = 'get_ca_data'
|
|
||||||
elif request.report_type == 'svodka_repair_ca':
|
|
||||||
# Для svodka_repair_ca используем геттер get_repair_data
|
|
||||||
getter_name = 'get_repair_data'
|
|
||||||
elif request.report_type == 'statuses_repair_ca':
|
|
||||||
# Для statuses_repair_ca используем геттер get_repair_statuses
|
|
||||||
getter_name = 'get_repair_statuses'
|
|
||||||
elif request.report_type == 'monitoring_tar':
|
|
||||||
# Для monitoring_tar определяем геттер по параметрам
|
|
||||||
if 'mode' in get_params:
|
|
||||||
# Если есть параметр mode, используем get_tar_data
|
|
||||||
getter_name = 'get_tar_data'
|
|
||||||
else:
|
|
||||||
# Если нет параметра mode, используем get_tar_full_data
|
|
||||||
getter_name = 'get_tar_full_data'
|
|
||||||
elif request.report_type == 'monitoring_fuel':
|
|
||||||
# Для monitoring_fuel определяем геттер из параметра 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]
|
|
||||||
logger.warning(f"⚠️ Режим не указан, используем первый доступный: {getter_name}")
|
|
||||||
else:
|
|
||||||
return DataResult(
|
|
||||||
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]
|
|
||||||
logger.warning(f"⚠️ Режим не указан, используем первый доступный: {getter_name}")
|
|
||||||
else:
|
|
||||||
return DataResult(
|
|
||||||
success=False,
|
|
||||||
message="Парсер не имеет доступных геттеров"
|
|
||||||
)
|
|
||||||
elif request.report_type == 'oper_spravka_tech_pos':
|
|
||||||
# Для oper_spravka_tech_pos используем геттер get_tech_pos
|
|
||||||
getter_name = 'get_tech_pos'
|
|
||||||
else:
|
|
||||||
# Для других парсеров определяем из параметра 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]
|
|
||||||
logger.warning(f"⚠️ Режим не указан, используем первый доступный: {getter_name}")
|
|
||||||
else:
|
|
||||||
return DataResult(
|
|
||||||
success=False,
|
|
||||||
message="Парсер не имеет доступных геттеров"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Получаем значение через указанный геттер
|
# Получаем значение через указанный геттер
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ requests>=2.31.0
|
|||||||
# pytest-cov>=4.0.0
|
# pytest-cov>=4.0.0
|
||||||
# pytest-mock>=3.10.0
|
# pytest-mock>=3.10.0
|
||||||
httpx>=0.24.0
|
httpx>=0.24.0
|
||||||
numpy
|
numpy
|
||||||
|
psutil>=5.9.0
|
||||||
Reference in New Issue
Block a user