main
Cizz22 3 months ago
parent 326b69bf61
commit aa5cd84585

@ -248,6 +248,88 @@ async def get_simulation_result_ranking(db_session: DbSession, simulation_id, li
}
@router.get("/result/critical/{simulation_id}]", response_model=StandardResponse[List[SimulationCalc]])
async def get_critical_equipment(db_session:DbSession, simulation_id: str):
# Step 1: Get all failure events for this simulation
if simulation_id == 'default':
simulation = await get_default_simulation(db_session=db_session)
simulation_id = simulation.id
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",
}
@router.get("/custom_parameters", response_model=StandardResponse[list])
async def get_custom_parameters_controller(db_session: DbSession):
"""Get simulation result."""
@ -385,83 +467,3 @@ async def calculate_contribution(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)
)
@router.get("/result/critical/{simulation_id}]", response_model=StandardResponse[List[SimulationCalc]])
async def get_critical_equipment(db_session:DbSession, simulation_id: str):
# Step 1: Get all failure events for this simulation
if simulation_id == 'default':
simulation = await get_default_simulation(db_session=db_session)
simulation_id = simulation.id
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",
}
Loading…
Cancel
Save