import { useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Card, CardContent } from '@shared/components/ui/card'; import { Badge } from '@shared/components/ui/badge'; import { DataTable, type DataColumn } from '@shared/components/common/DataTable'; import { FileText, Ship, MapPin, Calendar, Shield, CheckCircle, XCircle } from 'lucide-react'; import { useEnforcementStore } from '@stores/enforcementStore'; /* SFR-11: 단속·탐지 이력 관리 */ interface Record { id: string; date: string; zone: string; vessel: string; violation: string; action: string; aiMatch: string; result: string; [key: string]: unknown; } const cols: DataColumn[] = [ { key: 'id', label: 'ID', width: '80px', render: v => {v as string} }, { key: 'date', label: '일시', width: '130px', sortable: true, render: v => {v as string} }, { key: 'zone', label: '해역', width: '90px', sortable: true }, { key: 'vessel', label: '대상 선박', sortable: true, render: v => {v as string} }, { key: 'violation', label: '위반 내용', width: '100px', sortable: true, render: v => {v as string} }, { key: 'action', label: '조치', width: '90px' }, { key: 'aiMatch', label: 'AI 매칭', width: '70px', align: 'center', render: v => { const m = v as string; return m === '일치' ? : ; } }, { key: 'result', label: '결과', width: '80px', align: 'center', sortable: true, render: v => { const r = v as string; const c = r.includes('처벌') || r.includes('수사') ? 'bg-red-500/20 text-red-400' : r.includes('오탐') ? 'bg-muted text-muted-foreground' : 'bg-yellow-500/20 text-yellow-400'; return {r}; } }, ]; export function EnforcementHistory() { const { t } = useTranslation('enforcement'); const { records, load } = useEnforcementStore(); useEffect(() => { load(); }, [load]); const DATA: Record[] = records as Record[]; return (

{t('history.title')}

{t('history.desc')}

{[{ l: '총 단속', v: DATA.length, c: 'text-heading' }, { l: '처벌', v: DATA.filter(d => d.result.includes('처벌')).length, c: 'text-red-400' }, { l: 'AI 일치', v: DATA.filter(d => d.aiMatch === '일치').length, c: 'text-green-400' }, { l: '오탐', v: DATA.filter(d => d.result.includes('오탐')).length, c: 'text-yellow-400' }].map(k => (
{k.v}{k.l}
))}
); }