"use client"; import React, { useState } from "react"; import { Calendar, Wrench, Truck, Check, Clock, AlertTriangle } from "lucide-react"; interface MaintenanceSchedule { id: string; vehicleNumber: string; vehicleType: string; maintenanceType: "정기점검" | "수리" | "타이어교체" | "오일교환" | "기타"; scheduledDate: string; status: "scheduled" | "in_progress" | "completed" | "overdue"; notes?: string; estimatedCost?: number; } // 목 데이터 const mockSchedules: MaintenanceSchedule[] = [ { id: "1", vehicleNumber: "서울12가3456", vehicleType: "1톤 트럭", maintenanceType: "정기점검", scheduledDate: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString(), status: "scheduled", notes: "6개월 정기점검", estimatedCost: 300000, }, { id: "2", vehicleNumber: "경기34나5678", vehicleType: "2.5톤 트럭", maintenanceType: "오일교환", scheduledDate: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000).toISOString(), status: "scheduled", estimatedCost: 150000, }, { id: "3", vehicleNumber: "인천56다7890", vehicleType: "라보", maintenanceType: "타이어교체", scheduledDate: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(), status: "overdue", notes: "긴급", estimatedCost: 400000, }, { id: "4", vehicleNumber: "부산78라1234", vehicleType: "1톤 트럭", maintenanceType: "수리", scheduledDate: new Date().toISOString(), status: "in_progress", notes: "엔진 점검 중", estimatedCost: 800000, }, ]; export default function MaintenanceWidget() { const [schedules] = useState(mockSchedules); const [filter, setFilter] = useState<"all" | MaintenanceSchedule["status"]>("all"); const [selectedDate, setSelectedDate] = useState(new Date()); const filteredSchedules = schedules.filter( (s) => filter === "all" || s.status === filter ); const getStatusBadge = (status: MaintenanceSchedule["status"]) => { switch (status) { case "scheduled": return 예정; case "in_progress": return 진행중; case "completed": return 완료; case "overdue": return 지연; } }; const getMaintenanceIcon = (type: MaintenanceSchedule["maintenanceType"]) => { switch (type) { case "정기점검": return "🔍"; case "수리": return "🔧"; case "타이어교체": return "⚙️"; case "오일교환": return "🛢️"; default: return "🔧"; } }; const getDaysUntil = (date: string) => { const now = new Date(); const scheduled = new Date(date); const diff = scheduled.getTime() - now.getTime(); const days = Math.floor(diff / (1000 * 60 * 60 * 24)); if (days < 0) return `${Math.abs(days)}일 지연`; if (days === 0) return "오늘"; if (days === 1) return "내일"; return `${days}일 후`; }; const stats = { total: schedules.length, scheduled: schedules.filter((s) => s.status === "scheduled").length, inProgress: schedules.filter((s) => s.status === "in_progress").length, overdue: schedules.filter((s) => s.status === "overdue").length, }; return (
{/* 헤더 */}

🔧 정비 일정 관리

{/* 통계 */}
{stats.scheduled}
예정
{stats.inProgress}
진행중
{stats.overdue}
지연
{stats.total}
전체
{/* 필터 */}
{(["all", "scheduled", "in_progress", "overdue"] as const).map((f) => ( ))}
{/* 일정 리스트 */}
{filteredSchedules.length === 0 ? (
📅
정비 일정이 없습니다
) : (
{filteredSchedules.map((schedule) => (
{getMaintenanceIcon(schedule.maintenanceType)}
{schedule.vehicleNumber}
{schedule.vehicleType}
{getStatusBadge(schedule.status)}
{schedule.maintenanceType}
{schedule.notes &&
{schedule.notes}
}
{new Date(schedule.scheduledDate).toLocaleDateString()}
{getDaysUntil(schedule.scheduledDate)}
{schedule.estimatedCost && (
예상 비용: {schedule.estimatedCost.toLocaleString()}원
)}
{/* 액션 버튼 */} {schedule.status === "scheduled" && (
)} {schedule.status === "in_progress" && (
)}
))}
)}
); }