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.models import DefaultMixin
from sqlalchemy.dialects.postgresql import ARRAY
class AerosEquipment(Base, DefaultMixin):
@ -78,6 +79,13 @@ class AerosEquipment(Base, DefaultMixin):
uselist=False,
)
custom_parameters = relationship(
"AerosEquipmentCustomParameterData",
lazy="raise",
primaryjoin="and_(AerosEquipment.node_name == foreign(AerosEquipmentCustomParameterData.location_tag))",
uselist=True,
)
class AerosEquipmentDetail(Base, DefaultMixin):
@ -98,3 +106,12 @@ class MasterEquipment(Base, DefaultMixin):
location_tag = 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):
name: str
class CustomParameter(DefultBase):
level: str
failure_rates: List[float]
mttr: float
class Equipment(EquipmentBase):
location_tag: str
master_equipment: MasterEquipment
class EquipmentWithCustomParameters(Equipment):
custom_parameters: List[CustomParameter] = []
class EquipmentRead(EquipmentBase):
AerosData: dict
MasterData: Equipment

@ -16,7 +16,8 @@ from .schema import (
SimulationPagination,
SimulationPlotResult,
SimulationCalc,
SimulationData
SimulationData,
SimulationRankingParameters
)
from .service import (
create_simulation,
@ -30,6 +31,8 @@ from .service import (
get_result_ranking
)
from src.aeros_equipment.schema import EquipmentWithCustomParameters
router = APIRouter()
active_simulations = {}
@ -137,7 +140,7 @@ async def get_simulation_result_plot(db_session: DbSession, simulation_id):
"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):
"""Get simulation result."""
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 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
class SimulationInput(BaseModel):
@ -92,6 +92,9 @@ class SimulationData(BaseModel):
reliability: Optional[dict]
created_at: datetime
class SimulationRankingParameters(EquipmentWithCustomParameters):
eaf:float
class SimulationPagination(Pagination):
items: List[SimulationData] = []

@ -4,7 +4,7 @@ from uuid import uuid4, uuid4, UUID
import logging
import httpx
from fastapi import HTTPException, status
from sqlalchemy import delete, select, update
from sqlalchemy import delete, select, update, and_
from sqlalchemy.orm import selectinload
from src.config import AEROS_BASE_URL, DEFAULT_PROJECT_NAME
@ -22,7 +22,9 @@ from .model import (
AerosSimulationPlotResult,
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)
active_simulations = {}
@ -489,7 +491,6 @@ async def get_simulation_with_calc_result(
query = (select(AerosSimulationCalcResult).filter(
AerosSimulationCalcResult.aeros_simulation_id == simulation_id))
if schematic_name:
if schematic_name == "WTP":
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):
query = select(AerosSimulationCalcResult).where(
AerosSimulationCalcResult.aeros_simulation_id == simulation_id
)
query = select(AerosEquipment, AerosSimulationCalcResult.eaf).join(AerosNode, AerosNode.node_name == AerosEquipment.node_name).join(AerosSimulationCalcResult, AerosSimulationCalcResult.aeros_node_id == AerosNode.id)
query = query.join(
AerosNode, AerosNode.id == AerosSimulationCalcResult.aeros_node_id
query = query.filter(
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.options(
selectinload(AerosSimulationCalcResult.aeros_node))
selectinload(AerosEquipment.custom_parameters)).options(
selectinload(AerosEquipment.master_equipment)
)
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(

Loading…
Cancel
Save