'use client'; /** * 중간검사 입력 모달 * * 공정별로 다른 검사 항목 표시: * - screen: 스크린 중간검사 * - slat: 슬랫 중간검사 * - slat_jointbar: 조인트바 중간검사 * - bending: 절곡 중간검사 * - bending_wip: 재고생산(재공품) 중간검사 */ import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { cn } from '@/lib/utils'; // 중간검사 공정 타입 export type InspectionProcessType = | 'screen' | 'slat' | 'slat_jointbar' | 'bending' | 'bending_wip'; // 검사 결과 데이터 타입 export interface InspectionData { productName: string; specification: string; // 겉모양 상태 bendingStatus?: 'good' | 'bad' | null; // 절곡상태 processingStatus?: 'good' | 'bad' | null; // 가공상태 sewingStatus?: 'good' | 'bad' | null; // 재봉상태 assemblyStatus?: 'good' | 'bad' | null; // 조립상태 // 치수 length?: number | null; width?: number | null; height1?: number | null; height2?: number | null; length3?: number | null; gap4?: number | null; gapStatus?: 'ok' | 'ng' | null; // 간격 포인트들 (절곡용) gapPoints?: { left: number | null; right: number | null }[]; // 판정 judgment: 'pass' | 'fail' | null; nonConformingContent: string; } interface InspectionInputModalProps { open: boolean; onOpenChange: (open: boolean) => void; processType: InspectionProcessType; productName?: string; specification?: string; onComplete: (data: InspectionData) => void; } const PROCESS_TITLES: Record = { screen: '# 스크린 중간검사', slat: '# 슬랫 중간검사', slat_jointbar: '# 조인트바 중간검사', bending: '# 절곡 중간검사', bending_wip: '# 재고생산 중간검사', }; // 양호/불량 버튼 컴포넌트 function StatusToggle({ value, onChange, }: { value: 'good' | 'bad' | null; onChange: (v: 'good' | 'bad') => void; }) { return (
); } // OK/NG 버튼 컴포넌트 function OkNgToggle({ value, onChange, }: { value: 'ok' | 'ng' | null; onChange: (v: 'ok' | 'ng') => void; }) { return (
); } // 적합/부적합 버튼 컴포넌트 function JudgmentToggle({ value, onChange, }: { value: 'pass' | 'fail' | null; onChange: (v: 'pass' | 'fail') => void; }) { return (
); } export function InspectionInputModal({ open, onOpenChange, processType, productName = '', specification = '', onComplete, }: InspectionInputModalProps) { const [formData, setFormData] = useState({ productName, specification, judgment: null, nonConformingContent: '', }); // 절곡용 간격 포인트 초기화 const [gapPoints, setGapPoints] = useState<{ left: number | null; right: number | null }[]>( Array(5).fill(null).map(() => ({ left: null, right: null })) ); useEffect(() => { if (open) { // 공정별 기본값 설정 - 모두 양호/OK/적합 상태로 초기화 const baseData: InspectionData = { productName, specification, judgment: 'pass', // 기본값: 적합 nonConformingContent: '', }; // 공정별 추가 기본값 설정 switch (processType) { case 'screen': setFormData({ ...baseData, processingStatus: 'good', // 가공상태: 양호 sewingStatus: 'good', // 재봉상태: 양호 assemblyStatus: 'good', // 조립상태: 양호 gapStatus: 'ok', // 간격: OK }); break; case 'slat': setFormData({ ...baseData, processingStatus: 'good', // 가공상태: 양호 assemblyStatus: 'good', // 조립상태: 양호 }); break; case 'slat_jointbar': setFormData({ ...baseData, processingStatus: 'good', // 가공상태: 양호 assemblyStatus: 'good', // 조립상태: 양호 }); break; case 'bending': setFormData({ ...baseData, bendingStatus: 'good', // 절곡상태: 양호 }); break; case 'bending_wip': setFormData({ ...baseData, bendingStatus: 'good', // 절곡상태: 양호 }); break; default: setFormData(baseData); } setGapPoints(Array(5).fill(null).map(() => ({ left: null, right: null }))); } }, [open, productName, specification, processType]); const handleComplete = () => { const data: InspectionData = { ...formData, gapPoints: processType === 'bending' ? gapPoints : undefined, }; onComplete(data); onOpenChange(false); }; const handleCancel = () => { onOpenChange(false); }; // 숫자 입력 핸들러 const handleNumberChange = ( key: keyof InspectionData, value: string ) => { const num = value === '' ? null : parseFloat(value); setFormData((prev) => ({ ...prev, [key]: num })); }; return ( {PROCESS_TITLES[processType]}
{/* 제품명 */}
{/* 규격 */}
{/* ===== 재고생산 (bending_wip) 검사 항목 ===== */} {processType === 'bending_wip' && ( <>
setFormData((prev) => ({ ...prev, bendingStatus: v }))} />
handleNumberChange('length', e.target.value)} className="" />
handleNumberChange('width', e.target.value)} className="" />
)} {/* ===== 스크린 검사 항목 ===== */} {processType === 'screen' && ( <>
setFormData((prev) => ({ ...prev, processingStatus: v }))} />
setFormData((prev) => ({ ...prev, sewingStatus: v }))} />
setFormData((prev) => ({ ...prev, assemblyStatus: v }))} />
handleNumberChange('length', e.target.value)} className="" />
handleNumberChange('width', e.target.value)} className="" />
setFormData((prev) => ({ ...prev, gapStatus: v }))} />
)} {/* ===== 슬랫 검사 항목 ===== */} {processType === 'slat' && ( <>
setFormData((prev) => ({ ...prev, processingStatus: v }))} />
setFormData((prev) => ({ ...prev, assemblyStatus: v }))} />
handleNumberChange('height1', e.target.value)} className="" />
handleNumberChange('height2', e.target.value)} className="" />
handleNumberChange('length', e.target.value)} className="" />
)} {/* ===== 조인트바 검사 항목 ===== */} {processType === 'slat_jointbar' && ( <>
setFormData((prev) => ({ ...prev, processingStatus: v }))} />
setFormData((prev) => ({ ...prev, assemblyStatus: v }))} />
handleNumberChange('height1', e.target.value)} className="" />
handleNumberChange('height2', e.target.value)} className="" />
handleNumberChange('length3', e.target.value)} className="" />
handleNumberChange('gap4', e.target.value)} className="" />
)} {/* ===== 절곡 검사 항목 ===== */} {processType === 'bending' && ( <>
setFormData((prev) => ({ ...prev, bendingStatus: v }))} />
handleNumberChange('length', e.target.value)} className="" />
{gapPoints.map((point, index) => (
⑤{index + 1} { const newPoints = [...gapPoints]; newPoints[index] = { ...newPoints[index], left: e.target.value === '' ? null : parseFloat(e.target.value), }; setGapPoints(newPoints); }} className="" /> { const newPoints = [...gapPoints]; newPoints[index] = { ...newPoints[index], right: e.target.value === '' ? null : parseFloat(e.target.value), }; setGapPoints(newPoints); }} className="" />
))}
)} {/* 공통: 판정 */}
setFormData((prev) => ({ ...prev, judgment: v }))} />
{/* 공통: 부적합 내용 */}