diff options
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.ts | 94 |
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); |
