diff --git a/src/components/material/StockStatus/StockStatusList.tsx b/src/components/material/StockStatus/StockStatusList.tsx index b4c271c0..bd149c4f 100644 --- a/src/components/material/StockStatus/StockStatusList.tsx +++ b/src/components/material/StockStatus/StockStatusList.tsx @@ -15,9 +15,9 @@ import { useRouter } from 'next/navigation'; import { Package, CheckCircle2, - AlertCircle, Eye, AlertTriangle, + ArrowUpCircle, } from 'lucide-react'; import type { ExcelColumn } from '@/lib/utils/excel-download'; import { Button } from '@/components/ui/button'; @@ -75,7 +75,7 @@ export function StockStatusList() { }); // ===== 통계 카드 필터 상태 ===== - const [stockStatusFilter, setStockStatusFilter] = useState<'all' | 'low' | 'out'>('all'); + const [stockStatusFilter, setStockStatusFilter] = useState<'all' | 'low' | 'out' | 'over'>('all'); // 데이터 로드 함수 const loadData = useCallback(async () => { @@ -149,6 +149,8 @@ export function StockStatusList() { if (stock.status !== 'low') return false; } else if (stockStatusFilter === 'out') { if (stock.status !== 'out') return false; + } else if (stockStatusFilter === 'over') { + if (stock.status !== 'over') return false; } return true; @@ -268,15 +270,6 @@ export function StockStatusList() { icon: CheckCircle2, iconColor: 'text-green-600', }, - { - label: '재고 부족', - value: `${stockStats?.lowCount || 0}`, - icon: AlertCircle, - iconColor: 'text-red-600', - onClick: () => setStockStatusFilter(stockStatusFilter === 'low' ? 'all' : 'low'), - isActive: stockStatusFilter === 'low', - tooltip: '현재 재고량이 안전재고(최소) 미만인 품목입니다.\n발주를 검토하여 재고를 보충해야 합니다.\n클릭하면 해당 품목만 필터링됩니다.', - }, { label: '안전재고 미달', value: `${stockStats?.outCount || 0}`, @@ -284,7 +277,16 @@ export function StockStatusList() { iconColor: 'text-orange-600', onClick: () => setStockStatusFilter(stockStatusFilter === 'out' ? 'all' : 'out'), isActive: stockStatusFilter === 'out', - tooltip: '재고가 0인 품목입니다.\n긴급 발주가 필요할 수 있습니다.\n클릭하면 해당 품목만 필터링됩니다.', + tooltip: '재고가 0이거나 안전재고 미만인 품목입니다.\n긴급 발주가 필요할 수 있습니다.\n클릭하면 해당 품목만 필터링됩니다.', + }, + { + label: '최대재고 초과', + value: `${stockStats?.overCount || 0}`, + icon: ArrowUpCircle, + iconColor: 'text-red-600', + onClick: () => setStockStatusFilter(stockStatusFilter === 'over' ? 'all' : 'over'), + isActive: stockStatusFilter === 'over', + tooltip: '현재 재고량이 최대재고를 초과한 품목입니다.\n과잉재고로 보관비용이 증가할 수 있습니다.\n클릭하면 해당 품목만 필터링됩니다.', }, ]; diff --git a/src/components/material/StockStatus/actions.ts b/src/components/material/StockStatus/actions.ts index e2297346..9da67fa6 100644 --- a/src/components/material/StockStatus/actions.ts +++ b/src/components/material/StockStatus/actions.ts @@ -92,6 +92,7 @@ interface StockApiStatsResponse { normal_count: number; low_count: number; out_count: number; + over_count: number; no_stock_count: number; } @@ -224,6 +225,7 @@ function transformApiToStats(data: StockApiStatsResponse): StockStats { normalCount: data.normal_count, lowCount: data.low_count, outCount: data.out_count, + overCount: data.over_count || 0, noStockCount: data.no_stock_count || 0, }; } diff --git a/src/components/material/StockStatus/types.ts b/src/components/material/StockStatus/types.ts index f9c656c9..1a0733b5 100644 --- a/src/components/material/StockStatus/types.ts +++ b/src/components/material/StockStatus/types.ts @@ -133,6 +133,7 @@ export interface StockStats { normalCount: number; // 정상 재고 수 lowCount: number; // 재고 부족 수 outCount: number; // 재고 없음 수 + overCount: number; // 최대재고 초과 수 noStockCount: number; // 재고 정보 없는 품목 수 }