statuses_repair_ca работает корректно
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
|
||||
from adapters.parsers import SvodkaPMParser, SvodkaCAParser, MonitoringFuelParser, SvodkaRepairCAParser, StatusesRepairCAParser
|
||||
|
||||
from core.models import UploadRequest, DataRequest
|
||||
from core.services import ReportService, PARSERS
|
||||
@@ -19,6 +19,7 @@ from app.schemas import (
|
||||
MonitoringFuelMonthRequest, MonitoringFuelTotalRequest
|
||||
)
|
||||
from app.schemas.svodka_repair_ca import SvodkaRepairCARequest
|
||||
from app.schemas.statuses_repair_ca import StatusesRepairCARequest
|
||||
|
||||
|
||||
# Парсеры
|
||||
@@ -27,6 +28,7 @@ PARSERS.update({
|
||||
'svodka_ca': SvodkaCAParser,
|
||||
'monitoring_fuel': MonitoringFuelParser,
|
||||
'svodka_repair_ca': SvodkaRepairCAParser,
|
||||
'statuses_repair_ca': StatusesRepairCAParser,
|
||||
# 'svodka_plan_sarnpz': SvodkaPlanSarnpzParser,
|
||||
})
|
||||
|
||||
@@ -730,6 +732,121 @@ async def get_svodka_repair_ca_data(
|
||||
raise HTTPException(status_code=500, detail=f"Внутренняя ошибка сервера: {str(e)}")
|
||||
|
||||
|
||||
@app.post("/statuses_repair_ca/upload", tags=[StatusesRepairCAParser.name],
|
||||
summary="Загрузка отчета статусов ремонта СА")
|
||||
async def upload_statuses_repair_ca(
|
||||
file: UploadFile = File(...)
|
||||
):
|
||||
"""
|
||||
Загрузка отчета статусов ремонта СА
|
||||
|
||||
### Поддерживаемые форматы:
|
||||
- **Excel файлы**: `.xlsx`, `.xlsm`, `.xls`
|
||||
- **ZIP архивы**: `.zip` (содержащие Excel файлы)
|
||||
|
||||
### Пример использования:
|
||||
```bash
|
||||
curl -X POST "http://localhost:8000/statuses_repair_ca/upload" \
|
||||
-H "accept: application/json" \
|
||||
-H "Content-Type: multipart/form-data" \
|
||||
-F "file=@statuses_repair_ca.xlsx"
|
||||
```
|
||||
"""
|
||||
report_service = get_report_service()
|
||||
|
||||
try:
|
||||
# Проверяем тип файла
|
||||
if not file.filename.endswith(('.xlsx', '.xlsm', '.xls', '.zip')):
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Поддерживаются только Excel файлы (.xlsx, .xlsm, .xls) или архивы (.zip)"
|
||||
)
|
||||
|
||||
# Читаем содержимое файла
|
||||
file_content = await file.read()
|
||||
|
||||
# Создаем запрос на загрузку
|
||||
upload_request = UploadRequest(
|
||||
report_type='statuses_repair_ca',
|
||||
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("/statuses_repair_ca/get_data", tags=[StatusesRepairCAParser.name],
|
||||
summary="Получение данных из отчета статусов ремонта СА")
|
||||
async def get_statuses_repair_ca_data(
|
||||
request_data: StatusesRepairCARequest
|
||||
):
|
||||
"""
|
||||
Получение данных из отчета статусов ремонта СА
|
||||
|
||||
### Структура параметров:
|
||||
- `ids`: **Массив ID ОГ** для фильтрации (опциональный)
|
||||
- `keys`: **Массив ключей** для извлечения данных (опциональный)
|
||||
|
||||
### Пример тела запроса:
|
||||
```json
|
||||
{
|
||||
"ids": ["SNPZ", "KNPZ", "ANHK"],
|
||||
"keys": [
|
||||
["Дата начала ремонта"],
|
||||
["Готовность к КР", "Факт"],
|
||||
["Заключение договоров на СМР", "Договор", "%"]
|
||||
]
|
||||
}
|
||||
```
|
||||
"""
|
||||
report_service = get_report_service()
|
||||
|
||||
try:
|
||||
# Создаем запрос
|
||||
request_dict = request_data.model_dump()
|
||||
request = DataRequest(
|
||||
report_type='statuses_repair_ca',
|
||||
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_fuel/upload", tags=[MonitoringFuelParser.name])
|
||||
# async def upload_monitoring_fuel(
|
||||
# file: UploadFile = File(...),
|
||||
|
||||
34
python_parser/app/schemas/statuses_repair_ca.py
Normal file
34
python_parser/app/schemas/statuses_repair_ca.py
Normal file
@@ -0,0 +1,34 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import List, Optional, Union
|
||||
from enum import Enum
|
||||
|
||||
class StatusesRepairCARequest(BaseModel):
|
||||
ids: Optional[List[str]] = Field(
|
||||
None,
|
||||
description="Массив ID ОГ для фильтрации (например, ['SNPZ', 'KNPZ'])",
|
||||
example=["SNPZ", "KNPZ", "ANHK"]
|
||||
)
|
||||
keys: Optional[List[List[str]]] = Field(
|
||||
None,
|
||||
description="Массив ключей для извлечения данных (например, [['Дата начала ремонта'], ['Готовность к КР', 'Факт']])",
|
||||
example=[
|
||||
["Дата начала ремонта"],
|
||||
["Отставание / опережение подготовки к КР", "Отставание / опережение"],
|
||||
["Отставание / опережение подготовки к КР", "Динамика за прошедшую неделю"],
|
||||
["Готовность к КР", "Факт"],
|
||||
["Заключение договоров на СМР", "Договор", "%"],
|
||||
["Поставка МТР", "На складе, позиций", "%"]
|
||||
]
|
||||
)
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"ids": ["SNPZ", "KNPZ", "ANHK"],
|
||||
"keys": [
|
||||
["Дата начала ремонта"],
|
||||
["Готовность к КР", "Факт"],
|
||||
["Заключение договоров на СМР", "Договор", "%"]
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user