Эндпоинты топлива полностью работают
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user