From f78553e819a9f8ce0ce8d41788f869aa7edd6742 Mon Sep 17 00:00:00 2001 From: Cizz22 Date: Tue, 11 Nov 2025 10:39:20 +0700 Subject: [PATCH] fix --- src/calculation_time_constrains/service.py | 2 +- src/sparepart/schema.py | 2 + src/sparepart/service.py | 47 +++++++++++++++------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/calculation_time_constrains/service.py b/src/calculation_time_constrains/service.py index 7f27d42..6dd737e 100644 --- a/src/calculation_time_constrains/service.py +++ b/src/calculation_time_constrains/service.py @@ -688,7 +688,7 @@ async def run_simulation_with_spareparts(*, db_session, calculation, token: str, time_window_months = 60 - sparepart_manager = await load_sparepart_data_from_db(scope=scope, prev_oh_scope=prev_oh_scope, db_session=collector_db_session, analysis_window_months=time_window_months) + sparepart_manager = await load_sparepart_data_from_db(scope=scope, prev_oh_scope=prev_oh_scope, db_session=collector_db_session,app_db_session=db_session ,analysis_window_months=time_window_months) # Initialize optimization model with sparepart management diff --git a/src/sparepart/schema.py b/src/sparepart/schema.py index 0313888..7022d09 100644 --- a/src/sparepart/schema.py +++ b/src/sparepart/schema.py @@ -52,6 +52,7 @@ class SparepartRequirement: sparepart_name: str unit_cost: float avg_cost: float + remark:str @dataclass class SparepartStock: @@ -61,6 +62,7 @@ class SparepartStock: current_stock: int unit_cost: float location: str + remark:str @dataclass class ProcurementRecord: diff --git a/src/sparepart/service.py b/src/sparepart/service.py index a58c84d..0cb5ea0 100644 --- a/src/sparepart/service.py +++ b/src/sparepart/service.py @@ -534,6 +534,7 @@ class SparepartManager: sparepart_id = requirement.sparepart_id needed_quantity = requirement.quantity_required sparepart_name = requirement.sparepart_name + sparepart_remark= requirement.remark unit_cost = requirement.avg_cost if requirement.avg_cost > 0 else requirement.unit_cost current_stock = adjusted_stocks.get(sparepart_id, 0) @@ -562,7 +563,8 @@ class SparepartManager: 'status': order.status.value, 'months_until_delivery': self._calculate_months_until_delivery(order.expected_delivery_date, target_month), 'is_on_time': self._is_delivery_on_time(order.expected_delivery_date, target_month), - 'usage': 'covers_requirement' + 'usage': 'covers_requirement', + 'remark': sparepart_remark } pr_po_summary['existing_orders'].append(order_info) pr_po_summary['total_existing_value'] += order.total_cost @@ -574,6 +576,7 @@ class SparepartManager: missing_parts.append({ 'sparepart_id': sparepart_id, 'sparepart_name': sparepart_name, + 'remark': sparepart_remark, 'required': needed_quantity, 'current_stock': current_stock, 'ordered_quantity': total_ordered_quantity, @@ -605,6 +608,7 @@ class SparepartManager: new_order = { 'sparepart_id': sparepart_id, 'sparepart_name': sparepart_name, + 'remark': sparepart_remark, 'quantity_needed': shortage, 'unit_cost': unit_cost, 'total_cost': procurement_cost, @@ -911,7 +915,7 @@ class SparepartManager: # Integration functions for database operations -async def load_sparepart_data_from_db(scope, prev_oh_scope, db_session, analysis_window_months = None) -> SparepartManager: +async def load_sparepart_data_from_db(scope, prev_oh_scope, db_session, app_db_session, analysis_window_months = None) -> SparepartManager: """Load sparepart data from database""" # You'll need to implement these queries based on your database schema # Get scope dates for analysis window @@ -934,7 +938,7 @@ async def load_sparepart_data_from_db(scope, prev_oh_scope, db_session, analysis MAX(wm.inv_curbaltotal) AS curbaltotal, AVG(wm.inv_avgcost) AS avgcost, COALESCE(mspl.description, 'No description available') AS description - FROM public.wo_maxim_material wm + FROM public.wo_maximo_material wm LEFT JOIN public.maximo_sparepart_pr_po_line mspl ON wm.inv_itemnum = mspl.item_num WHERE wm.inv_itemnum IS NOT NULL @@ -943,9 +947,16 @@ async def load_sparepart_data_from_db(scope, prev_oh_scope, db_session, analysis log.info("Fetch sparepart") sparepart_stocks_query = await db_session.execute(query) + sparepart_remark = (await app_db_session.execute( + select(SparepartRemark) + )).scalars().all() + + sparepart_remark_dict = {item.itemnum: item.remark for item in sparepart_remark} + for stock_record in sparepart_stocks_query: stock = SparepartStock( sparepart_id=stock_record.itemnum, + remark=sparepart_remark.get(stock_record.itemnum), sparepart_name=stock_record.description, current_stock=stock_record.curbaltotal, unit_cost=stock_record.avgcost, @@ -1110,13 +1121,18 @@ async def load_sparepart_data_from_db(scope, prev_oh_scope, db_session, analysis # Load equipment sparepart requirements # You'll need to create this table/relationship query = text("""WITH oh_workorders AS ( - -- First, get all OH work orders - SELECT DISTINCT - wonum, - asset_location - FROM public.wo_staging_maximo_2 - WHERE worktype = 'OH' AND asset_location IS NOT NULL and asset_unit IN ('3', '00') AND EXTRACT(YEAR FROM reportdate) >= 2019 -), + -- First, get all OH work orders + SELECT DISTINCT + wonum, + asset_location + FROM public.wo_maximo ma + WHERE worktype = 'OH' AND asset_location IS NOT NULL and asset_unit IN ('3', '00') AND EXTRACT(YEAR FROM reportdate) >= 2019 + ), + current_oh as ( + SELECT DISTINCT wonum, asset_location, asset_unit + FROM public.wo_maximo ma + WHERE ma.xx_parent IN ('155026', '155027', '155029', '155030') + ), sparepart_usage AS ( SELECT oh.asset_location, @@ -1124,8 +1140,8 @@ async def load_sparepart_data_from_db(scope, prev_oh_scope, db_session, analysis mwm.itemqty, mwm.wonum, mwm.inv_avgcost - FROM oh_workorders oh - INNER JOIN public.wo_maxim_material mwm + FROM current_oh oh + INNER JOIN public.wo_maximo_material mwm ON oh.wonum = mwm.wonum ), location_sparepart_stats AS ( @@ -1262,7 +1278,8 @@ ORDER BY lss.asset_location, lss.itemnum;""") lead_time=float(req_record.avg_leadtime_months), sparepart_name=req_record.item_description, unit_cost=float(req_record.avg_unit_cost), - avg_cost=float(req_record.avgcost or 0) + avg_cost=float(req_record.avgcost or 0), + remark=sparepart_remark.get(req_record.itemnum, "") ) equipment_requirements[req_record.asset_location].append(requirement) @@ -1306,12 +1323,12 @@ po_with_pr_date AS ( ON pr.num = po.po_number AND pr.type = 'PR' ), -WITH item_inventory AS ( +item_inventory AS ( SELECT itemnum, MAX(inv_curbaltotal) AS current_balance_total, AVG(inv_avgcost) AS avg_cost - FROM public.wo_maxim_material + FROM public.wo_maximo_material WHERE inv_itemnum IS NOT NULL GROUP BY itemnum )