summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART_RETURN/route.ts42
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');
});