From cf38d7b5b5075803b0ca78cf3d38fc7f7ddba8a9 Mon Sep 17 00:00:00 2001 From: Cizz22 Date: Wed, 6 Aug 2025 15:43:56 +0700 Subject: [PATCH] add custom parameter data --- src/aeros_equipment/model.py | 17 +++++++++++++++ src/aeros_equipment/schema.py | 8 +++++++ src/aeros_simulation/router.py | 7 ++++-- src/aeros_simulation/schema.py | 5 ++++- src/aeros_simulation/service.py | 38 +++++++++++++++++++++++---------- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/aeros_equipment/model.py b/src/aeros_equipment/model.py index a56d4a4..ca4588e 100644 --- a/src/aeros_equipment/model.py +++ b/src/aeros_equipment/model.py @@ -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) diff --git a/src/aeros_equipment/schema.py b/src/aeros_equipment/schema.py index baffd63..47771b6 100644 --- a/src/aeros_equipment/schema.py +++ b/src/aeros_equipment/schema.py @@ -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 diff --git a/src/aeros_simulation/router.py b/src/aeros_simulation/router.py index fa6c43a..2147c7f 100644 --- a/src/aeros_simulation/router.py +++ b/src/aeros_simulation/router.py @@ -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) diff --git a/src/aeros_simulation/schema.py b/src/aeros_simulation/schema.py index c0bfdab..12186e4 100644 --- a/src/aeros_simulation/schema.py +++ b/src/aeros_simulation/schema.py @@ -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] = [] diff --git a/src/aeros_simulation/service.py b/src/aeros_simulation/service.py index c47c7e9..64c7679 100644 --- a/src/aeros_simulation/service.py +++ b/src/aeros_simulation/service.py @@ -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(