import React, { useEffect, useState } from 'react' import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, Legend } from 'recharts' import api from '../api/client' const COLORS = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6'] export default function DashboardPage() { const [data, setData] = useState(null) const [insights, setInsights] = useState(null) useEffect(() => { api.get('/dashboard').then(r => setData(r.data.data)).catch(() => {}) api.get('/ai/insights').then(r => setInsights(r.data.data)).catch(() => {}) }, []) const kpi = data?.kpi || {} const trend = data?.headcountTrend || [] const deptData = data?.deptHeadcount || [] const att = data?.attendance || {} const kpiCards = [ { label: '전체 사원', value: kpi.total_employees || 0, icon: '👥', color: 'text-blue-600', bg: 'bg-blue-50' }, { label: '금년 신규입사', value: kpi.new_hires_ytd || 0, icon: '✅', color: 'text-green-600', bg: 'bg-green-50' }, { label: '채용 진행중', value: kpi.open_positions || 0, icon: '🔍', color: 'text-orange-600', bg: 'bg-orange-50' }, { label: '승인 대기', value: (kpi.pending_leaves || 0) + (kpi.pending_reviews || 0), icon: '⏳', color: 'text-red-600', bg: 'bg-red-50' }, ] return (

인사 대시보드

{new Date().toLocaleDateString('ko-KR', { year:'numeric', month:'long', day:'numeric' })}
{/* KPI */}
{kpiCards.map(c => (
{c.icon}

{c.label}

{c.value.toLocaleString()}

))}
{/* 인원 추이 */}

인원 추이 (6개월)

{/* 부서별 인원 */}

부서별 인원

{deptData.map((_: any, i: number) => )}
{/* 오늘 출결 */}

오늘 출결 현황

{[ { label: '출근', value: att.present_count || 0, color: 'bg-green-500' }, { label: '결근', value: att.absent_count || 0, color: 'bg-red-500' }, { label: '휴가', value: att.leave_count || 0, color: 'bg-yellow-500' }, ].map(r => (
{r.label}
{r.value}
))}

출근율: {att.attendance_rate || 0}%

{/* AI 인사이트 */}

🤖 AI 인사 인사이트

{(insights?.insights || []).map((ins: any, i: number) => (
{ins.priority}

{ins.title}

{ins.desc}

))} {!insights &&

AI 분석 로딩 중...

}
{/* 승인 대기 */} {(data?.pendingApprovals || []).length > 0 && (

승인 대기 목록

{(data.pendingApprovals || []).map((a: any, i: number) => (
{a.type === 'leave' ? '휴가' : '성과평가'} {a.title}
{a.created_at?.slice(0,10)}
))}
)}
) }