"use client"; import React, { useState, useEffect } from "react"; import { DashboardElement } from "@/components/admin/dashboard/types"; import { getApiUrl } from "@/lib/utils/apiUrl"; interface DeliveryTodayStatsWidgetProps { element: DashboardElement; } interface TodayStats { shipped: number; delivered: number; } /** * 오늘 처리 현황 위젯 * - 오늘 발송 건수 * - 오늘 도착 건수 */ export default function DeliveryTodayStatsWidget({ element }: DeliveryTodayStatsWidgetProps) { const [todayStats, setTodayStats] = useState({ shipped: 0, delivered: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { loadData(); // 자동 새로고침 (30초마다) const interval = setInterval(loadData, 30000); return () => clearInterval(interval); }, [element]); const loadData = async () => { if (!element?.dataSource?.query) { setError("쿼리가 설정되지 않았습니다"); setLoading(false); return; } try { setLoading(true); const token = localStorage.getItem("authToken"); const response = await fetch(getApiUrl("/api/dashboards/execute-query"), { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify({ query: element.dataSource.query, connectionType: element.dataSource.connectionType || "current", connectionId: element.dataSource.connectionId, }), }); if (!response.ok) throw new Error("데이터 로딩 실패"); const result = await response.json(); // 데이터 처리 if (result.success && result.data?.rows) { const rows = result.data.rows; const today = new Date().toISOString().split("T")[0]; // 오늘 발송 건수 (created_at 기준) const shippedToday = rows.filter((row: any) => { const createdDate = row.created_at?.split("T")[0] || row.createdAt?.split("T")[0]; return createdDate === today; }).length; // 오늘 도착 건수 (status === 'delivered' AND estimated_delivery 기준) const deliveredToday = rows.filter((row: any) => { const status = row.status || ""; const deliveryDate = row.estimated_delivery?.split("T")[0] || row.estimatedDelivery?.split("T")[0]; return (status === "delivered" || status === "완료") && deliveryDate === today; }).length; setTodayStats({ shipped: shippedToday, delivered: deliveredToday, }); } setError(null); } catch (err) { setError(err instanceof Error ? err.message : "데이터 로딩 실패"); } finally { setLoading(false); } }; if (loading) { return (

데이터 로딩 중...

); } if (error) { return (

⚠️ {error}

); } if (!element?.dataSource?.query) { return (

데이터를 연결하세요

); } return (
{/* 헤더 */}

오늘 처리 현황

{/* 통계 카드 */}
{/* 오늘 발송 */}
📤

오늘 발송

{todayStats.shipped.toLocaleString()}

{/* 오늘 도착 */}
📥

오늘 도착

{todayStats.delivered.toLocaleString()}

); }