[st] - fix: 2-3 컬럼 로직 수정, 입력단 excel 업로드 시 행정동코드 매핑 검사

This commit is contained in:
2026-07-07 17:01:36 +09:00
parent e3a9851de6
commit d25f9f3a01
17 changed files with 298 additions and 16 deletions
+37 -4
View File
@@ -24,8 +24,11 @@ import type {
import { getComputedValueCallback } from "@/components/util/grid/computedFieldCallbacks";
import {
buildExcelExportFileBaseName,
getExcelImportColumnFieldNames,
getNonEditableColumnFieldNames,
hasAdmdstCdColumn,
isExcelImportAdmdstCdInvalid,
mergeExcelImportWithExistingRows,
prepareGridColumnsForExcelExport,
restoreGridColumnsAfterExcelExport,
@@ -728,8 +731,10 @@ const DataGrid = ({
columnInfo,
rowStartNum,
excelExportFileSuffix,
excelExportSearchContext,
isExcelImport = true,
excelImportSkipNonEditable = true,
excelImportSewerBzmnCd,
isExcelExport = true,
fixedColumns,
showHeaderCheckbox = false,
@@ -951,9 +956,11 @@ useEffect(() => {
? prepareGridColumnsForExcelExport(gridView, columns)
: undefined;
const exportBaseName = excelExportFileSuffix
? `${menuName}_${excelExportFileSuffix}`
: menuName;
const exportBaseName = buildExcelExportFileBaseName(
menuName,
excelExportFileSuffix,
excelExportSearchContext,
);
gridView.exportGrid({
type: "excel",
@@ -1075,11 +1082,18 @@ useEffect(() => {
columnLayout,
{ skipNonEditable: excelImportSkipNonEditable },
);
const excelColumnFieldNamesAll = getExcelImportColumnFieldNames(
columns,
columnLayout,
{ skipNonEditable: false },
);
// 데이터 행 읽기
const dataRows: Record<string, string | number>[] = [];
const admdstCdFromExcel: Array<string | number | undefined> = [];
for (let row = dataStartRow; row <= range.e.r; row++) {
const rowData: Record<string, string | number> = {};
let rowAdmdstCd: string | number | undefined;
let hasData = false;
for (
@@ -1093,7 +1107,7 @@ useEffect(() => {
XLSX.utils.encode_cell({ r: row, c: col })
];
const fieldName = excelColumnFieldNames[colIndex];
if (!fieldName) continue;
const allFieldName = excelColumnFieldNamesAll[colIndex];
let cellValue: string | number = "";
if (
@@ -1125,6 +1139,12 @@ useEffect(() => {
}
}
if (allFieldName === "admdstCd" && cellValue !== "") {
rowAdmdstCd = cellValue;
}
if (!fieldName) continue;
if (
cellValue !== "" &&
cellValue !== null &&
@@ -1139,8 +1159,21 @@ useEffect(() => {
// 데이터가 하나라도 있는 행만 추가
if (hasData) {
dataRows.push(rowData);
admdstCdFromExcel.push(rowAdmdstCd);
}
}
if (
excelImportSewerBzmnCd &&
hasAdmdstCdColumn(columns) &&
isExcelImportAdmdstCdInvalid(
excelImportSewerBzmnCd,
admdstCdFromExcel,
)
) {
alert("조회 대상과 업로드한 엑셀 데이터의 행정동 코드가 일치 하지 않습니다.");
return;
}
const preserveFieldNames = excelImportSkipNonEditable
? getNonEditableColumnFieldNames(columns, columnLayout)
: [];
+41 -4
View File
@@ -35,8 +35,11 @@ import SplitDataGrid from "./SplitDataGrid";
import { getComputedValueCallback } from "@/components/util/grid/computedFieldCallbacks"
import {
buildExcelExportFileBaseName,
getExcelImportColumnFieldNames,
getNonEditableColumnFieldNames,
hasAdmdstCdColumn,
isExcelImportAdmdstCdInvalid,
mergeExcelImportWithExistingRows,
prepareGridColumnsForExcelExport,
restoreGridColumnsAfterExcelExport,
@@ -280,6 +283,8 @@ const TabDataGrid = ({
columnInfo,
isExcelImport = true,
excelImportSkipNonEditable = true,
excelImportSewerBzmnCd,
excelExportSearchContext,
isExcelExport = true,
rows = [],
showHeaderCheckbox = false,
@@ -455,10 +460,16 @@ const TabDataGrid = ({
? prepareGridColumnsForExcelExport(gridView, columns)
: undefined;
const exportBaseName = buildExcelExportFileBaseName(
menuName,
tabLabel,
excelExportSearchContext,
);
gridView.exportGrid({
type: 'excel',
target: 'local',
fileName: `${menuName}_${tabLabel}.xlsx`,
fileName: `${exportBaseName}.xlsx`,
footer: 'hidden',
allColumns: !useExcelColumnVisibilityPrep,
done: () => {
@@ -557,18 +568,25 @@ const TabDataGrid = ({
columnLayout,
{ skipNonEditable: excelImportSkipNonEditable },
);
const excelColumnFieldNamesAll = getExcelImportColumnFieldNames(
columns,
columnLayout,
{ skipNonEditable: false },
);
// 데이터 행 읽기
const dataRows: Record<string, string | number>[] = [];
const admdstCdFromExcel: Array<string | number | undefined> = [];
for (let row = dataStartRow; row <= range.e.r; row++) {
const rowData: Record<string, string | number> = {};
let rowAdmdstCd: string | number | undefined;
let hasData = false;
for (let colIndex = 0; colIndex < headers.length; colIndex++) {
const col = range.s.c + colIndex;
const cell = worksheet[XLSX.utils.encode_cell({ r: row, c: col })];
const fieldName = excelColumnFieldNames[colIndex];
if (!fieldName) continue;
const allFieldName = excelColumnFieldNamesAll[colIndex];
let cellValue: string | number = '';
if (cell && cell.v !== undefined && cell.v !== null) {
@@ -587,6 +605,12 @@ const TabDataGrid = ({
}
}
if (allFieldName === 'admdstCd' && cellValue !== '') {
rowAdmdstCd = cellValue;
}
if (!fieldName) continue;
if (cellValue !== '' && cellValue !== null && cellValue !== undefined) {
hasData = true;
}
@@ -597,19 +621,32 @@ const TabDataGrid = ({
// 데이터가 하나라도 있는 행만 추가
if (hasData) {
dataRows.push(rowData);
admdstCdFromExcel.push(rowAdmdstCd);
}
}
if (
excelImportSewerBzmnCd &&
hasAdmdstCdColumn(columns) &&
isExcelImportAdmdstCdInvalid(
excelImportSewerBzmnCd,
admdstCdFromExcel,
)
) {
alert('조회 대상과 행정동 코드가 일치 하지 않습니다.');
return;
}
const preserveFieldNames = excelImportSkipNonEditable
? getNonEditableColumnFieldNames(columns, columnLayout)
: [];
setRowDataMap(prev => {
const newMap = new Map(prev);
const existingRows = prev.get(tabKey) ?? [];
const prevRows = prev.get(tabKey) ?? [];
newMap.set(
tabKey,
mergeExcelImportWithExistingRows(existingRows, dataRows, {
mergeExcelImportWithExistingRows(prevRows, dataRows, {
preserveFieldNames,
}),
);