feat(WEB): 중간검사 문서 템플릿 동적 연동 - 공정관리 선택기 + Worker Screen 동적 폼
- ProcessStep 타입에 documentTemplateId/documentTemplateName 추가 - 공정관리 actions.ts: document_template_id 매핑 + getDocumentTemplates 서버 액션 - StepForm: 검사여부 사용 시 문서양식 선택 드롭다운 추가 - WorkerScreen actions.ts: getInspectionTemplate, saveInspectionDocument 서버 액션 추가 - InspectionInputModal: tolerance 기반 자동 판정 + 동적 폼(DynamicInspectionForm) 추가 - evaluateTolerance: symmetric/asymmetric/range 3가지 tolerance 판정 - 기존 공정별 하드코딩은 템플릿 없을 때 레거시 모드로 유지 - InspectionReportModal: 템플릿 모드 동적 렌더링 (기준서/DATA/결재라인) - WorkerScreen index: handleInspectionComplete에서 Document 저장 호출 추가
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
* - 완료 정보: 유형(선택 완료 시 완료/클릭 시 완료)
|
||||
*/
|
||||
|
||||
import { useState, useCallback } from 'react';
|
||||
import { useState, useCallback, useEffect } from 'react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { Input } from '@/components/ui/input';
|
||||
@@ -37,7 +37,8 @@ import {
|
||||
STEP_CONNECTION_TARGET_OPTIONS,
|
||||
DEFAULT_INSPECTION_SETTING,
|
||||
} from '@/types/process';
|
||||
import { createProcessStep, updateProcessStep } from './actions';
|
||||
import { createProcessStep, updateProcessStep, getDocumentTemplates } from './actions';
|
||||
import type { DocumentTemplateOption } from './actions';
|
||||
import type { DetailConfig } from '@/components/templates/IntegratedDetailTemplate/types';
|
||||
import { InspectionSettingModal } from './InspectionSettingModal';
|
||||
import { InspectionPreviewModal } from './InspectionPreviewModal';
|
||||
@@ -104,6 +105,12 @@ export function StepForm({ mode, processId, initialData }: StepFormProps) {
|
||||
initialData?.completionType || '클릭 시 완료'
|
||||
);
|
||||
|
||||
// 문서양식 선택
|
||||
const [documentTemplateId, setDocumentTemplateId] = useState<number | undefined>(
|
||||
initialData?.documentTemplateId
|
||||
);
|
||||
const [documentTemplates, setDocumentTemplates] = useState<DocumentTemplateOption[]>([]);
|
||||
|
||||
// 검사 설정
|
||||
const [inspectionSetting, setInspectionSetting] = useState<InspectionSetting>(
|
||||
initialData?.inspectionSetting || DEFAULT_INSPECTION_SETTING
|
||||
@@ -118,6 +125,17 @@ export function StepForm({ mode, processId, initialData }: StepFormProps) {
|
||||
// 검사여부가 "사용"인지 확인
|
||||
const isInspectionEnabled = needsInspection === '사용';
|
||||
|
||||
// 검사여부가 "사용"이면 문서양식 목록 조회
|
||||
useEffect(() => {
|
||||
if (isInspectionEnabled && documentTemplates.length === 0) {
|
||||
getDocumentTemplates().then((result) => {
|
||||
if (result.success && result.data) {
|
||||
setDocumentTemplates(result.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
}, [isInspectionEnabled, documentTemplates.length]);
|
||||
|
||||
// 제출
|
||||
const handleSubmit = async (): Promise<{ success: boolean; error?: string }> => {
|
||||
if (!stepName.trim()) {
|
||||
@@ -131,6 +149,7 @@ export function StepForm({ mode, processId, initialData }: StepFormProps) {
|
||||
isRequired: isRequired === '필수',
|
||||
needsApproval: needsApproval === '필요',
|
||||
needsInspection: needsInspection === '사용',
|
||||
documentTemplateId: isInspectionEnabled ? documentTemplateId : undefined,
|
||||
isActive: isActive === '사용',
|
||||
order: initialData?.order || 0,
|
||||
connectionType,
|
||||
@@ -250,6 +269,33 @@ export function StepForm({ mode, processId, initialData }: StepFormProps) {
|
||||
</Select>
|
||||
</div>
|
||||
</div>
|
||||
{/* 문서양식 선택 (검사여부가 "사용"일 때만 표시) */}
|
||||
{isInspectionEnabled && (
|
||||
<div className="mt-4 grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6">
|
||||
<div className="space-y-2">
|
||||
<Label>문서양식 (검사 템플릿)</Label>
|
||||
<Select
|
||||
key={`doc-template-${documentTemplateId ?? 'none'}`}
|
||||
value={documentTemplateId ? String(documentTemplateId) : ''}
|
||||
onValueChange={(v) => setDocumentTemplateId(v ? Number(v) : undefined)}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="문서양식을 선택하세요" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{documentTemplates.map((tmpl) => (
|
||||
<SelectItem key={tmpl.id} value={String(tmpl.id)}>
|
||||
{tmpl.name} ({tmpl.category})
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
중간검사 시 사용할 문서양식을 선택합니다. MNG에서 등록한 양식이 표시됩니다.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
@@ -338,6 +384,8 @@ export function StepForm({ mode, processId, initialData }: StepFormProps) {
|
||||
completionType,
|
||||
initialData?.stepCode,
|
||||
isInspectionEnabled,
|
||||
documentTemplateId,
|
||||
documentTemplates,
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user