@ -239,57 +239,39 @@ class Prediksi:
# print(f"HTTP error occurred: {e}")
# print(f"HTTP error occurred: {e}")
# return {}
# return {}
# Menyiapkan data untuk batch insert
# Menyiapkan data untuk batch insert atau update
# print(f"Data to be inserted: {data}")
records_to_insert = [ ]
records_to_insert = [ ]
check_existence_query = """
SELECT id FROM lcc_equipment_tr_data
WHERE assetnum = % s AND tahun = % s AND is_actual = 0
"""
update_query = """
UPDATE lcc_equipment_tr_data
SET
rc_cm_material_cost = % s ,
rc_cm_labor_cost = % s ,
rc_pm_material_cost = % s ,
rc_pm_labor_cost = % s ,
rc_oh_material_cost = % s ,
rc_oh_labor_cost = % s ,
rc_predictive_material_cost = % s ,
rc_predictive_labor_cost = % s ,
updated_by = ' Sys ' ,
updated_at = NOW ( )
WHERE id = % s
"""
for _ , row in data . iterrows ( ) :
for _ , row in data . iterrows ( ) :
max_seq = max_seq + 1
# Check if data exists
# (token already stored before defining fetch_api_data)
cursor . execute ( check_existence_query , ( equipment_id , int ( row [ " year " ] ) ) )
# maintain previous cm_interval between iterations using attribute on fetch_api_data
existing_record = cursor . fetchone ( )
# if not hasattr(fetch_api_data, "prev_cm"):
# fetch_api_data.prev_cm = None
if existing_record :
# Update existing record
# Update values from API (current year)
record_id = existing_record [ 0 ]
# api_data = await fetch_api_data(equipment_id, row["year"])
cursor . execute ( update_query , (
# if api_data and "data" in api_data and isinstance(api_data["data"], list) and len(api_data["data"]) > 0:
# try:
# cur_cm = float(api_data["data"][0].get("num_fail", row.get("cm_interval", 1)))
# except Exception:
# cur_cm = float(row.get("cm_interval", 1)) if not pd.isna(row.get("cm_interval", None)) else 1.0
# else:
# try:
# val = float(row.get("cm_interval", 1))
# cur_cm = val if val >= 1 else 1.0
# except Exception:
# cur_cm = 1.0
# Determine previous cm_interval: prefer stored prev_cm, otherwise try API for previous year, else fallback to cur_cm
# if fetch_api_data.prev_cm is not None:
# prev_cm = float(fetch_api_data.prev_cm)
# else:
# try:
# api_prev = await fetch_api_data(equipment_id, int(row["year"]) - 1)
# if api_prev and "data" in api_prev and isinstance(api_prev["data"], list) and len(api_prev["data"]) > 0:
# prev_cm = float(api_prev["data"][0].get("num_fail", cur_cm))
# else:
# # attempt to use any available previous value from the row if present, otherwise fallback to current
# prev_cm = float(row.get("cm_interval", cur_cm)) if not pd.isna(row.get("cm_interval", None)) else cur_cm
# except Exception:
# prev_cm = cur_cm
# compute difference: current year interval minus previous year interval
# try:
# cm_interval_diff = float(cur_cm) - float(prev_cm)
# except Exception:
# cm_interval_diff = 0.0
# append record using the difference for raw_cm_interval
records_to_insert . append (
(
str ( uuid4 ( ) ) , # id
int ( max_seq ) , # seq
int ( row [ " year " ] ) ,
equipment_id ,
float ( row . get ( " rc_cm_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_cm_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_cm_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_cm_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_cm_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_cm_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_cm_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_cm_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_pm_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_pm_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_pm_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_pm_material_cost " , 0 ) ) else 0.0 ,
@ -298,16 +280,36 @@ class Prediksi:
float ( row . get ( " rc_oh_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_oh_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_oh_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_oh_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_predictive_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_predictive_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_predictive_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_predictive_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_predictive_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_predictive_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_predictive_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_predictive_labor_cost " , 0 ) ) else 0.0 ,
record_id
) )
else :
max_seq = max_seq + 1
# Prepare for insert
records_to_insert . append (
(
str ( uuid4 ( ) ) , # id
int ( max_seq ) , # seq
int ( row [ " year " ] ) ,
equipment_id ,
float ( row . get ( " rc_cm_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_cm_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_cm_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_cm_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_pm_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_pm_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_pm_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_pm_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_oh_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_oh_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_oh_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_oh_labor_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_predictive_material_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_predictive_material_cost " , 0 ) ) else 0.0 ,
float ( row . get ( " rc_predictive_labor_cost " , 0 ) ) if not pd . isna ( row . get ( " rc_predictive_labor_cost " , 0 ) ) else 0.0 ,
)
)
)
)
# store current cm for next iteration
# fetch_api_data.prev_cm = cur_cm
# Eksekusi batch insert
# Eksekusi batch insert jika ada data baru
cursor . executemany ( insert_query , records_to_insert )
if records_to_insert :
cursor . executemany ( insert_query , records_to_insert )
connection . commit ( )
connection . commit ( )
# print("Data proyeksi berhasil dimasukkan ke database.")
# Recalculate total costs and update asset criticality
self . __update_data_lcc ( equipment_id )
except Exception as e :
except Exception as e :
print ( f " Error saat menyimpan data ke database: { e } " )
print ( f " Error saat menyimpan data ke database: { e } " )
@ -930,7 +932,7 @@ class Prediksi:
predictions_df = pd . DataFrame ( predictions )
predictions_df = pd . DataFrame ( predictions )
# print(predictions_df)
# print(predictions_df)
# Hapus data prediksi yang ada sebelumnya
# Hapus data prediksi yang ada sebelumnya
self . __delete_predictions_from_db ( assetnum )
# self.__delete_predictions_from_db(assetnum )
# Insert hasil prediksi ke database
# Insert hasil prediksi ke database
try :
try :