diff --git a/src/components/production/WorkOrders/documents/InspectionReportModal.tsx b/src/components/production/WorkOrders/documents/InspectionReportModal.tsx index c2758426..78177374 100644 --- a/src/components/production/WorkOrders/documents/InspectionReportModal.tsx +++ b/src/components/production/WorkOrders/documents/InspectionReportModal.tsx @@ -135,9 +135,10 @@ export function InspectionReportModal({ const [selfTemplateData, setSelfTemplateData] = useState(null); // props에서 목업 제외한 실제 개소만 사용 (WorkerScreen에서 apiItems + mockItems가 합쳐져 전달됨) - // React에서는 개소 미등록 시 성적서 버튼 자체가 노출되지 않으므로 API fallback 불필요 - const effectiveWorkItems = propWorkItems?.filter(w => !w.id.startsWith('mock-')); - const effectiveInspectionDataMap = propInspectionDataMap; + // props 데이터가 없거나 비어있으면 API 로딩 데이터를 fallback으로 사용 + const propFiltered = propWorkItems?.filter(w => !w.id.startsWith('mock-')); + const effectiveWorkItems = (propFiltered && propFiltered.length > 0) ? propFiltered : apiWorkItems ?? undefined; + const effectiveInspectionDataMap = (propInspectionDataMap && propInspectionDataMap.size > 0) ? propInspectionDataMap : apiInspectionDataMap ?? undefined; // 목업 WorkOrder 생성 const createMockOrder = (id: string, pType: ProcessType): WorkOrder => ({ diff --git a/src/components/production/WorkOrders/documents/TemplateInspectionContent.tsx b/src/components/production/WorkOrders/documents/TemplateInspectionContent.tsx index f0bb4991..3a15c93b 100644 --- a/src/components/production/WorkOrders/documents/TemplateInspectionContent.tsx +++ b/src/components/production/WorkOrders/documents/TemplateInspectionContent.tsx @@ -156,6 +156,17 @@ export const TemplateInspectionContent = forwardRef { + const map = new Map(); + for (const s of dataSections) { + for (const item of s.items) { + map.set(item.id, s.id); + } + } + return map; + }, [dataSections]); + // 컬럼 → 섹션 아이템 매핑 (라벨 정규화 비교) const columnItemMap = useMemo(() => { const map = new Map(); @@ -183,6 +194,8 @@ export const TemplateInspectionContent = forwardRef { if (!inspectionDataMap || !workItems) return; const initial: Record = {}; @@ -192,14 +205,54 @@ export const TemplateInspectionContent = forwardRef 0; + + if (typeof rawVal === 'object') { + // 이미 CellValue 객체 + initial[cellKey] = rawVal as CellValue; + } else if (rawVal === 'ok') { + initial[cellKey] = { status: 'good' }; + } else if (rawVal === 'ng') { + initial[cellKey] = { status: 'bad' }; + } else if (isComplex) { + // complex 컬럼: 숫자/문자열을 첫 번째 측정값으로 매핑 + const strVal = typeof rawVal === 'number' ? String(rawVal) : String(rawVal); + initial[cellKey] = { measurements: [strVal, '', ''] }; + } else if (typeof rawVal === 'number') { + initial[cellKey] = { value: String(rawVal) }; + } else if (typeof rawVal === 'string') { + initial[cellKey] = { value: rawVal }; } } }); if (Object.keys(initial).length > 0) setCellValues(initial); + + // 부적합 내용 복원: 각 개소의 nonConformingContent를 수집 + const remarks: string[] = []; + workItems.forEach((wi) => { + const itemData = inspectionDataMap.get(wi.id); + if (itemData?.nonConformingContent) { + remarks.push(itemData.nonConformingContent); + } + }); + if (remarks.length > 0) setInadequateContent(remarks.join('\n')); // eslint-disable-next-line react-hooks/exhaustive-deps }, [inspectionDataMap, workItems]); @@ -265,7 +318,11 @@ export const TemplateInspectionContent = forwardRef), })); @@ -608,16 +665,16 @@ export const TemplateInspectionContent = forwardRef )} - {/* ===== 푸터: 비고(좌) + 종합판정(우) 병렬 배치 ===== */} -
+ {/* ===== 푸터: 비고(좌) + 종합판정(우) 높이 동일 배치 ===== */} +
- +
- -
+ {template.footer_remark_label || '비고'} +