|
|
|
|
@ -27,7 +27,8 @@ from src.equipment.service import (
|
|
|
|
|
delete,
|
|
|
|
|
generate_all_transaction,
|
|
|
|
|
get_top_10_economic_life,
|
|
|
|
|
get_maximo_by_assetnum
|
|
|
|
|
get_maximo_by_assetnum,
|
|
|
|
|
get_all_assetnums,
|
|
|
|
|
)
|
|
|
|
|
from src.modules.equipment.Prediksi import main as prediksi_main
|
|
|
|
|
from src.modules.equipment.Eac import Eac
|
|
|
|
|
@ -115,6 +116,46 @@ async def simulate_equipment(db_session: DbSession, assetnum: str):
|
|
|
|
|
|
|
|
|
|
return StreamingResponse(event_generator(), media_type='text/event-stream')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/simulate-all")
|
|
|
|
|
async def simulate_all_equipment(db_session: DbSession):
|
|
|
|
|
"""Run simulation (prediksi + EAC) for ALL equipment.
|
|
|
|
|
Returns SSE stream of progress.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
async def event_generator():
|
|
|
|
|
# fetch all assetnums
|
|
|
|
|
try:
|
|
|
|
|
assetnums = await get_all_assetnums(db_session=db_session)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
yield f"data: {json.dumps({'status':'error', 'message': f'Failed to fetch assetnums: {str(e)}'})}\\n\\n"
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
total = len(assetnums)
|
|
|
|
|
yield f"data: {json.dumps({'status':'started', 'message': f'Starting simulation for {total} assets'})}\\n\\n"
|
|
|
|
|
|
|
|
|
|
success_count = 0
|
|
|
|
|
error_count = 0
|
|
|
|
|
|
|
|
|
|
for idx, assetnum in enumerate(assetnums, start=1):
|
|
|
|
|
yield f"data: {json.dumps({'status':'working', 'step':f'Processing {idx}/{total}', 'assetnum': assetnum})}\\n\\n"
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# Prediksi
|
|
|
|
|
await prediksi_main(assetnum=assetnum)
|
|
|
|
|
# EAC
|
|
|
|
|
eac = Eac()
|
|
|
|
|
await eac.hitung_eac_equipment(assetnum=assetnum)
|
|
|
|
|
success_count += 1
|
|
|
|
|
except Exception as e:
|
|
|
|
|
error_count += 1
|
|
|
|
|
yield f"data: {json.dumps({'status':'partial_error', 'assetnum': assetnum, 'message': str(e)})}\\n\\n"
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
yield f"data: {json.dumps({'status':'done', 'message':f'All simulations completed. Success: {success_count}, Errors: {error_count}'})}\\n\\n"
|
|
|
|
|
|
|
|
|
|
return StreamingResponse(event_generator(), media_type='text/event-stream')
|
|
|
|
|
|
|
|
|
|
@router.get(
|
|
|
|
|
"/count-remaining-life",
|
|
|
|
|
response_model=StandardResponse[CountRemainingLifeResponse],
|
|
|
|
|
|