feat: [재고] 재고부족 카드 제거, 최대재고 초과 카드 추가
- 재고 부족 카드 제거 (안전재고 미달과 중복) - 최대재고 초과 카드 추가 (over 상태 필터링) - StockStats 타입에 overCount 필드 추가 - 카드 클릭 시 최대재고 초과 품목 필터링 기능
This commit is contained in:
@@ -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클릭하면 해당 품목만 필터링됩니다.',
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -133,6 +133,7 @@ export interface StockStats {
|
||||
normalCount: number; // 정상 재고 수
|
||||
lowCount: number; // 재고 부족 수
|
||||
outCount: number; // 재고 없음 수
|
||||
overCount: number; // 최대재고 초과 수
|
||||
noStockCount: number; // 재고 정보 없는 품목 수
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user