summaryrefslogtreecommitdiff
path: root/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts
diff options
context:
space:
mode:
Diffstat (limited to 'app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts')
-rw-r--r--app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts94
1 files changed, 44 insertions, 50 deletions
diff --git a/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts b/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts
index 5d407e1f..ffb39895 100644
--- a/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts
+++ b/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_DEPARTMENT_CODE/route.ts
@@ -116,47 +116,52 @@ export async function POST(request: NextRequest) {
}
// XML 데이터를 DB 삽입 가능한 형태로 변환
+/**
+ * DEPARTMENT 코드 데이터 변환 함수
+ *
+ * 데이터 처리 아키텍처:
+ * 1. 최상위 테이블 (DEPARTMENT_CODE_CMCTB_DEPT_MDG)
+ * - DEPTCD가 unique 필드로 충돌 시 upsert 처리
+ *
+ * 2. 하위 테이블들 (DEPTNM, COMPNM, CORPNM)
+ * - FK(DEPTCD)로 연결
+ * - 별도 필수 필드 없음 (스키마에서 notNull() 제거 예정)
+ * - 전체 데이터셋 기반 삭제 후 재삽입 처리
+ *
+ * @param deptData XML에서 파싱된 DEPARTMENT 데이터
+ * @returns 처리된 DEPARTMENT 데이터 구조
+ */
function transformDepartmentData(deptData: DeptXML[]): ProcessedDepartmentData[] {
if (!deptData || !Array.isArray(deptData)) {
return [];
}
return deptData.map(dept => {
- // 메인 Department 데이터 변환
+ const deptcdKey = dept.DEPTCD || '';
+ const fkData = { DEPTCD: deptcdKey };
+
+ // 1단계: DEPT (루트 - unique 필드: DEPTCD)
const deptRecord = convertXMLToDBData<DeptData>(
- dept as Record<string, string | undefined>,
- ['DEPTCD', 'CORPCD']
+ dept as Record<string, string | undefined>,
+ fkData
);
- // 필수 필드 보정
- if (!deptRecord.DEPTCD) {
- deptRecord.DEPTCD = '';
- }
- if (!deptRecord.CORPCD) {
- deptRecord.CORPCD = '';
- }
-
- // FK 데이터 준비
- const fkData = { DEPTCD: dept.DEPTCD || '' };
-
- // DEPTNM 데이터 변환
+ // 2단계: 하위 테이블들 (FK: DEPTCD)
const deptnms = processNestedArray(
dept.DEPTNM,
- (deptnm) => convertXMLToDBData<DeptnmData>(deptnm, ['SPRAS'], fkData),
+ (deptnm) => convertXMLToDBData<DeptnmData>(deptnm as Record<string, string | undefined>, fkData),
fkData
);
- // COMPNM 데이터 변환
const compnms = processNestedArray(
dept.COMPNM,
- (compnm) => convertXMLToDBData<CompnmData>(compnm, ['SPRAS'], fkData),
+ (compnm) => convertXMLToDBData<CompnmData>(compnm as Record<string, string | undefined>, fkData),
fkData
);
- // CORPNM 데이터 변환
const corpnms = processNestedArray(
dept.CORPNM,
- (corpnm) => convertXMLToDBData<CorpnmData>(corpnm, ['SPRAS'], fkData),
+ (corpnm) => convertXMLToDBData<CorpnmData>(corpnm as Record<string, string | undefined>, fkData),
fkData
);
@@ -170,8 +175,19 @@ function transformDepartmentData(deptData: DeptXML[]): ProcessedDepartmentData[]
}
// 데이터베이스 저장 함수
+/**
+ * 처리된 DEPARTMENT 데이터를 데이터베이스에 저장
+ *
+ * 저장 전략:
+ * 1. 최상위 테이블: DEPTCD 기준 upsert (충돌 시 업데이트)
+ * 2. 하위 테이블들: FK(DEPTCD) 기준 전체 삭제 후 재삽입
+ * - 송신 XML이 전체 데이터셋을 포함하므로 부분 업데이트 불필요
+ * - 데이터 일관성과 단순성 확보
+ *
+ * @param processedDepts 변환된 DEPARTMENT 데이터 배열
+ */
async function saveToDatabase(processedDepts: ProcessedDepartmentData[]) {
- console.log(`데이터베이스 저장 함수가 호출됨. ${processedDepts.length}개의 부서 데이터 수신.`);
+ console.log(`데이터베이스 저장 시작: ${processedDepts.length}개 부서 데이터`);
try {
await db.transaction(async (tx) => {
@@ -183,7 +199,7 @@ async function saveToDatabase(processedDepts: ProcessedDepartmentData[]) {
continue;
}
- // 1. Department 테이블 Upsert (최상위 테이블)
+ // 1. Department 테이블 Upsert (최상위 테이블 - unique 필드: DEPTCD)
await tx.insert(DEPARTMENT_CODE_CMCTB_DEPT_MDG)
.values(dept)
.onConflictDoUpdate({
@@ -194,39 +210,17 @@ async function saveToDatabase(processedDepts: ProcessedDepartmentData[]) {
}
});
- // 2. 하위 테이블 데이터 처리 - FK 기준으로 전체 삭제 후 재삽입
+ // 2. 하위 테이블들 처리 - FK(DEPTCD) 기준 전체 삭제 후 재삽입
+ // 전체 데이터셋 기반 처리로 데이터 일관성 확보
await Promise.all([
- // DEPTNM 테이블 처리
- replaceSubTableData(
- tx,
- DEPARTMENT_CODE_CMCTB_DEPT_MDG_DEPTNM,
- deptnms,
- 'DEPTCD',
- dept.DEPTCD
- ),
-
- // COMPNM 테이블 처리
- replaceSubTableData(
- tx,
- DEPARTMENT_CODE_CMCTB_DEPT_MDG_COMPNM,
- compnms,
- 'DEPTCD',
- dept.DEPTCD
- ),
-
- // CORPNM 테이블 처리
- replaceSubTableData(
- tx,
- DEPARTMENT_CODE_CMCTB_DEPT_MDG_CORPNM,
- corpnms,
- 'DEPTCD',
- dept.DEPTCD
- )
+ replaceSubTableData(tx, DEPARTMENT_CODE_CMCTB_DEPT_MDG_DEPTNM, deptnms, 'DEPTCD', dept.DEPTCD),
+ replaceSubTableData(tx, DEPARTMENT_CODE_CMCTB_DEPT_MDG_COMPNM, compnms, 'DEPTCD', dept.DEPTCD),
+ replaceSubTableData(tx, DEPARTMENT_CODE_CMCTB_DEPT_MDG_CORPNM, corpnms, 'DEPTCD', dept.DEPTCD)
]);
}
});
- console.log(`${processedDepts.length}개의 부서 데이터 처리 완료.`);
+ console.log(`데이터베이스 저장 완료: ${processedDepts.length}개 부서`);
return true;
} catch (error) {
console.error('데이터베이스 저장 중 오류 발생:', error);