From 5960070d13d822bcf7bcf73e719697ae960b3617 Mon Sep 17 00:00:00 2001 From: Cizz22 Date: Thu, 18 Sep 2025 04:20:34 +0700 Subject: [PATCH] add --- src/equipment_sparepart/service.py | 89 +++--------------------------- src/sparepart/service.py | 83 ++++++++++++++++------------ 2 files changed, 54 insertions(+), 118 deletions(-) diff --git a/src/equipment_sparepart/service.py b/src/equipment_sparepart/service.py index aa2c82c..e0cd528 100644 --- a/src/equipment_sparepart/service.py +++ b/src/equipment_sparepart/service.py @@ -1,7 +1,7 @@ import random from typing import Optional -from sqlalchemy import Delete, Select, and_, text +from sqlalchemy import Delete, Select, and_ from sqlalchemy.orm import selectinload from src.auth.service import CurrentUser @@ -37,87 +37,12 @@ def create_dummy_parts(assetnum: str, count: int = 5): return parts -async def get_all(db_session: DbSession, assetnum: Optional[str] = None): - """ - Get all spare parts with their latest PR and PO information. - - Args: - db_session: SQLAlchemy database session - assetnum: Optional asset number filter (not used in this query but kept for compatibility) - - Returns: - List of dictionaries containing spare part information - """ - # Define the SQL query - query = text(""" - WITH latest_prs AS ( - SELECT DISTINCT ON (pl.item_num) - pl.item_num, - h.num as pr_number, - h.issue_date as pr_issue_date, - h.status as pr_status, - pl.qty_ordered as pr_qty_ordered - FROM public.maximo_sparepart_pr_po h - JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num - WHERE h.type = 'PR' - AND h.issue_date IS NOT NULL - AND h.num LIKE 'K%' - ORDER BY pl.item_num, TO_DATE(h.issue_date, 'YYYY-MM-DD') DESC - ), - po_details AS ( - SELECT - h.num as po_number, - pl.item_num, - h.estimated_arrival_date, - pl.qty_received, - pl.qty_ordered - FROM public.maximo_sparepart_pr_po h - JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num - WHERE h.type = 'PO' - ) - SELECT - pr.item_num, - MAX(l.description) as description, - COALESCE(MAX(i.curbaltotal), 0) as current_balance_total, - pr.pr_number, - pr.pr_issue_date, - pr.pr_qty_ordered, - CASE - WHEN po.po_number IS NOT NULL THEN 'YES' - ELSE 'NO' - END as po_exists, - COALESCE(po.qty_received, 0) as po_qty_received, - COALESCE(po.qty_ordered, 0) as po_qty_ordered, - COALESCE(po.estimated_arrival_date, '') as po_estimated_arrival_date - FROM latest_prs pr - LEFT JOIN public.maximo_sparepart_pr_po_line l ON pr.item_num = l.item_num - LEFT JOIN public.maximo_inventory i ON pr.item_num = i.itemnum - LEFT JOIN po_details po ON po.po_number = pr.pr_number AND po.item_num = pr.item_num - GROUP BY pr.item_num, pr.pr_number, pr.pr_issue_date, pr.pr_qty_ordered, - po.po_number, po.qty_received, po.qty_ordered, po.estimated_arrival_date - ORDER BY pr.item_num - """) - - # Execute the query - result = await db_session.execute(query) - - # Fetch all results and convert to list of dictionaries - spare_parts = [] - for row in result: - spare_parts.append({ - "item_num": row.item_num, - "description": row.description, - "current_balance_total": float(row.current_balance_total) if row.current_balance_total is not None else 0.0, - "pr_number": row.pr_number, - "pr_issue_date": row.pr_issue_date, - "pr_qty_ordered": float(row.pr_qty_ordered) if row.pr_qty_ordered is not None else 0.0, - "po_exists": row.po_exists, - "po_qty_received": float(row.po_qty_received) if row.po_qty_received is not None else 0.0, - "po_qty_ordered": float(row.po_qty_ordered) if row.po_qty_ordered is not None else 0.0, - "po_estimated_arrival_date": row.po_estimated_arrival_date - }) - - return spare_parts +async def get_all(db_session: DbSession, assetnum: Optional[str]): + # Example usage + dummy_parts = create_dummy_parts(assetnum, count=10) + + + return dummy_parts # async def create(*, db_session: DbSession, scope_equipment_activty_in: ScopeEquipmentActivityCreate): diff --git a/src/sparepart/service.py b/src/sparepart/service.py index a0b8d55..18f8087 100644 --- a/src/sparepart/service.py +++ b/src/sparepart/service.py @@ -28,51 +28,62 @@ async def get_all(db_session: DbSession): # Define the SQL query query = text(""" WITH latest_prs AS ( - SELECT DISTINCT ON (pl.item_num) - pl.item_num, - h.num as pr_number, - h.issue_date as pr_issue_date, - h.status as pr_status, - pl.qty_ordered as pr_qty_ordered - FROM public.maximo_sparepart_pr_po h - JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num - WHERE h.type = 'PR' - AND h.issue_date IS NOT NULL - AND h.num LIKE 'K%' - ORDER BY pl.item_num, TO_DATE(h.issue_date, 'YYYY-MM-DD') DESC - ), - po_details AS ( - SELECT - h.num as po_number, - pl.item_num, - h.estimated_arrival_date, - pl.qty_received, - pl.qty_ordered - FROM public.maximo_sparepart_pr_po h - JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num - WHERE h.type = 'PO' + SELECT DISTINCT ON (pl.item_num) + pl.item_num, + h.num as pr_number, + h.issue_date as pr_issue_date, + h.status as pr_status, + pl.qty_ordered as pr_qty_ordered + FROM public.maximo_sparepart_pr_po h + JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num + WHERE h.type = 'PR' + AND h.issue_date IS NOT NULL + AND h.num LIKE 'K%' + ORDER BY pl.item_num, TO_DATE(h.issue_date, 'YYYY-MM-DD') DESC ) - SELECT + SELECT DISTINCT ON (pr.item_num) pr.item_num, - MAX(l.description) as description, - COALESCE(MAX(i.curbaltotal), 0) as current_balance_total, + (SELECT description FROM public.maximo_sparepart_pr_po_line WHERE item_num = pr.item_num LIMIT 1) as description, + COALESCE((SELECT curbaltotal FROM public.maximo_inventory WHERE itemnum = pr.item_num), 0) as current_balance_total, pr.pr_number, pr.pr_issue_date, pr.pr_qty_ordered, CASE - WHEN po.po_number IS NOT NULL THEN 'YES' + WHEN EXISTS ( + SELECT 1 FROM public.maximo_sparepart_pr_po + WHERE type = 'PO' AND num = pr.pr_number + ) THEN 'YES' ELSE 'NO' END as po_exists, - COALESCE(po.qty_received, 0) as po_qty_received, - COALESCE(po.qty_ordered, 0) as po_qty_ordered, - COALESCE(po.estimated_arrival_date, '') as po_estimated_arrival_date + COALESCE(( + SELECT pl.qty_received + FROM public.maximo_sparepart_pr_po h + JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num + WHERE h.type = 'PO' + AND h.num = pr.pr_number + AND pl.item_num = pr.item_num + LIMIT 1 + ), 0) as po_qty_received, + COALESCE(( + SELECT pl.qty_ordered + FROM public.maximo_sparepart_pr_po h + JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num + WHERE h.type = 'PO' + AND h.num = pr.pr_number + AND pl.item_num = pr.item_num + LIMIT 1 + ), 0) as po_qty_ordered, + COALESCE(( + SELECT h.estimated_arrival_date + FROM public.maximo_sparepart_pr_po h + JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num + WHERE h.type = 'PO' + AND h.num = pr.pr_number + AND pl.item_num = pr.item_num + LIMIT 1 + ), '') as po_estimated_arrival_date FROM latest_prs pr - LEFT JOIN public.maximo_sparepart_pr_po_line l ON pr.item_num = l.item_num - LEFT JOIN public.maximo_inventory i ON pr.item_num = i.itemnum - LEFT JOIN po_details po ON po.po_number = pr.pr_number AND po.item_num = pr.item_num - GROUP BY pr.item_num, pr.pr_number, pr.pr_issue_date, pr.pr_qty_ordered, - po.po_number, po.qty_received, po.qty_ordered, po.estimated_arrival_date - ORDER BY pr.item_num + ORDER BY pr.item_num; """) # Execute the query