monitoring_tar полностью функционален
This commit is contained in:
@@ -6,7 +6,7 @@ from fastapi import FastAPI, File, UploadFile, HTTPException, status
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from adapters.storage import MinIOStorageAdapter
|
||||
from adapters.parsers import SvodkaPMParser, SvodkaCAParser, MonitoringFuelParser, SvodkaRepairCAParser, StatusesRepairCAParser
|
||||
from adapters.parsers import SvodkaPMParser, SvodkaCAParser, MonitoringFuelParser, MonitoringTarParser, SvodkaRepairCAParser, StatusesRepairCAParser
|
||||
|
||||
from core.models import UploadRequest, DataRequest
|
||||
from core.services import ReportService, PARSERS
|
||||
@@ -20,6 +20,7 @@ from app.schemas import (
|
||||
)
|
||||
from app.schemas.svodka_repair_ca import SvodkaRepairCARequest
|
||||
from app.schemas.statuses_repair_ca import StatusesRepairCARequest
|
||||
from app.schemas.monitoring_tar import MonitoringTarRequest, MonitoringTarFullRequest
|
||||
|
||||
|
||||
# Парсеры
|
||||
@@ -27,6 +28,7 @@ PARSERS.update({
|
||||
'svodka_pm': SvodkaPMParser,
|
||||
'svodka_ca': SvodkaCAParser,
|
||||
'monitoring_fuel': MonitoringFuelParser,
|
||||
'monitoring_tar': MonitoringTarParser,
|
||||
'svodka_repair_ca': SvodkaRepairCAParser,
|
||||
'statuses_repair_ca': StatusesRepairCAParser,
|
||||
# 'svodka_plan_sarnpz': SvodkaPlanSarnpzParser,
|
||||
@@ -1163,5 +1165,149 @@ async def get_monitoring_fuel_month_by_code(
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
# ====== MONITORING TAR ENDPOINTS ======
|
||||
|
||||
@app.post("/monitoring_tar/upload", tags=[MonitoringTarParser.name],
|
||||
summary="Загрузка отчета мониторинга ТЭР")
|
||||
async def upload_monitoring_tar(
|
||||
file: UploadFile = File(...)
|
||||
):
|
||||
"""Загрузка и обработка отчета мониторинга ТЭР (Топливно-энергетических ресурсов)
|
||||
|
||||
### Поддерживаемые форматы:
|
||||
- **ZIP архивы** с файлами мониторинга ТЭР
|
||||
|
||||
### Структура данных:
|
||||
- Обрабатывает ZIP архивы с файлами по месяцам (svodka_tar_SNPZ_01.xlsx - svodka_tar_SNPZ_12.xlsx)
|
||||
- Извлекает данные по установкам (SNPZ_IDS)
|
||||
- Возвращает два типа данных: 'total' (строки "Всего") и 'last_day' (последние строки)
|
||||
"""
|
||||
report_service = get_report_service()
|
||||
|
||||
try:
|
||||
# Проверяем тип файла - только ZIP архивы
|
||||
if not file.filename.endswith('.zip'):
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Неподдерживаемый тип файла. Ожидается только ZIP архив (.zip)"
|
||||
)
|
||||
|
||||
# Читаем содержимое файла
|
||||
file_content = await file.read()
|
||||
|
||||
# Создаем запрос на загрузку
|
||||
upload_request = UploadRequest(
|
||||
report_type='monitoring_tar',
|
||||
file_content=file_content,
|
||||
file_name=file.filename
|
||||
)
|
||||
|
||||
# Загружаем отчет
|
||||
result = report_service.upload_report(upload_request)
|
||||
|
||||
if result.success:
|
||||
return UploadResponse(
|
||||
success=True,
|
||||
message="Отчет успешно загружен и обработан",
|
||||
report_id=result.object_id,
|
||||
filename=file.filename
|
||||
).model_dump()
|
||||
else:
|
||||
return UploadErrorResponse(
|
||||
success=False,
|
||||
message=result.message,
|
||||
error_code="ERR_UPLOAD",
|
||||
details=None
|
||||
).model_dump()
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
@app.post("/monitoring_tar/get_data", tags=[MonitoringTarParser.name],
|
||||
summary="Получение данных из отчета мониторинга ТЭР")
|
||||
async def get_monitoring_tar_data(
|
||||
request_data: MonitoringTarRequest
|
||||
):
|
||||
"""Получение данных из отчета мониторинга ТЭР
|
||||
|
||||
### Структура параметров:
|
||||
- `mode`: **Режим получения данных** (опциональный)
|
||||
- `"total"` - строки "Всего" (агрегированные данные)
|
||||
- `"last_day"` - последние строки данных
|
||||
- Если не указан, возвращаются все данные
|
||||
|
||||
### Пример тела запроса:
|
||||
```json
|
||||
{
|
||||
"mode": "total"
|
||||
}
|
||||
```
|
||||
"""
|
||||
report_service = get_report_service()
|
||||
|
||||
try:
|
||||
# Создаем запрос
|
||||
request_dict = request_data.model_dump()
|
||||
request = DataRequest(
|
||||
report_type='monitoring_tar',
|
||||
get_params=request_dict
|
||||
)
|
||||
|
||||
# Получаем данные
|
||||
result = report_service.get_data(request)
|
||||
|
||||
if result.success:
|
||||
return {
|
||||
"success": True,
|
||||
"data": result.data
|
||||
}
|
||||
else:
|
||||
raise HTTPException(status_code=404, detail=result.message)
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
@app.post("/monitoring_tar/get_full_data", tags=[MonitoringTarParser.name],
|
||||
summary="Получение всех данных из отчета мониторинга ТЭР")
|
||||
async def get_monitoring_tar_full_data():
|
||||
"""Получение всех данных из отчета мониторинга ТЭР без фильтрации
|
||||
|
||||
### Возвращает:
|
||||
- Все данные по всем установкам
|
||||
- И данные 'total', и данные 'last_day'
|
||||
- Полная структура данных мониторинга ТЭР
|
||||
"""
|
||||
report_service = get_report_service()
|
||||
|
||||
try:
|
||||
# Создаем запрос без параметров
|
||||
request = DataRequest(
|
||||
report_type='monitoring_tar',
|
||||
get_params={}
|
||||
)
|
||||
|
||||
# Получаем данные
|
||||
result = report_service.get_data(request)
|
||||
|
||||
if result.success:
|
||||
return {
|
||||
"success": True,
|
||||
"data": result.data
|
||||
}
|
||||
else:
|
||||
raise HTTPException(status_code=404, detail=result.message)
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run(app, host="0.0.0.0", port=8080)
|
||||
|
||||
33
python_parser/app/schemas/monitoring_tar.py
Normal file
33
python_parser/app/schemas/monitoring_tar.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional, Literal
|
||||
from enum import Enum
|
||||
|
||||
class TarMode(str, Enum):
|
||||
"""Режимы получения данных мониторинга ТЭР"""
|
||||
TOTAL = "total"
|
||||
LAST_DAY = "last_day"
|
||||
|
||||
class MonitoringTarRequest(BaseModel):
|
||||
"""Схема запроса для получения данных мониторинга ТЭР"""
|
||||
mode: Optional[TarMode] = Field(
|
||||
None,
|
||||
description="Режим получения данных: 'total' (строки 'Всего') или 'last_day' (последние строки). Если не указан, возвращаются все данные",
|
||||
example="total"
|
||||
)
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"mode": "total"
|
||||
}
|
||||
}
|
||||
|
||||
class MonitoringTarFullRequest(BaseModel):
|
||||
"""Схема запроса для получения всех данных мониторинга ТЭР"""
|
||||
# Пустая схема - возвращает все данные без фильтрации
|
||||
pass
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {}
|
||||
}
|
||||
Reference in New Issue
Block a user