diff --git a/src/components/process-management/ProcessDetail.tsx b/src/components/process-management/ProcessDetail.tsx index 0c4196e6..bd5866f2 100644 --- a/src/components/process-management/ProcessDetail.tsx +++ b/src/components/process-management/ProcessDetail.tsx @@ -11,7 +11,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { useRouter } from 'next/navigation'; -import { ArrowLeft, Copy, Edit, GripVertical, Plus, Trash2 } from 'lucide-react'; +import { ArrowLeft, Copy, Edit, GripVertical, Plus, Trash2, ExternalLink } from 'lucide-react'; import { ReorderButtons } from '@/components/molecules'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; @@ -229,8 +229,23 @@ export function ProcessDetail({ process, onProcessUpdate }: ProcessDetailProps)
{process.manager || '-'}
- {/* Row 2: 구분 | 생산일자 | 상태 */} + {/* Row 2: 부모공정 | 구분 | 생산일자 | 상태 */}
+
+
부모 공정
+ {process.parentId ? ( + + ) : ( +
없음 (루트 공정)
+ )} +
구분
{process.processCategory || '없음'}
@@ -278,6 +293,38 @@ export function ProcessDetail({ process, onProcessUpdate }: ProcessDetailProps) + {/* 하위 공정 (자식이 있을 때만 표시) */} + {process.children && process.children.length > 0 && ( + + +
+ 하위 공정 + + {process.children.length}개 + +
+
+ +
+ {process.children.map((child) => ( +
router.push(`/ko/master-data/process-management/${child.id}?mode=view`)} + className="flex items-center gap-4 px-4 py-3 cursor-pointer hover:bg-muted/50" + > + {child.processCode} + {child.processName} + + {child.status === '사용중' ? '사용' : '미사용'} + + +
+ ))} +
+
+
+ )} + {/* 품목 설정 정보 */} diff --git a/src/components/process-management/ProcessForm.tsx b/src/components/process-management/ProcessForm.tsx index f4039182..202ee2bf 100644 --- a/src/components/process-management/ProcessForm.tsx +++ b/src/components/process-management/ProcessForm.tsx @@ -40,6 +40,7 @@ import { getDepartmentOptions, getProcessSteps, getDocumentTemplates, + getRootProcessOptions, type DepartmentOption, type DocumentTemplateOption, } from './actions'; @@ -53,6 +54,12 @@ export function ProcessForm({ mode, initialData }: ProcessFormProps) { const router = useRouter(); const isEdit = mode === 'edit'; + // 부모 공정 상태 + const [parentId, setParentId] = useState( + initialData?.parentId ? Number(initialData.parentId) : undefined + ); + const [rootProcessOptions, setRootProcessOptions] = useState>([]); + // 기본 정보 상태 const [processName, setProcessName] = useState(initialData?.processName || ''); const [processType, _setProcessType] = useState( @@ -152,18 +159,26 @@ export function ProcessForm({ mode, initialData }: ProcessFormProps) { setShowRemoveAllDialog(false); }, []); - // 부서 목록 + 문서양식 목록 로드 + // 부서 목록 + 문서양식 목록 + 루트 공정 목록 로드 useEffect(() => { const loadInitialData = async () => { setIsDepartmentsLoading(true); - const [departments, templates] = await Promise.all([ + const [departments, templates, rootProcesses] = await Promise.all([ getDepartmentOptions(), getDocumentTemplates(), + getRootProcessOptions(), ]); setDepartmentOptions(departments); if (templates.success && templates.data) { setDocumentTemplates(templates.data); } + if (rootProcesses.success && rootProcesses.data) { + // 수정 모드에서 자기 자신은 제외 + const filtered = isEdit && initialData?.id + ? rootProcesses.data.filter(p => p.id !== initialData.id) + : rootProcesses.data; + setRootProcessOptions(filtered); + } setIsDepartmentsLoading(false); }; loadInitialData(); @@ -340,6 +355,7 @@ export function ProcessForm({ mode, initialData }: ProcessFormProps) { } const formData = { + parentId: parentId || undefined, processName: processName.trim(), processType, processCategory: processCategory || undefined, @@ -459,8 +475,28 @@ export function ProcessForm({ mode, initialData }: ProcessFormProps) { />
- {/* Row 2: 구분 | 생산일자 | 상태 */} + {/* Row 2: 부모공정 | 구분 | 생산일자 | 상태 */}
+
+ + +