Упростил сервисы

This commit is contained in:
2025-09-08 18:38:59 +03:00
parent 816547d82c
commit 4624442991
9 changed files with 109 additions and 77 deletions

View File

@@ -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

View File

@@ -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 архив с файлами мониторинга ТЭР"""

View File

@@ -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 архив с файлами операционных справок технологических позиций"""

View File

@@ -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}")

View File

@@ -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}")

View File

@@ -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"""
# Проверяем расширение файла # Проверяем расширение файла

View File

@@ -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}")

View File

@@ -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"""

View File

@@ -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: