"use client"; import React, { useState, useEffect, useCallback } from "react"; import { getSummaryReport, getDailyReport, getMonthlyReport, getDriverReport, getRouteReport, formatDistance, formatDuration, SummaryReport, DailyStat, MonthlyStat, DriverStat, RouteStat, } from "@/lib/api/vehicleTrip"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { RefreshCw, Car, Route, Clock, Users, TrendingUp, MapPin, } from "lucide-react"; import { format } from "date-fns"; import { ko } from "date-fns/locale"; export default function VehicleReport() { // 요약 통계 const [summary, setSummary] = useState(null); const [summaryPeriod, setSummaryPeriod] = useState("month"); const [summaryLoading, setSummaryLoading] = useState(false); // 일별 통계 const [dailyData, setDailyData] = useState([]); const [dailyStartDate, setDailyStartDate] = useState( new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split("T")[0] ); const [dailyEndDate, setDailyEndDate] = useState( new Date().toISOString().split("T")[0] ); const [dailyLoading, setDailyLoading] = useState(false); // 월별 통계 const [monthlyData, setMonthlyData] = useState([]); const [monthlyYear, setMonthlyYear] = useState(new Date().getFullYear()); const [monthlyLoading, setMonthlyLoading] = useState(false); // 운전자별 통계 const [driverData, setDriverData] = useState([]); const [driverLoading, setDriverLoading] = useState(false); // 구간별 통계 const [routeData, setRouteData] = useState([]); const [routeLoading, setRouteLoading] = useState(false); // 요약 로드 const loadSummary = useCallback(async () => { setSummaryLoading(true); try { const response = await getSummaryReport(summaryPeriod); if (response.success) { setSummary(response.data); } } catch (error) { console.error("요약 통계 조회 실패:", error); } finally { setSummaryLoading(false); } }, [summaryPeriod]); // 일별 로드 const loadDaily = useCallback(async () => { setDailyLoading(true); try { const response = await getDailyReport({ startDate: dailyStartDate, endDate: dailyEndDate, }); if (response.success) { setDailyData(response.data?.data || []); } } catch (error) { console.error("일별 통계 조회 실패:", error); } finally { setDailyLoading(false); } }, [dailyStartDate, dailyEndDate]); // 월별 로드 const loadMonthly = useCallback(async () => { setMonthlyLoading(true); try { const response = await getMonthlyReport({ year: monthlyYear }); if (response.success) { setMonthlyData(response.data?.data || []); } } catch (error) { console.error("월별 통계 조회 실패:", error); } finally { setMonthlyLoading(false); } }, [monthlyYear]); // 운전자별 로드 const loadDrivers = useCallback(async () => { setDriverLoading(true); try { const response = await getDriverReport({ limit: 20 }); if (response.success) { setDriverData(response.data || []); } } catch (error) { console.error("운전자별 통계 조회 실패:", error); } finally { setDriverLoading(false); } }, []); // 구간별 로드 const loadRoutes = useCallback(async () => { setRouteLoading(true); try { const response = await getRouteReport({ limit: 20 }); if (response.success) { setRouteData(response.data || []); } } catch (error) { console.error("구간별 통계 조회 실패:", error); } finally { setRouteLoading(false); } }, []); // 초기 로드 useEffect(() => { loadSummary(); }, [loadSummary]); // 기간 레이블 const getPeriodLabel = (period: string) => { switch (period) { case "today": return "오늘"; case "week": return "최근 7일"; case "month": return "최근 30일"; case "year": return "올해"; default: return period; } }; return (
{/* 요약 통계 카드 */}

요약 통계

{summary && (
총 운행
{summary.totalTrips.toLocaleString()}
{getPeriodLabel(summaryPeriod)}
완료율
{summary.completionRate}%
{summary.completedTrips} / {summary.totalTrips}
총 거리
{formatDistance(summary.totalDistance)}
평균 {formatDistance(summary.avgDistance)}
총 시간
{formatDuration(summary.totalDuration)}
평균 {formatDuration(Math.round(summary.avgDuration))}
운전자
{summary.activeDrivers}
활동 중
진행 중
{summary.activeTrips}
현재 운행
)}
{/* 상세 통계 탭 */} 일별 통계 월별 통계 운전자별 구간별 {/* 일별 통계 */}
일별 운행 통계
setDailyStartDate(e.target.value)} className="h-8 w-[130px]" />
setDailyEndDate(e.target.value)} className="h-8 w-[130px]" />
날짜 운행 수 완료 취소 총 거리 평균 거리 총 시간 {dailyLoading ? ( 로딩 중... ) : dailyData.length === 0 ? ( 데이터가 없습니다. ) : ( dailyData.map((row) => ( {format(new Date(row.date), "MM/dd (E)", { locale: ko, })} {row.tripCount} {row.completedCount} {row.cancelledCount} {formatDistance(row.totalDistance)} {formatDistance(row.avgDistance)} {formatDuration(row.totalDuration)} )) )}
{/* 월별 통계 */}
월별 운행 통계
운행 수 완료 취소 총 거리 평균 거리 운전자 수 {monthlyLoading ? ( 로딩 중... ) : monthlyData.length === 0 ? ( 데이터가 없습니다. ) : ( monthlyData.map((row) => ( {row.month}월 {row.tripCount} {row.completedCount} {row.cancelledCount} {formatDistance(row.totalDistance)} {formatDistance(row.avgDistance)} {row.driverCount} )) )}
{/* 운전자별 통계 */}
운전자별 통계
운전자 운행 수 완료 총 거리 평균 거리 총 시간 {driverLoading ? ( 로딩 중... ) : driverData.length === 0 ? ( 데이터가 없습니다. ) : ( driverData.map((row) => ( {row.userName} {row.tripCount} {row.completedCount} {formatDistance(row.totalDistance)} {formatDistance(row.avgDistance)} {formatDuration(row.totalDuration)} )) )}
{/* 구간별 통계 */}
구간별 통계
출발지
도착지
운행 수 총 거리 평균 거리 평균 시간
{routeLoading ? ( 로딩 중... ) : routeData.length === 0 ? ( 데이터가 없습니다. ) : ( routeData.map((row, idx) => ( {row.departureName} {row.destinationName} {row.tripCount} {formatDistance(row.totalDistance)} {formatDistance(row.avgDistance)} {formatDuration(Math.round(row.avgDuration))} )) )}
); }