feature/reliability_stat
Cizz22 4 months ago
parent 8c9f573230
commit 5960070d13

@ -1,7 +1,7 @@
import random import random
from typing import Optional from typing import Optional
from sqlalchemy import Delete, Select, and_, text from sqlalchemy import Delete, Select, and_
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
from src.auth.service import CurrentUser from src.auth.service import CurrentUser
@ -37,87 +37,12 @@ def create_dummy_parts(assetnum: str, count: int = 5):
return parts return parts
async def get_all(db_session: DbSession, assetnum: Optional[str] = None): async def get_all(db_session: DbSession, assetnum: Optional[str]):
""" # Example usage
Get all spare parts with their latest PR and PO information. dummy_parts = create_dummy_parts(assetnum, count=10)
Args:
db_session: SQLAlchemy database session return dummy_parts
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 create(*, db_session: DbSession, scope_equipment_activty_in: ScopeEquipmentActivityCreate): # async def create(*, db_session: DbSession, scope_equipment_activty_in: ScopeEquipmentActivityCreate):

@ -28,51 +28,62 @@ async def get_all(db_session: DbSession):
# Define the SQL query # Define the SQL query
query = text(""" query = text("""
WITH latest_prs AS ( WITH latest_prs AS (
SELECT DISTINCT ON (pl.item_num) SELECT DISTINCT ON (pl.item_num)
pl.item_num, pl.item_num,
h.num as pr_number, h.num as pr_number,
h.issue_date as pr_issue_date, h.issue_date as pr_issue_date,
h.status as pr_status, h.status as pr_status,
pl.qty_ordered as pr_qty_ordered pl.qty_ordered as pr_qty_ordered
FROM public.maximo_sparepart_pr_po h FROM public.maximo_sparepart_pr_po h
JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num JOIN public.maximo_sparepart_pr_po_line pl ON h.num = pl.num
WHERE h.type = 'PR' WHERE h.type = 'PR'
AND h.issue_date IS NOT NULL AND h.issue_date IS NOT NULL
AND h.num LIKE 'K%' AND h.num LIKE 'K%'
ORDER BY pl.item_num, TO_DATE(h.issue_date, 'YYYY-MM-DD') DESC 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 SELECT DISTINCT ON (pr.item_num)
pr.item_num, pr.item_num,
MAX(l.description) as description, (SELECT description FROM public.maximo_sparepart_pr_po_line WHERE item_num = pr.item_num LIMIT 1) as description,
COALESCE(MAX(i.curbaltotal), 0) as current_balance_total, COALESCE((SELECT curbaltotal FROM public.maximo_inventory WHERE itemnum = pr.item_num), 0) as current_balance_total,
pr.pr_number, pr.pr_number,
pr.pr_issue_date, pr.pr_issue_date,
pr.pr_qty_ordered, pr.pr_qty_ordered,
CASE 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' ELSE 'NO'
END as po_exists, END as po_exists,
COALESCE(po.qty_received, 0) as po_qty_received, COALESCE((
COALESCE(po.qty_ordered, 0) as po_qty_ordered, SELECT pl.qty_received
COALESCE(po.estimated_arrival_date, '') as po_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
), 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 FROM latest_prs pr
LEFT JOIN public.maximo_sparepart_pr_po_line l ON pr.item_num = l.item_num ORDER BY pr.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 # Execute the query

Loading…
Cancel
Save