From a55115ac486b5dba1b2cf873ad03ea6a958059b8 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Wed, 21 Jan 2026 09:25:21 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=97=91=EC=85=80=20=EC=97=B4=EC=A7=A4?= =?UTF-8?q?=EB=A0=A4=EC=84=9C=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EB=90=98?= =?UTF-8?q?=EB=8A=94=EA=B1=B0=EB=9E=91=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EC=8B=9C=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EB=91=90=EA=B0=9C=EC=9D=B4=EC=83=81=EC=9D=B4=EB=A9=B4=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=82=98=EC=98=A4=EB=8D=98?= =?UTF-8?q?=EA=B1=B0=20=EC=88=98=EC=A0=95=ED=96=88=EC=8A=B5=EB=8B=88?= =?UTF-8?q?=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table-list/TableListComponent.tsx | 40 ++++++++++++++----- frontend/lib/utils/buttonActions.ts | 30 ++++++++++++-- frontend/lib/utils/excelExport.ts | 6 ++- 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/frontend/lib/registry/components/table-list/TableListComponent.tsx b/frontend/lib/registry/components/table-list/TableListComponent.tsx index 366aa05b..9793acd8 100644 --- a/frontend/lib/registry/components/table-list/TableListComponent.tsx +++ b/frontend/lib/registry/components/table-list/TableListComponent.tsx @@ -2688,19 +2688,41 @@ export const TableListComponent: React.FC = ({ const value = row[mappedColumnName]; // 카테고리 매핑된 값 처리 - if (categoryMappings[col.columnName] && value !== null && value !== undefined) { - const mapping = categoryMappings[col.columnName][String(value)]; - if (mapping) { - return mapping.label; + if (value !== null && value !== undefined) { + const valueStr = String(value); + + // 디버그 로그 (카테고리 값인 경우만) + if (valueStr.startsWith("CATEGORY_")) { + console.log("🔍 [엑셀다운로드] 카테고리 변환 시도:", { + columnName: col.columnName, + value: valueStr, + hasMappings: !!categoryMappings[col.columnName], + mappingsKeys: categoryMappings[col.columnName] ? Object.keys(categoryMappings[col.columnName]).slice(0, 5) : [], + }); } + + if (categoryMappings[col.columnName]) { + // 쉼표로 구분된 중복 값 처리 + if (valueStr.includes(",")) { + const values = valueStr.split(",").map((v) => v.trim()).filter((v) => v); + const labels = values.map((v) => { + const mapping = categoryMappings[col.columnName][v]; + return mapping ? mapping.label : v; + }); + return labels.join(", "); + } + // 단일 값 처리 + const mapping = categoryMappings[col.columnName][valueStr]; + if (mapping) { + return mapping.label; + } + } + + return value; } // null/undefined 처리 - if (value === null || value === undefined) { - return ""; - } - - return value; + return ""; }); }); diff --git a/frontend/lib/utils/buttonActions.ts b/frontend/lib/utils/buttonActions.ts index debf58b2..6c69ad10 100644 --- a/frontend/lib/utils/buttonActions.ts +++ b/frontend/lib/utils/buttonActions.ts @@ -4737,7 +4737,24 @@ export class ButtonActionExecutor { const filteredRow: Record = {}; visibleColumns!.forEach((columnName: string) => { const label = columnLabels?.[columnName] || columnName; - filteredRow[label] = row[columnName]; + let value = row[columnName]; + + // 카테고리 코드를 라벨로 변환 (CATEGORY_로 시작하는 값) + if (value && typeof value === "string" && value.includes("CATEGORY_")) { + // 먼저 _label 필드 확인 (API에서 제공하는 경우) + const labelFieldName = `${columnName}_label`; + if (row[labelFieldName]) { + value = row[labelFieldName]; + } else { + // _value_label 필드 확인 + const valueLabelFieldName = `${columnName}_value_label`; + if (row[valueLabelFieldName]) { + value = row[valueLabelFieldName]; + } + } + } + + filteredRow[label] = value; }); return filteredRow; }); @@ -5010,8 +5027,15 @@ export class ButtonActionExecutor { value = row[`${columnName}_name`]; } // 카테고리 타입 필드는 라벨로 변환 (백엔드에서 정의된 컬럼만) - else if (categoryMap[columnName] && typeof value === "string" && categoryMap[columnName][value]) { - value = categoryMap[columnName][value]; + else if (categoryMap[columnName] && typeof value === "string") { + // 쉼표로 구분된 다중 값 처리 + if (value.includes(",")) { + const values = value.split(",").map((v) => v.trim()).filter((v) => v); + const labels = values.map((v) => categoryMap[columnName][v] || v); + value = labels.join(", "); + } else if (categoryMap[columnName][value]) { + value = categoryMap[columnName][value]; + } } filteredRow[label] = value; diff --git a/frontend/lib/utils/excelExport.ts b/frontend/lib/utils/excelExport.ts index 52c22f5a..6bd97624 100644 --- a/frontend/lib/utils/excelExport.ts +++ b/frontend/lib/utils/excelExport.ts @@ -116,8 +116,10 @@ export async function importFromExcel( return; } - // JSON으로 변환 - const jsonData = XLSX.utils.sheet_to_json(worksheet); + // JSON으로 변환 (빈 셀도 포함하여 모든 컬럼 키 유지) + const jsonData = XLSX.utils.sheet_to_json(worksheet, { + defval: "", // 빈 셀에 빈 문자열 할당 + }); console.log("✅ 엑셀 가져오기 완료:", { sheetName: targetSheetName, -- 2.43.0 From 6a0aa87d3b7c6eeb356ae63453ecdbaf0c00c1a1 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Wed, 21 Jan 2026 09:25:51 +0900 Subject: [PATCH 2/2] Merge branch 'main' of http://39.117.244.52:3000/kjs/ERP-node into lhj -- 2.43.0