'use client'; /** * 자재투입 모달 * * 기획 화면에 맞춘 레이아웃: * - FIFO 순위 설명 (1 최우선, 2 차선, 3+ 대기) * - ① 자재 선택 (BOM 기준) 테이블 * - 취소 / 투입 등록 버튼 (전체 너비) */ import { useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Checkbox } from '@/components/ui/checkbox'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { WorkOrder } from '../ProductionDashboard/types'; import type { MaterialInput } from './types'; // Mock 자재 데이터 const MOCK_MATERIALS: MaterialInput[] = [ { id: '1', materialCode: 'KD-RM-001', materialName: 'SPHC-SD 1.6T', unit: 'KG', currentStock: 500, fifoRank: 1, }, { id: '2', materialCode: 'KD-RM-002', materialName: 'EGI 1.55T', unit: 'KG', currentStock: 350, fifoRank: 2, }, { id: '3', materialCode: 'KD-SM-001', materialName: '볼트 M6x20', unit: 'EA', currentStock: 1200, fifoRank: 3, }, ]; interface MaterialInputModalProps { open: boolean; onOpenChange: (open: boolean) => void; order: WorkOrder | null; onComplete?: () => void; isCompletionFlow?: boolean; onSaveMaterials?: (orderId: string, materials: MaterialInput[]) => void; savedMaterials?: MaterialInput[]; } export function MaterialInputModal({ open, onOpenChange, order, onComplete, isCompletionFlow = false, onSaveMaterials, }: MaterialInputModalProps) { const [selectedMaterials, setSelectedMaterials] = useState>(new Set()); const [materials] = useState(MOCK_MATERIALS); const handleToggleMaterial = (materialId: string) => { setSelectedMaterials((prev) => { const next = new Set(prev); if (next.has(materialId)) { next.delete(materialId); } else { next.add(materialId); } return next; }); }; // 투입 등록 const handleSubmit = () => { if (!order) return; const selectedMaterialList = materials.filter((m) => selectedMaterials.has(m.id)); console.log('[자재투입] 저장:', order.id, selectedMaterialList); if (onSaveMaterials) { onSaveMaterials(order.id, selectedMaterialList); } resetAndClose(); if (isCompletionFlow && onComplete) { onComplete(); } }; // 취소 const handleCancel = () => { resetAndClose(); }; const resetAndClose = () => { setSelectedMaterials(new Set()); onOpenChange(false); }; if (!order) return null; return ( {/* 헤더 */} 투입자재 등록
{/* FIFO 순위 설명 */}
FIFO 순위:
1 최우선 2 차선 3+ 대기
{/* 자재 선택 섹션 */}

① 자재 선택 (BOM 기준)

{materials.length === 0 ? (
자재코드 자재명 단위 현재고 선택 이 공정에 배정된 자재가 없습니다.
) : (
자재코드 자재명 단위 현재고 선택 {materials.map((material) => ( {material.materialCode} {material.materialName} {material.unit} {material.currentStock.toLocaleString()} handleToggleMaterial(material.id)} /> ))}
)}
{/* 버튼 영역 */}
); }