diff --git a/src/equipment/__pycache__/router.cpython-311.pyc b/src/equipment/__pycache__/router.cpython-311.pyc index 5ecac5a..9b45157 100644 Binary files a/src/equipment/__pycache__/router.cpython-311.pyc and b/src/equipment/__pycache__/router.cpython-311.pyc differ diff --git a/src/equipment/__pycache__/service.cpython-311.pyc b/src/equipment/__pycache__/service.cpython-311.pyc index 61a84c4..0560491 100644 Binary files a/src/equipment/__pycache__/service.cpython-311.pyc and b/src/equipment/__pycache__/service.cpython-311.pyc differ diff --git a/src/equipment/router.py b/src/equipment/router.py index 20ac961..c78ac63 100644 --- a/src/equipment/router.py +++ b/src/equipment/router.py @@ -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], diff --git a/src/equipment/service.py b/src/equipment/service.py index 69cbe13..c0dd0bf 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -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) diff --git a/src/modules/equipment/__pycache__/insert_actual_data.cpython-311.pyc b/src/modules/equipment/__pycache__/insert_actual_data.cpython-311.pyc index 984ec58..e1ed601 100644 Binary files a/src/modules/equipment/__pycache__/insert_actual_data.cpython-311.pyc and b/src/modules/equipment/__pycache__/insert_actual_data.cpython-311.pyc differ diff --git a/src/modules/equipment/insert_actual_data.py b/src/modules/equipment/insert_actual_data.py index 1767020..5f587fd 100644 --- a/src/modules/equipment/insert_actual_data.py +++ b/src/modules/equipment/insert_actual_data.py @@ -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. "