feat: Add dedicated dashboard methods to service clients

Created typed, domain-specific methods in service clients instead of
using generic .get() calls with paths. This improves type safety,
discoverability, and maintainability.

Service Client Changes:
- ProcurementServiceClient:
  * get_pending_purchase_orders() - POs awaiting approval
  * get_critical_alerts() - Critical severity alerts
  * get_alerts_summary() - Alert counts by severity

- ProductionServiceClient:
  * get_todays_batches() - Today's production timeline
  * get_production_batches_by_status() - Filter by status

- InventoryServiceClient:
  * get_stock_status() - Dashboard stock metrics
  * get_sustainability_widget() - Sustainability data

Dashboard API Changes:
- Updated all endpoints to use new dedicated methods
- Cleaner, more maintainable code
- Better error handling and logging
- Fixed inventory data type handling (list vs dict)

Note: Alert endpoints return 404 - alert_processor service needs
endpoints: /alerts/summary and /alerts (filtered by severity).
This commit is contained in:
Claude
2025-11-07 22:12:21 +00:00
parent 9722cdb7f7
commit 6cd4ef0f56
4 changed files with 187 additions and 33 deletions

View File

@@ -189,12 +189,9 @@ async def get_bakery_health_status(
# In a real implementation, these would be fetched from respective services
# For now, we'll make HTTP calls to the services
# Get alerts - using base client for alert service
# Get alerts summary
try:
alerts_data = await procurement_client.get(
"/procurement/alert-processor/alerts/summary",
tenant_id=tenant_id
) or {}
alerts_data = await procurement_client.get_alerts_summary(tenant_id) or {}
critical_alerts = alerts_data.get("critical_count", 0)
except Exception as e:
logger.warning(f"Failed to fetch alerts: {e}")
@@ -202,11 +199,7 @@ async def get_bakery_health_status(
# Get pending PO count
try:
po_data = await procurement_client.get(
"/procurement/purchase-orders",
tenant_id=tenant_id,
params={"status": "pending_approval", "limit": 100}
) or {}
po_data = await procurement_client.get_pending_purchase_orders(tenant_id, limit=100) or {}
pending_approvals = len(po_data.get("items", []))
except Exception as e:
logger.warning(f"Failed to fetch POs: {e}")
@@ -214,10 +207,8 @@ async def get_bakery_health_status(
# Get production delays
try:
prod_data = await production_client.get(
"/production/production-batches",
tenant_id=tenant_id,
params={"status": "ON_HOLD", "limit": 100}
prod_data = await production_client.get_production_batches_by_status(
tenant_id, status="ON_HOLD", limit=100
) or {}
production_delays = len(prod_data.get("items", []))
except Exception as e:
@@ -276,11 +267,7 @@ async def get_orchestration_summary(
# Enhance with detailed PO and batch summaries
if summary["purchaseOrdersCreated"] > 0:
try:
po_data = await procurement_client.get(
"/procurement/purchase-orders",
tenant_id=tenant_id,
params={"status": "pending_approval", "limit": 10}
)
po_data = await procurement_client.get_pending_purchase_orders(tenant_id, limit=10)
if po_data:
pos = po_data.get("items", [])
summary["purchaseOrdersSummary"] = [
@@ -296,10 +283,7 @@ async def get_orchestration_summary(
if summary["productionBatchesCreated"] > 0:
try:
batch_data = await production_client.get(
"/production/production-batches/today",
tenant_id=tenant_id
)
batch_data = await production_client.get_todays_batches(tenant_id)
if batch_data:
batches = batch_data.get("batches", [])
summary["productionBatchesSummary"] = [
@@ -338,11 +322,7 @@ async def get_action_queue(
# Get pending POs
pending_pos = []
try:
po_data = await procurement_client.get(
"/procurement/purchase-orders",
tenant_id=tenant_id,
params={"status": "pending_approval", "limit": 20}
)
po_data = await procurement_client.get_pending_purchase_orders(tenant_id, limit=20)
if po_data:
pending_pos = po_data.get("items", [])
except Exception as e:
@@ -351,11 +331,7 @@ async def get_action_queue(
# Get critical alerts
critical_alerts = []
try:
alerts_data = await procurement_client.get(
"/procurement/alert-processor/alerts",
tenant_id=tenant_id,
params={"severity": "critical", "resolved": False, "limit": 20}
)
alerts_data = await procurement_client.get_critical_alerts(tenant_id, limit=20)
if alerts_data:
critical_alerts = alerts_data.get("alerts", [])
except Exception as e: