add custom parameter data

main
Cizz22 5 months ago
parent 18deae293a
commit cf38d7b5b5

@ -13,6 +13,7 @@ from sqlalchemy.orm import relationship
from src.database.core import Base from src.database.core import Base
from src.models import DefaultMixin from src.models import DefaultMixin
from sqlalchemy.dialects.postgresql import ARRAY
class AerosEquipment(Base, DefaultMixin): class AerosEquipment(Base, DefaultMixin):
@ -78,6 +79,13 @@ class AerosEquipment(Base, DefaultMixin):
uselist=False, uselist=False,
) )
custom_parameters = relationship(
"AerosEquipmentCustomParameterData",
lazy="raise",
primaryjoin="and_(AerosEquipment.node_name == foreign(AerosEquipmentCustomParameterData.location_tag))",
uselist=True,
)
class AerosEquipmentDetail(Base, DefaultMixin): class AerosEquipmentDetail(Base, DefaultMixin):
@ -98,3 +106,12 @@ class MasterEquipment(Base, DefaultMixin):
location_tag = Column(String, nullable=True) location_tag = Column(String, nullable=True)
name = Column(String, nullable=True) name = Column(String, nullable=True)
class AerosEquipmentCustomParameterData(Base, DefaultMixin):
__tablename__ = 'rbd_ms_equipment_custom_input'
location_tag = Column(String(100), nullable=False)
level = Column(String(20), nullable=False)
failure_rates = Column(ARRAY(Numeric), nullable=True)
mttr = Column(Numeric, nullable=True)

@ -44,10 +44,18 @@ class EquipmentBase(DefultBase):
class MasterEquipment(DefultBase): class MasterEquipment(DefultBase):
name: str name: str
class CustomParameter(DefultBase):
level: str
failure_rates: List[float]
mttr: float
class Equipment(EquipmentBase): class Equipment(EquipmentBase):
location_tag: str location_tag: str
master_equipment: MasterEquipment master_equipment: MasterEquipment
class EquipmentWithCustomParameters(Equipment):
custom_parameters: List[CustomParameter] = []
class EquipmentRead(EquipmentBase): class EquipmentRead(EquipmentBase):
AerosData: dict AerosData: dict
MasterData: Equipment MasterData: Equipment

@ -16,7 +16,8 @@ from .schema import (
SimulationPagination, SimulationPagination,
SimulationPlotResult, SimulationPlotResult,
SimulationCalc, SimulationCalc,
SimulationData SimulationData,
SimulationRankingParameters
) )
from .service import ( from .service import (
create_simulation, create_simulation,
@ -30,6 +31,8 @@ from .service import (
get_result_ranking get_result_ranking
) )
from src.aeros_equipment.schema import EquipmentWithCustomParameters
router = APIRouter() router = APIRouter()
active_simulations = {} active_simulations = {}
@ -137,7 +140,7 @@ async def get_simulation_result_plot(db_session: DbSession, simulation_id):
"message": "Simulation result retrieved successfully", "message": "Simulation result retrieved successfully",
} }
@router.get("/result/ranking/{simulation_id}", response_model=StandardResponse[List[SimulationCalc]]) @router.get("/result/ranking/{simulation_id}", response_model=StandardResponse[List[SimulationRankingParameters]])
async def get_simulation_result_ranking(db_session: DbSession, simulation_id): async def get_simulation_result_ranking(db_session: DbSession, simulation_id):
"""Get simulation result.""" """Get simulation result."""
simulation_result = await get_result_ranking(db_session=db_session, simulation_id=simulation_id) simulation_result = await get_result_ranking(db_session=db_session, simulation_id=simulation_id)

@ -5,7 +5,7 @@ from uuid import UUID
from pydantic import Field from pydantic import Field
from src.models import BaseModel, Pagination from src.models import BaseModel, Pagination
from src.aeros_equipment.schema import MasterEquipment from src.aeros_equipment.schema import MasterEquipment, EquipmentWithCustomParameters
# Pydantic models for request/response validation # Pydantic models for request/response validation
class SimulationInput(BaseModel): class SimulationInput(BaseModel):
@ -92,6 +92,9 @@ class SimulationData(BaseModel):
reliability: Optional[dict] reliability: Optional[dict]
created_at: datetime created_at: datetime
class SimulationRankingParameters(EquipmentWithCustomParameters):
eaf:float
class SimulationPagination(Pagination): class SimulationPagination(Pagination):
items: List[SimulationData] = [] items: List[SimulationData] = []

@ -4,7 +4,7 @@ from uuid import uuid4, uuid4, UUID
import logging import logging
import httpx import httpx
from fastapi import HTTPException, status from fastapi import HTTPException, status
from sqlalchemy import delete, select, update from sqlalchemy import delete, select, update, and_
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
from src.config import AEROS_BASE_URL, DEFAULT_PROJECT_NAME from src.config import AEROS_BASE_URL, DEFAULT_PROJECT_NAME
@ -22,7 +22,9 @@ from .model import (
AerosSimulationPlotResult, AerosSimulationPlotResult,
AerosSchematic AerosSchematic
) )
from .schema import SimulationInput from src.aeros_equipment.model import AerosEquipment, AerosEquipmentCustomParameterData
from src.aeros_equipment.schema import EquipmentWithCustomParameters
from .schema import SimulationInput, SimulationRankingParameters
client = httpx.AsyncClient(timeout=300.0) client = httpx.AsyncClient(timeout=300.0)
active_simulations = {} active_simulations = {}
@ -489,7 +491,6 @@ async def get_simulation_with_calc_result(
query = (select(AerosSimulationCalcResult).filter( query = (select(AerosSimulationCalcResult).filter(
AerosSimulationCalcResult.aeros_simulation_id == simulation_id)) AerosSimulationCalcResult.aeros_simulation_id == simulation_id))
if schematic_name: if schematic_name:
if schematic_name == "WTP": if schematic_name == "WTP":
query = query.join( query = query.join(
@ -512,24 +513,39 @@ async def get_simulation_with_calc_result(
async def get_result_ranking(*, db_session: DbSession, simulation_id: UUID): async def get_result_ranking(*, db_session: DbSession, simulation_id: UUID):
query = select(AerosSimulationCalcResult).where( query = select(AerosEquipment, AerosSimulationCalcResult.eaf).join(AerosNode, AerosNode.node_name == AerosEquipment.node_name).join(AerosSimulationCalcResult, AerosSimulationCalcResult.aeros_node_id == AerosNode.id)
AerosSimulationCalcResult.aeros_simulation_id == simulation_id
)
query = query.join( query = query.filter(
AerosNode, AerosNode.id == AerosSimulationCalcResult.aeros_node_id and_(
AerosSimulationCalcResult.aeros_simulation_id == simulation_id,
AerosNode.node_type == "RegularNode",
AerosEquipment.custom_parameters.any()
)
) )
query = query.where(AerosNode.node_type == "RegularNode")
query = query.order_by(AerosSimulationCalcResult.eaf.desc()).limit(10) query = query.order_by(AerosSimulationCalcResult.eaf.desc()).limit(10)
query = query.options( query = query.options(
selectinload(AerosSimulationCalcResult.aeros_node)) selectinload(AerosEquipment.custom_parameters)).options(
selectinload(AerosEquipment.master_equipment)
)
result = await db_session.execute(query) result = await db_session.execute(query)
return result.scalars().all() data = [
SimulationRankingParameters(
location_tag=equipment.location_tag,
master_equipment=equipment.master_equipment,
custom_parameters=equipment.custom_parameters,
eaf=eaf
)
for equipment, eaf in result
]
return data
async def get_simulation_with_plot_result( async def get_simulation_with_plot_result(

Loading…
Cancel
Save