From 2f3d5f993ae3a9e673456c3fca3e05a6c6920101 Mon Sep 17 00:00:00 2001 From: SeongHyun Kim Date: Mon, 24 Nov 2025 15:38:41 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=88=98=EC=A3=BC=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=A0=80=EC=9E=A5=20=EC=8B=9C=20=EC=A1=B0?= =?UTF-8?q?=EC=9D=B8=20=EC=BB=AC=EB=9F=BC=20=ED=95=84=ED=84=B0=EB=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - entityJoinApi 조회 데이터의 조인 컬럼(material_label 등) 필터링 - dynamicFormService.ts: 병합 모드에서 columnInfo 기반 유효 컬럼만 저장 - sales_order_mng 테이블에 존재하지 않는 컬럼 INSERT 방지 - "column does not exist" PostgreSQL 에러 해결 영향: 수주관리 그룹 편집 저장 정상 동작 --- .../src/services/dynamicFormService.ts | 29 +++++++++++++------ frontend/components/screen/EditModal.tsx | 10 +++---- .../ConditionalSectionViewer.tsx | 20 ++++++------- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/backend-node/src/services/dynamicFormService.ts b/backend-node/src/services/dynamicFormService.ts index 965d2833..5ca787a4 100644 --- a/backend-node/src/services/dynamicFormService.ts +++ b/backend-node/src/services/dynamicFormService.ts @@ -496,16 +496,27 @@ export class DynamicFormService { for (const repeater of mergedRepeaterData) { for (const item of repeater.data) { // 헤더 + 품목을 병합 - const mergedData = { ...dataToInsert, ...item }; + const rawMergedData = { ...dataToInsert, ...item }; - // 타입 변환 - Object.keys(mergedData).forEach((columnName) => { - const column = columnInfo.find((col) => col.column_name === columnName); - if (column) { - mergedData[columnName] = this.convertValueForPostgreSQL( - mergedData[columnName], - column.data_type - ); + // 🆕 실제 테이블 컬럼만 필터링 (조인/계산 컬럼 제외) + const validColumnNames = columnInfo.map((col) => col.column_name); + const mergedData: Record = {}; + + Object.keys(rawMergedData).forEach((columnName) => { + // 실제 테이블 컬럼인지 확인 + if (validColumnNames.includes(columnName)) { + const column = columnInfo.find((col) => col.column_name === columnName); + if (column) { + // 타입 변환 + mergedData[columnName] = this.convertValueForPostgreSQL( + rawMergedData[columnName], + column.data_type + ); + } else { + mergedData[columnName] = rawMergedData[columnName]; + } + } else { + console.log(`⚠️ 조인/계산 컬럼 제외: ${columnName} (값: ${rawMergedData[columnName]})`); } }); diff --git a/frontend/components/screen/EditModal.tsx b/frontend/components/screen/EditModal.tsx index 776eea83..5dec9266 100644 --- a/frontend/components/screen/EditModal.tsx +++ b/frontend/components/screen/EditModal.tsx @@ -323,7 +323,7 @@ export const EditModal: React.FC = ({ className }) => { continue; } - // 변경된 필드만 추출 + // 변경된 필드만 추출 const changedData: Record = {}; // 🆕 sales_order_mng 테이블의 실제 컬럼만 포함 (조인된 컬럼 제외) @@ -572,10 +572,10 @@ export const EditModal: React.FC = ({ className }) => { ); } } else { - setFormData((prev) => ({ - ...prev, - [fieldName]: value, - })); + setFormData((prev) => ({ + ...prev, + [fieldName]: value, + })); } }} screenInfo={{ diff --git a/frontend/lib/registry/components/conditional-container/ConditionalSectionViewer.tsx b/frontend/lib/registry/components/conditional-container/ConditionalSectionViewer.tsx index d402f4df..f77dbcdb 100644 --- a/frontend/lib/registry/components/conditional-container/ConditionalSectionViewer.tsx +++ b/frontend/lib/registry/components/conditional-container/ConditionalSectionViewer.tsx @@ -142,7 +142,7 @@ export function ConditionalSectionViewer({ return (
+ />
); })}