From d1e805a88dd50c828a92be748c7dc52e9e2466f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Wed, 11 Feb 2026 15:58:52 +0900 Subject: [PATCH] =?UTF-8?q?fix(WEB):=20=EA=B2=80=EC=82=AC=EC=84=B1?= =?UTF-8?q?=EC=A0=81=EC=84=9C=20=EB=B3=B4=EA=B8=B0=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=ED=8F=B4=EB=B0=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TemplateInspectionContent: 푸터 비고/종합판정 높이 동일 배치, 판정 표시 간소화 - InspectionReportModal: props 데이터 비어있을 때 API 로딩 데이터 폴백 처리 --- .../documents/InspectionReportModal.tsx | 7 +- .../documents/TemplateInspectionContent.tsx | 102 +++++++++++++----- 2 files changed, 77 insertions(+), 32 deletions(-) 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 || '비고'} +