feat: [재고] 재고부족 카드 제거, 최대재고 초과 카드 추가

- 재고 부족 카드 제거 (안전재고 미달과 중복)
- 최대재고 초과 카드 추가 (over 상태 필터링)
- StockStats 타입에 overCount 필드 추가
- 카드 클릭 시 최대재고 초과 품목 필터링 기능
This commit is contained in:
김보곤
2026-03-23 09:04:52 +09:00
parent 583cd9c348
commit 2e36c2ba88
3 changed files with 17 additions and 12 deletions

View File

@@ -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클릭하면 해당 품목만 필터링됩니다.',
},
];

View File

@@ -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,
};
}

View File

@@ -133,6 +133,7 @@ export interface StockStats {
normalCount: number; // 정상 재고 수
lowCount: number; // 재고 부족 수
outCount: number; // 재고 없음 수
overCount: number; // 최대재고 초과 수
noStockCount: number; // 재고 정보 없는 품목 수
}