From e19a28fa52511448d7095638038c03688f8589e0 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Thu, 22 Jan 2026 09:59:20 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=97=91=EC=85=80=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EC=97=90=EC=84=9C=20=EA=B3=B5=EA=B8=89=EC=97=85?= =?UTF-8?q?=EC=B2=B4=20=EB=AA=85=EC=9D=B4=20=EC=95=88=EB=93=A4=EC=96=B4?= =?UTF-8?q?=EA=B0=80=EB=8D=98=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/common/ExcelUploadModal.tsx | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/frontend/components/common/ExcelUploadModal.tsx b/frontend/components/common/ExcelUploadModal.tsx index 64fe38b8..cddbb73f 100644 --- a/frontend/components/common/ExcelUploadModal.tsx +++ b/frontend/components/common/ExcelUploadModal.tsx @@ -928,12 +928,39 @@ export const ExcelUploadModal: React.FC = ({ {field.inputType === "entity" ? ( + {/* 중복 체크 체크박스 */} +
+ {mapping.systemColumn ? ( + + handleDuplicateCheckChange(mapping.excelColumn, checked as boolean) + } + className="h-4 w-4" + /> + ) : ( + - + )} +
))} + {/* 중복 체크 안내 */} + {duplicateCheckCount > 0 ? ( +
+
+
+ +
+

+ 중복 키: {columnMappings + .filter((m) => m.checkDuplicate && m.systemColumn) + .map((m) => { + const col = systemColumns.find((c) => c.name === m.systemColumn); + return col?.label || m.systemColumn; + }) + .join(" + ")} +

+

+ 위 컬럼 값이 모두 일치하는 기존 데이터가 있으면 중복으로 처리합니다. +

+
+
+
+ 중복 시: + +
+
+
+ ) : ( +
+
+ +
+

중복 체크 (선택사항)

+

+ "중복 키" 체크박스를 선택하면 해당 컬럼 값으로 기존 데이터와 비교합니다. + 여러 컬럼을 선택하면 복합 키로 중복을 판단합니다. +

+
+
+
+ )} + {/* 매핑 자동 저장 안내 */} {isAutoMappingLoaded ? (
@@ -1298,6 +1497,11 @@ export const ExcelUploadModal: React.FC = ({

{mapping.excelColumn} →{" "} {col?.label || mapping.systemColumn} + {mapping.checkDuplicate && ( + + (중복 체크: {mapping.duplicateAction === "overwrite" ? "덮어쓰기" : "건너뛰기"}) + + )}

); })} @@ -1307,6 +1511,29 @@ export const ExcelUploadModal: React.FC = ({
+ {/* 중복 체크 요약 */} + {duplicateCheckCount > 0 && ( +
+

중복 체크 설정

+
+

+ 중복 키:{" "} + {columnMappings + .filter((m) => m.checkDuplicate && m.systemColumn) + .map((m) => { + const col = systemColumns.find((c) => c.name === m.systemColumn); + return col?.label || m.systemColumn; + }) + .join(" + ")} +

+

+ 중복 시 처리:{" "} + {duplicateAction === "overwrite" ? "덮어쓰기 (기존 데이터 업데이트)" : "건너뛰기 (해당 행 무시)"} +

+
+
+ )} +