Cizz22 2 months ago
parent af08469f7e
commit f78553e819

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

@ -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:

@ -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
)

Loading…
Cancel
Save