Эндпоинты топлива полностью работают

This commit is contained in:
2025-09-02 11:40:27 +03:00
parent e3077252a8
commit eb6d23bba8
3 changed files with 110 additions and 11 deletions

View File

@@ -39,9 +39,31 @@ class MonitoringFuelParser(ParserPort):
columns = validated_params["columns"] columns = validated_params["columns"]
# TODO: Переделать под новую архитектуру # Проверяем, есть ли данные в data_dict (из парсинга) или в df (из загрузки)
df_means, _ = self.aggregate_by_columns(self.df, columns) if hasattr(self, 'data_dict') and self.data_dict is not None:
return df_means.to_dict(orient='index') # Данные из парсинга
data_source = self.data_dict
elif hasattr(self, 'df') and self.df is not None and not self.df.empty:
# Данные из загрузки - преобразуем DataFrame обратно в словарь
data_source = self._df_to_data_dict()
else:
return {}
# Агрегируем данные по колонкам
df_means, _ = self.aggregate_by_columns(data_source, columns)
# Преобразуем в JSON-совместимый формат
result = {}
for idx, row in df_means.iterrows():
result[str(idx)] = {}
for col in columns:
value = row.get(col)
if pd.isna(value) or value == float('inf') or value == float('-inf'):
result[str(idx)][col] = None
else:
result[str(idx)][col] = float(value) if isinstance(value, (int, float)) else value
return result
def _get_month_by_code(self, params: dict): def _get_month_by_code(self, params: dict):
"""Получение данных за конкретный месяц""" """Получение данных за конкретный месяц"""
@@ -50,14 +72,73 @@ class MonitoringFuelParser(ParserPort):
month = validated_params["month"] month = validated_params["month"]
# TODO: Переделать под новую архитектуру # Проверяем, есть ли данные в data_dict (из парсинга) или в df (из загрузки)
df_month = self.get_month(self.df, month) if hasattr(self, 'data_dict') and self.data_dict is not None:
return df_month.to_dict(orient='index') # Данные из парсинга
data_source = self.data_dict
elif hasattr(self, 'df') and self.df is not None and not self.df.empty:
# Данные из загрузки - преобразуем DataFrame обратно в словарь
data_source = self._df_to_data_dict()
else:
return {}
# Получаем данные за конкретный месяц
df_month = self.get_month(data_source, month)
# Преобразуем в JSON-совместимый формат
result = {}
for idx, row in df_month.iterrows():
result[str(idx)] = {}
for col in df_month.columns:
value = row[col]
if pd.isna(value) or value == float('inf') or value == float('-inf'):
result[str(idx)][col] = None
else:
result[str(idx)][col] = float(value) if isinstance(value, (int, float)) else value
return result
def _df_to_data_dict(self):
"""Преобразование DataFrame обратно в словарь данных"""
if not hasattr(self, 'df') or self.df is None or self.df.empty:
return {}
data_dict = {}
# Группируем данные по месяцам
for _, row in self.df.iterrows():
month = row.get('month')
data = row.get('data')
if month and data is not None:
data_dict[month] = data
return data_dict
def parse(self, file_path: str, params: dict) -> pd.DataFrame: def parse(self, file_path: str, params: dict) -> pd.DataFrame:
"""Парсинг файла и возврат DataFrame""" """Парсинг файла и возврат DataFrame"""
# Сохраняем DataFrame для использования в геттерах # Парсим данные и сохраняем словарь для использования в геттерах
self.df = self.parse_monitoring_fuel_files(file_path, params) self.data_dict = self.parse_monitoring_fuel_files(file_path, params)
# Преобразуем словарь в DataFrame для совместимости с services.py
if self.data_dict:
# Создаем DataFrame с информацией о месяцах и данных
data_rows = []
for month, df_data in self.data_dict.items():
if df_data is not None and not df_data.empty:
data_rows.append({
'month': month,
'rows_count': len(df_data),
'data': df_data
})
if data_rows:
df = pd.DataFrame(data_rows)
self.df = df
return df
# Если данных нет, возвращаем пустой DataFrame
self.df = pd.DataFrame()
return self.df return self.df
def parse_monitoring_fuel_files(self, zip_path: str, params: dict) -> Dict[str, pd.DataFrame]: def parse_monitoring_fuel_files(self, zip_path: str, params: dict) -> Dict[str, pd.DataFrame]:
@@ -148,7 +229,11 @@ class MonitoringFuelParser(ParserPort):
if 'name' in df_full.columns: if 'name' in df_full.columns:
# Применяем функцию get_id_by_name к каждой строке в колонке 'name' # Применяем функцию get_id_by_name к каждой строке в колонке 'name'
# df_full['id'] = df_full['name'].apply(get_object_by_name) # This line was removed as per new_code # df_full['id'] = df_full['name'].apply(get_object_by_name) # This line was removed as per new_code
pass # Placeholder for new_code # Временно используем name как id
df_full['id'] = df_full['name']
else:
# Если нет колонки name, создаем id из индекса
df_full['id'] = df_full.index
# Устанавливаем id как индекс # Устанавливаем id как индекс
df_full.set_index('id', inplace=True) df_full.set_index('id', inplace=True)

View File

@@ -804,7 +804,7 @@ async def get_monitoring_fuel_total_by_columns(
try: try:
# Создаем запрос # Создаем запрос
request_dict = request_data.model_dump() request_dict = request_data.model_dump()
request_dict['mode'] = 'total' request_dict['mode'] = 'total_by_columns'
request = DataRequest( request = DataRequest(
report_type='monitoring_fuel', report_type='monitoring_fuel',
get_params=request_dict get_params=request_dict
@@ -849,7 +849,7 @@ async def get_monitoring_fuel_month_by_code(
try: try:
# Создаем запрос # Создаем запрос
request_dict = request_data.model_dump() request_dict = request_data.model_dump()
request_dict['mode'] = 'month' request_dict['mode'] = 'month_by_code'
request = DataRequest( request = DataRequest(
report_type='monitoring_fuel', report_type='monitoring_fuel',
get_params=request_dict get_params=request_dict

View File

@@ -124,6 +124,20 @@ class ReportService:
if request.report_type == 'svodka_ca': if request.report_type == 'svodka_ca':
# Для svodka_ca используем геттер get_ca_data # Для svodka_ca используем геттер get_ca_data
getter_name = 'get_ca_data' getter_name = 'get_ca_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]
print(f"⚠️ Режим не указан, используем первый доступный: {getter_name}")
else:
return DataResult(
success=False,
message="Парсер не имеет доступных геттеров"
)
else: else:
# Для других парсеров определяем из параметра mode # Для других парсеров определяем из параметра mode
getter_name = get_params.pop("mode", None) getter_name = get_params.pop("mode", None)