oper_spravka_tech_pos реализован
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, MonitoringTarParser, SvodkaRepairCAParser, StatusesRepairCAParser
|
||||
from adapters.parsers import SvodkaPMParser, SvodkaCAParser, MonitoringFuelParser, MonitoringTarParser, SvodkaRepairCAParser, StatusesRepairCAParser, OperSpravkaTechPosParser
|
||||
|
||||
from core.models import UploadRequest, DataRequest
|
||||
from core.services import ReportService, PARSERS
|
||||
@@ -18,6 +18,7 @@ from app.schemas import (
|
||||
SvodkaCARequest,
|
||||
MonitoringFuelMonthRequest, MonitoringFuelTotalRequest
|
||||
)
|
||||
from app.schemas.oper_spravka_tech_pos import OperSpravkaTechPosRequest, OperSpravkaTechPosResponse
|
||||
from app.schemas.svodka_repair_ca import SvodkaRepairCARequest
|
||||
from app.schemas.statuses_repair_ca import StatusesRepairCARequest
|
||||
from app.schemas.monitoring_tar import MonitoringTarRequest, MonitoringTarFullRequest
|
||||
@@ -31,6 +32,7 @@ PARSERS.update({
|
||||
'monitoring_tar': MonitoringTarParser,
|
||||
'svodka_repair_ca': SvodkaRepairCAParser,
|
||||
'statuses_repair_ca': StatusesRepairCAParser,
|
||||
'oper_spravka_tech_pos': OperSpravkaTechPosParser,
|
||||
# 'svodka_plan_sarnpz': SvodkaPlanSarnpzParser,
|
||||
})
|
||||
|
||||
@@ -124,8 +126,8 @@ async def get_available_ogs(parser_name: str):
|
||||
|
||||
parser_class = PARSERS[parser_name]
|
||||
|
||||
# Для svodka_repair_ca возвращаем ОГ из загруженных данных
|
||||
if parser_name == "svodka_repair_ca":
|
||||
# Для парсеров с данными в MinIO возвращаем ОГ из загруженных данных
|
||||
if parser_name in ["svodka_repair_ca", "oper_spravka_tech_pos"]:
|
||||
try:
|
||||
# Создаем экземпляр сервиса и загружаем данные из MinIO
|
||||
report_service = get_report_service()
|
||||
@@ -135,10 +137,22 @@ async def get_available_ogs(parser_name: str):
|
||||
# Если данные загружены, извлекаем ОГ из них
|
||||
if loaded_data is not None and hasattr(loaded_data, 'data') and loaded_data.data is not None:
|
||||
# Для svodka_repair_ca данные возвращаются в формате словаря по ОГ
|
||||
data_value = loaded_data.data.get('value')
|
||||
if isinstance(data_value, dict):
|
||||
available_ogs = list(data_value.keys())
|
||||
return {"parser": parser_name, "available_ogs": available_ogs}
|
||||
if parser_name == "svodka_repair_ca":
|
||||
data_value = loaded_data.data.get('value')
|
||||
if isinstance(data_value, dict):
|
||||
available_ogs = list(data_value.keys())
|
||||
return {"parser": parser_name, "available_ogs": available_ogs}
|
||||
# Для oper_spravka_tech_pos данные возвращаются в формате списка
|
||||
elif parser_name == "oper_spravka_tech_pos":
|
||||
# Данные уже в правильном формате, возвращаем их
|
||||
if isinstance(loaded_data.data, list) and loaded_data.data:
|
||||
# Извлекаем уникальные ОГ из данных
|
||||
available_ogs = []
|
||||
for item in loaded_data.data:
|
||||
if isinstance(item, dict) and 'id' in item:
|
||||
available_ogs.append(item['id'])
|
||||
if available_ogs:
|
||||
return {"parser": parser_name, "available_ogs": available_ogs}
|
||||
except Exception as e:
|
||||
print(f"⚠️ Ошибка при получении ОГ: {e}")
|
||||
import traceback
|
||||
@@ -1309,5 +1323,114 @@ async def get_monitoring_tar_full_data():
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
# ====== OPER SPRAVKA TECH POS ENDPOINTS ======
|
||||
|
||||
@app.post("/oper_spravka_tech_pos/upload", tags=[OperSpravkaTechPosParser.name],
|
||||
summary="Загрузка отчета операционной справки технологических позиций")
|
||||
async def upload_oper_spravka_tech_pos(
|
||||
file: UploadFile = File(...)
|
||||
):
|
||||
"""Загрузка и обработка отчета операционной справки технологических позиций
|
||||
|
||||
### Поддерживаемые форматы:
|
||||
- **ZIP архивы** с файлами операционных справок
|
||||
|
||||
### Структура данных:
|
||||
- Обрабатывает ZIP архивы с файлами операционных справок по технологическим позициям
|
||||
- Извлекает данные по процессам: Первичная переработка, Гидроочистка топлив, Риформирование, Изомеризация
|
||||
- Возвращает данные по установкам с планом и фактом
|
||||
"""
|
||||
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="oper_spravka_tech_pos",
|
||||
file_name=file.filename,
|
||||
file_content=file_content,
|
||||
parse_params={}
|
||||
)
|
||||
|
||||
# Загружаем и обрабатываем отчет
|
||||
result = report_service.upload_report(upload_request)
|
||||
|
||||
if result.success:
|
||||
return UploadResponse(
|
||||
success=True,
|
||||
message="Отчет успешно загружен и обработан",
|
||||
object_id=result.object_id
|
||||
)
|
||||
else:
|
||||
return UploadErrorResponse(
|
||||
success=False,
|
||||
message=result.message,
|
||||
error_code="ERR_UPLOAD",
|
||||
details=None
|
||||
)
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
@app.post("/oper_spravka_tech_pos/get_data", tags=[OperSpravkaTechPosParser.name],
|
||||
summary="Получение данных операционной справки технологических позиций",
|
||||
response_model=OperSpravkaTechPosResponse)
|
||||
async def get_oper_spravka_tech_pos_data(request: OperSpravkaTechPosRequest):
|
||||
"""Получение данных операционной справки технологических позиций по ОГ
|
||||
|
||||
### Параметры:
|
||||
- **id** (str): ID ОГ (например, 'SNPZ', 'KNPZ')
|
||||
|
||||
### Возвращает:
|
||||
- Данные по технологическим позициям для указанного ОГ
|
||||
- Включает информацию о процессах, установках, плане и факте
|
||||
"""
|
||||
report_service = get_report_service()
|
||||
|
||||
try:
|
||||
# Создаем запрос на получение данных
|
||||
data_request = DataRequest(
|
||||
report_type="oper_spravka_tech_pos",
|
||||
get_params={"id": request.id}
|
||||
)
|
||||
|
||||
# Получаем данные
|
||||
result = report_service.get_data(data_request)
|
||||
|
||||
if result.success:
|
||||
# Извлекаем данные из результата
|
||||
value_data = result.data.get("value", []) if isinstance(result.data.get("value"), list) else []
|
||||
print(f"🔍 DEBUG: API возвращает данные: {type(value_data)}, длина: {len(value_data) if isinstance(value_data, (list, dict)) else 'N/A'}")
|
||||
|
||||
return OperSpravkaTechPosResponse(
|
||||
success=True,
|
||||
data=value_data,
|
||||
message="Данные успешно получены"
|
||||
)
|
||||
else:
|
||||
return OperSpravkaTechPosResponse(
|
||||
success=False,
|
||||
data=None,
|
||||
message=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)
|
||||
|
||||
38
python_parser/app/schemas/oper_spravka_tech_pos.py
Normal file
38
python_parser/app/schemas/oper_spravka_tech_pos.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional, List
|
||||
|
||||
|
||||
class OperSpravkaTechPosRequest(BaseModel):
|
||||
"""Запрос для получения данных операционной справки технологических позиций"""
|
||||
id: str = Field(..., description="ID ОГ (например, 'SNPZ', 'KNPZ')")
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"id": "SNPZ"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class OperSpravkaTechPosResponse(BaseModel):
|
||||
"""Ответ с данными операционной справки технологических позиций"""
|
||||
success: bool = Field(..., description="Статус успешности операции")
|
||||
data: Optional[List[dict]] = Field(None, description="Данные по технологическим позициям")
|
||||
message: Optional[str] = Field(None, description="Сообщение о результате операции")
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"success": True,
|
||||
"data": [
|
||||
{
|
||||
"Процесс": "Первичная переработка",
|
||||
"Установка": "ЭЛОУ-АВТ-6",
|
||||
"План, т": 14855.0,
|
||||
"Факт, т": 15149.647,
|
||||
"id": "SNPZ.EAVT6"
|
||||
}
|
||||
],
|
||||
"message": "Данные успешно получены"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user