diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART_RETURN/route.ts | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART_RETURN/route.ts b/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART_RETURN/route.ts index e2c97b2e..7b1b85e8 100644 --- a/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART_RETURN/route.ts +++ b/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART_RETURN/route.ts @@ -95,23 +95,30 @@ export async function POST(request: NextRequest) { } // XML 데이터를 DB 삽입 가능한 형태로 변환 +/** + * MATERIAL_MASTER_PART_RETURN 데이터 변환 함수 + * + * 데이터 처리 아키텍처: + * 1. 단일 테이블 (MATERIAL_MASTER_PART_RETURN_CMCTB_MAT_BSE) + * - MAT_CD가 unique 필드로 충돌 시 upsert 처리 + * + * XML 패턴: + * - MATERIAL_MASTER_PART_RETURN 인터페이스는 XML에 MAT_CD가 이미 포함된 패턴 + * + * @param materialData XML에서 파싱된 MATERIAL 데이터 + * @returns 처리된 MATERIAL 데이터 구조 + */ function transformMaterialData(materialData: CMCTBMatBseXML[]): ProcessedMaterialData[] { if (!materialData || !Array.isArray(materialData)) { return []; } return materialData.map(material => { - // 메인 Material 데이터 변환 + // 1단계: CMCTB_MAT_BSE (루트 - unique 필드: MAT_CD) const materialConverted = convertXMLToDBData<CMCTBMatBseData>( - material as Record<string, string | undefined>, - ['MAT_CD'] + material as Record<string, string | undefined> ); - // 필수 필드 보정 - if (!materialConverted.MAT_CD) { - materialConverted.MAT_CD = ''; - } - return { materialData: materialConverted }; @@ -119,21 +126,30 @@ function transformMaterialData(materialData: CMCTBMatBseXML[]): ProcessedMateria } // 데이터베이스 저장 함수 +/** + * 처리된 MATERIAL_MASTER_PART_RETURN 데이터를 데이터베이스에 저장 + * + * 저장 전략: + * 1. 단일 테이블: MAT_CD 기준 upsert (충돌 시 업데이트) + * - 송신 XML이 전체 데이터셋을 포함하므로 부분 업데이트 불필요 + * - 데이터 일관성과 단순성 확보 + * + * @param processedMaterials 변환된 MATERIAL 데이터 배열 + */ async function saveToDatabase(processedMaterials: ProcessedMaterialData[]) { console.log(`데이터베이스(배치) 저장 시작: ${processedMaterials.length}개 자재 데이터`); try { await db.transaction(async (tx) => { - // 1) 부모 테이블 데이터 준비 + // 1) 테이블 데이터 준비 const materialRows = processedMaterials .map((m) => m.materialData) .filter((m): m is CMCTBMatBseData => !!m.MAT_CD); - const matcds = materialRows.map((m) => m.MAT_CD as string); - - // 2) 하위 테이블 데이터 평탄화 (하위 테이블 없음) + // 하위테이블이 없으므로 FK 역할을 할 컬럼 정의 불필요 + // const matcds = materialRows.map((m) => m.MAT_CD as string); - // 3) 부모 테이블 UPSERT (배치) + // 2) 테이블 UPSERT (배치) await bulkUpsert(tx, MATERIAL_MASTER_PART_RETURN_CMCTB_MAT_BSE, materialRows, 'MAT_CD'); }); |
