From 4fd187237aec073bbab7fe5a4eb8178ecec1e3e2 Mon Sep 17 00:00:00 2001 From: Cizz22 Date: Thu, 13 Feb 2025 09:16:12 +0000 Subject: [PATCH] feat: koleksi script --- src/modules/1koleksi.py | 227 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 src/modules/1koleksi.py diff --git a/src/modules/1koleksi.py b/src/modules/1koleksi.py new file mode 100644 index 0000000..0ed52a7 --- /dev/null +++ b/src/modules/1koleksi.py @@ -0,0 +1,227 @@ +import psycopg2 +from psycopg2.extras import DictCursor +from uuid import uuid4 +from datetime import datetime +from config import get_connection + + +def get_recursive_query(cursor, equipment_id, worktype='CM'): + + """ + Fungsi untuk menjalankan query rekursif berdasarkan equipment_id dan worktype. + worktype memiliki nilai default 'CM'. + """ + query = f""" + SELECT + ROW_NUMBER() OVER (ORDER BY tbl.assetnum, tbl.year, tbl.worktype) AS seq, + * + FROM + ( + SELECT + a.worktype, + a.assetnum, + DATE_PART('year', TO_TIMESTAMP(a.reportdate, 'YYYY-MM-DD HH24:MI:SS.US')) AS year, + COUNT(a.wonum) AS raw_corrective_failure_interval, + SUM(a.total_cost_max) AS raw_corrective_material_cost, +-- SUM( +-- ( +-- (EXTRACT(HOUR FROM TO_TIMESTAMP(wo_finish, 'YYYY-MM-DD-HH24.MI.SS.US')) + +-- EXTRACT(MINUTE FROM TO_TIMESTAMP(wo_finish, 'YYYY-MM-DD-HH24.MI.SS.US')) / 60) +-- - +-- (EXTRACT(HOUR FROM TO_TIMESTAMP(wo_start, 'YYYY-MM-DD-HH24.MI.SS.US')) + +-- EXTRACT(MINUTE FROM TO_TIMESTAMP(wo_start, 'YYYY-MM-DD-HH24.MI.SS.US')) / 60) +-- ) +-- * +-- ((DATE_PART('day', TO_TIMESTAMP(a.wo_finish, 'YYYY-MM-DD-HH24.MI.SS.US') - +-- TO_TIMESTAMP(a.wo_start, 'YYYY-MM-DD-HH24.MI.SS.US'))) + 1) +-- ) AS raw_corrective_labor_time_jam, + ROUND(SUM(EXTRACT(EPOCH FROM (TO_TIMESTAMP(a.actfinish, 'YYYY-MM-DD HH24:MI:SS') - TO_TIMESTAMP(a.actstart, 'YYYY-MM-DD HH24:MI:SS'))) / 3600), 2) AS raw_corrective_labor_time_jam, + SUM(a.jumlah_labor) AS raw_corrective_labor_technician + FROM + public.dl_wo_staging AS a + WHERE + a.unit = '3' + GROUP BY + a.assetnum, + DATE_PART('year', TO_TIMESTAMP(a.reportdate, 'YYYY-MM-DD HH24:MI:SS.US')), + a.worktype + ) AS tbl + WHERE + tbl.worktype = '{worktype}' + AND tbl.assetnum = '{equipment_id}' + ORDER BY + tbl.assetnum, + tbl.year, + tbl.worktype; + """ + # Eksekusi query dan fetch hasil + cursor.execute(query) + return cursor.fetchall() + + +def get_data_tahun(cursor): + query = f""" + select * from lcc_ms_year_data + """ + # Eksekusi query dan fetch hasil + cursor.execute(query) + return cursor.fetchall() + +def query_data(): + connection = None + try: + # Mendapatkan koneksi dari config.py + connection = get_connection() + if connection is None: + print("Koneksi ke database gagal.") + return + + # Membuat cursor menggunakan DictCursor + cursor = connection.cursor(cursor_factory=DictCursor) + + + # TRUNCATE DATA + truncate_query = "TRUNCATE TABLE lcc_tr_data" + cursor.execute(truncate_query) + + # Query untuk mendapatkan semua data dari tabel `lcc_ms_equipment_data` + query_main = "SELECT * FROM lcc_ms_equipment_data" + cursor.execute(query_main) + + # Fetch semua hasil query + results = cursor.fetchall() + + # Tahun sekarang + current_year = datetime.now().year + + # Looping untuk setiap equipment_id + for row in results: + equipment_id = row['equipment_id'] # Mengambil equipment_id dari hasil query + forecasting_start_year = row['forecasting_start_year'] - 1 + + # CM + recursive_results = get_recursive_query(cursor, equipment_id, worktype='CM') + # PM + data_pm = get_recursive_query(cursor, equipment_id, worktype='PM') + # OH + data_oh = get_recursive_query(cursor, equipment_id, worktype='OH') + # Data Tahun + data_tahunan = get_data_tahun(cursor) + + seq = 0 + # Looping untuk setiap tahun + for year in range(forecasting_start_year, current_year + 1): + # Filter data berdasarkan tahun + recursive_row = next((r for r in recursive_results if r['year'] == year), None) # CM Corrective Maintenance + data_pm_row = next((r for r in data_pm if r['year'] == year), None) + data_oh_row = next((r for r in data_oh if r['year'] == year), None) + data_tahunan_row = next((r for r in data_tahunan if r['year'] == year), None) + + # Cek apakah data sudah ada + check_query = """ + SELECT COUNT(*) FROM lcc_tr_data + WHERE equipment_id = %s AND tahun = %s + """ + cursor.execute(check_query, (equipment_id, year)) + data_exists = cursor.fetchone()[0] + + + if not data_exists: + # Insert data jika belum ada + if not recursive_row and not data_pm_row and not data_oh_row: + # Jika data recursive_row tidak ada + insert_query = """ + INSERT INTO lcc_tr_data ( + id, equipment_id, tahun, seq, is_actual, + raw_cm_interval, raw_cm_material_cost, + raw_cm_labor_time, raw_cm_labor_human + , raw_pm_interval, raw_pm_material_cost, raw_pm_labor_time, raw_pm_labor_human + , raw_oh_material_cost, raw_oh_labor_time, raw_oh_labor_human + , "raw_loss_output_MW", raw_loss_output_price + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s + , %s, %s, %s, %s + , %s, %s, %s + , %s, %s + ) + """ + cursor.execute( + insert_query, + ( + str(uuid4()), # id + equipment_id, # equipment_id + year, # tahun + seq, # seq + 1, # is_actual + 1, # raw_cm_interval (minimal 1 karena minimal 1x OH) + 0, # raw_cm_material_cost + 0, # raw_cm_labor_time + 0 # raw_cm_labor_human + , 1 # pm interval set default 1 + ,0,0,0 + , 0,0,0 + , (data_tahunan_row['total_lost'] if data_tahunan_row else 0) + , data_tahunan_row['rp_per_kwh'] if data_tahunan_row else 0 + ) + ) + else: + # Jika data recursive_row ada + insert_query = """ + INSERT INTO lcc_tr_data ( + id, equipment_id, tahun, seq, is_actual, + raw_cm_interval, raw_cm_material_cost, + raw_cm_labor_time, raw_cm_labor_human + , raw_pm_interval, raw_pm_material_cost, raw_pm_labor_time, raw_pm_labor_human + , raw_oh_material_cost, raw_oh_labor_time, raw_oh_labor_human + , "raw_loss_output_MW", raw_loss_output_price + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s + , %s, %s, %s, %s + , %s, %s, %s + , %s, %s + ) + """ + cursor.execute( + insert_query, + ( + str(uuid4()), # id + equipment_id, # equipment_id + year, # tahun + seq, # seq + 1, # is_actual + recursive_row['raw_corrective_failure_interval']+1 if recursive_row else 1, # raw_cm_interval + recursive_row['raw_corrective_material_cost'] if recursive_row else 0, # raw_cm_material_cost + (recursive_row['raw_corrective_labor_time_jam'] or 0) if recursive_row else 0, # raw_cm_labor_time + (max(recursive_row['raw_corrective_labor_technician'], 1) if recursive_row['raw_corrective_labor_time_jam'] else 0) if recursive_row else 0, # raw_cm_labor_human + + 1, # raw_pm_interval + data_pm_row['raw_corrective_material_cost'] if data_pm_row else 0, # raw_pm_material_cost + (data_pm_row['raw_corrective_labor_time_jam'] or 0) if data_pm_row else 0, # raw_pm_labor_time + (max(data_pm_row['raw_corrective_labor_technician'], 1) if data_pm_row['raw_corrective_labor_time_jam'] else 0) if data_pm_row else 0, # raw_pm_labor_human + + data_oh_row['raw_corrective_material_cost'] if data_oh_row else 0, # raw_oh_material_cost + (data_oh_row['raw_corrective_labor_time_jam'] or 0) if data_oh_row else 0, # raw_oh_labor_time + (max(data_oh_row['raw_corrective_labor_technician'], 1) if data_oh_row['raw_corrective_labor_time_jam'] else 0) if data_oh_row else 0, # raw_oh_labor_human + + (data_tahunan_row['total_lost'] if data_tahunan_row else 0)/(recursive_row['raw_corrective_failure_interval']+1 if recursive_row else 1), # raw_loss_output_MW + data_tahunan_row['rp_per_kwh'] if data_tahunan_row else 0 + + ) + ) + print(f"Data inserted for {equipment_id} in year {year}") + + seq = seq+1 + + # Commit perubahan + connection.commit() + + except Exception as e: + print("Error saat menjalankan query:", e) + + finally: + # Menutup koneksi + if connection: + cursor.close() + connection.close() + +# Panggil fungsi +if __name__ == "__main__": + query_data()