From f3c0848f807227c3e501ea6e949e02109fb6ad2b Mon Sep 17 00:00:00 2001 From: Cizz22 Date: Wed, 15 Oct 2025 21:32:30 +0700 Subject: [PATCH] fix --- src/aeros_equipment/service.py | 4 +- src/aeros_simulation/router.py | 80 ++++++++++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/aeros_equipment/service.py b/src/aeros_equipment/service.py index 493e651..6a9210b 100644 --- a/src/aeros_equipment/service.py +++ b/src/aeros_equipment/service.py @@ -429,8 +429,8 @@ async def update_equipment_for_simulation(*, db_session: DbSession,aeros_db_sess continue eq["cmDisP1"] = reliabiility.get("cmDisP1", 0) - eq["relDisType"] = "Fixed" - eq["relDisP1"] = simulation_duration + offset + 1 + eq["relDisType"] = "Exponential2" + eq["relDisP1"] = reliabiility.get("relDisP2", 0) eq["relDisP2"] = 0 eq["ohDisP1"] = overhaul_duration eq["ohDisUnitCode"] = "UHour" diff --git a/src/aeros_simulation/router.py b/src/aeros_simulation/router.py index 1449a6e..527246a 100644 --- a/src/aeros_simulation/router.py +++ b/src/aeros_simulation/router.py @@ -2,13 +2,13 @@ from collections import defaultdict from datetime import datetime from typing import List, Optional from uuid import UUID - +from sqlalchemy.orm import selectinload from fastapi import APIRouter, BackgroundTasks, HTTPException, background, status, Query -from sqlalchemy import select +from sqlalchemy import select, text from temporalio.client import Client from src.aeros_contribution.service import update_contribution_bulk_mappings from src.aeros_equipment.model import AerosEquipment -from src.aeros_simulation.model import EafContribution +from src.aeros_simulation.model import AerosSimulationCalcResult, EafContribution, AerosNode from src.auth.service import CurrentUser from src.config import TEMPORAL_URL from src.database.core import CollectorDbSession, DbSession @@ -386,3 +386,77 @@ async def calculate_contribution( ) +@router.get("/result/critical/{simulation_id}]", response_model=StandardResponse[List[SimulationCalc]]) +async def get_critical_equipment(db_session:DbSession, simulation_id:UUID): + # Step 1: Get all failure events for this simulation + failure_query = text(""" + SELECT DISTINCT + (elem ->> 'currentEvent') AS jenis, + (elem ->> 'cumulativeTime')::numeric AS cumulative_time + FROM rbd_tr_aeros_simulation_plot_result AS a + JOIN public.rbd_ms_aeros_node AS b + ON a.aeros_node_id = b.id + JOIN LATERAL jsonb_array_elements(a.timestamp_outs) AS elem ON TRUE + WHERE a.aeros_simulation_id = :simulation_id + AND b.node_name = '- TJB - Unit 3 -' + AND (elem ->> 'currentEQStatus') = 'OoS' + AND (elem ->> 'currentEvent') != 'ON_OH' + ORDER BY cumulative_time; + """) + + query = await db_session.execute(failure_query, { + "simulation_id": simulation_id, + }) + + failures = query.fetchall() + + results = [] + + # Step 2: For each failure, find which equipment caused it + for fail in failures: + cumulative_time = fail.cumulative_time + jenis = fail.jenis + + equipment_query = text(""" + SELECT b.id + FROM rbd_tr_aeros_simulation_plot_result AS a + JOIN public.rbd_ms_aeros_node AS b ON a.aeros_node_id = b.id + WHERE EXISTS ( + SELECT 1 + FROM jsonb_array_elements(a.timestamp_outs) AS elem + WHERE + (elem ->> 'currentEQStatus') = 'OoS' AND + (elem ->> 'cumulativeTime')::numeric = :cumulative_time + ) + AND a.aeros_simulation_id = :simulation_id + AND b.node_type = 'RegularNode'; + """) + + equipment = (await db_session.execute(equipment_query, { + "simulation_id": simulation_id, + "cumulative_time": cumulative_time + })).fetchall() + + equipment_list = [eq.id for eq in equipment] + + results.extend(equipment_list) + + query = (select(AerosSimulationCalcResult).filter( + AerosSimulationCalcResult.aeros_simulation_id == simulation_id)).filter(AerosSimulationCalcResult.aeros_node_id.in_(results)) + + query = query.options( + selectinload(AerosSimulationCalcResult.aeros_node).options( + selectinload(AerosNode.equipment) + )) + + data = await db_session.execute(query) + + equipments = data.scalars.all() + + return { + "data": equipments, + "status": "success", + "message": "Success", + } + + \ No newline at end of file