feat: Implement `/simulate-all` endpoint to run predictions and EAC for all equipment, and refine `is_actual` determination logic.

rest-api
MrWaradana 1 month ago
parent ab54c61416
commit b72e1ec51d

@ -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],

@ -704,6 +704,14 @@ async def update(
return updated_data
async def get_all_assetnums(*, db_session: DbSession) -> list[str]:
"""Returns a list of all assetnums."""
query = Select(Equipment.assetnum)
result = await db_session.execute(query)
return result.scalars().all()
async def delete(*, db_session: DbSession, equipment_id: str):
"""Deletes a document."""
query = Delete(Equipment).where(Equipment.id == equipment_id)

@ -605,7 +605,11 @@ async def insert_lcca_maximo_corrective_data():
assetnum, # assetnum
year, # tahun
seq, # seq
(0 if year > current_year + 1 else 1), # is_actual
(
(1 if year <= current_year - 1 else 0)
if datetime.now().month >= 12
else (0 if year > current_year + 1 else 1)
), # is_actual
raw_cm_material_cost, # raw_cm_material_cost
raw_cm_labor_time, # raw_cm_labor_time
rc_cm_material_cost, # rc_cm_material_cost
@ -1127,9 +1131,15 @@ async def query_data(target_assetnum: str = None):
total_elapsed = datetime.now() - overall_start
pct_assets = (idx / total_assets) * 100 if total_assets else 100
# progress per asset
action_info = f"Inserted: {inserted_this_asset}"
if updated_this_asset > 0:
action_info = f"Updated: {updated_this_asset}"
if inserted_this_asset > 0:
action_info += f", Inserted: {inserted_this_asset}"
print(
f"[{idx}/{total_assets}] Asset {assetnum} processed. "
f"Inserted: {inserted_this_asset}, Updated: {updated_this_asset}. "
f"{action_info}. "
f"Asset time: {asset_elapsed.total_seconds():.2f}s. "
f"Total Ins: {total_inserted}, Upd: {total_updated}. "
f"Overall elapsed: {total_elapsed.total_seconds():.2f}s. "

Loading…
Cancel
Save