From 2e36c2ba882fe55c52499a63e923322bd7bc041c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Mon, 23 Mar 2026 09:04:52 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[=EC=9E=AC=EA=B3=A0]=20=EC=9E=AC?= =?UTF-8?q?=EA=B3=A0=EB=B6=80=EC=A1=B1=20=EC=B9=B4=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0,=20=EC=B5=9C=EB=8C=80=EC=9E=AC=EA=B3=A0=20=EC=B4=88?= =?UTF-8?q?=EA=B3=BC=20=EC=B9=B4=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 재고 부족 카드 제거 (안전재고 미달과 중복) - 최대재고 초과 카드 추가 (over 상태 필터링) - StockStats 타입에 overCount 필드 추가 - 카드 클릭 시 최대재고 초과 품목 필터링 기능 --- .../material/StockStatus/StockStatusList.tsx | 26 ++++++++++--------- .../material/StockStatus/actions.ts | 2 ++ src/components/material/StockStatus/types.ts | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) 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; // 재고 정보 없는 품목 수 }