diff options
Diffstat (limited to 'lib/soap/ecc/mapper/rfq-and-pr-mapper.ts')
| -rw-r--r-- | lib/soap/ecc/mapper/rfq-and-pr-mapper.ts | 41 |
1 files changed, 4 insertions, 37 deletions
diff --git a/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts b/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts index 7d1c2ab8..8748e244 100644 --- a/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts +++ b/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts @@ -14,14 +14,12 @@ import { PR_INFORMATION_T_BID_HEADER, PR_INFORMATION_T_BID_ITEM, } from '@/db/schema/ECC/ecc'; -import { eq, inArray, max, sql } from 'drizzle-orm'; +import { eq, max } from 'drizzle-orm'; import { findUserInfoByEKGRP, findProjectInfoByPSPID, findMaterialNameByMATNR, parseSAPDateTime, - type UserInfo, - type ProjectInfo, } from './common-mapper-utils'; // ECC 데이터 타입 정의 @@ -309,26 +307,10 @@ export async function mapAndSaveECCRfqDataToRfqLast( const rfqRecords = rfqGroups.map((g) => g.rfqData); - // 3) RFQ 다건 삽입 (중복은 무시). 반환된 레코드로 일부 ID 매핑 - // ANFNR 기반으로 중복 방지 (ECC에서 오는 실제 비즈니스 키) + // 3) RFQ 다건 삽입 const inserted = await tx .insert(rfqsLast) .values(rfqRecords) - .onConflictDoUpdate({ - target: rfqsLast.ANFNR, - set: { - updatedAt: new Date(), - // ANFNR이 같으면 기존 데이터를 업데이트 - projectId: sql`EXCLUDED."project_id"`, - series: sql`EXCLUDED."series"`, - itemCode: sql`EXCLUDED."item_code"`, - itemName: sql`EXCLUDED."item_name"`, - picCode: sql`EXCLUDED."pic_code"`, - pic: sql`EXCLUDED."pic"`, - prNumber: sql`EXCLUDED."pr_number"`, - prIssueDate: sql`EXCLUDED."pr_issue_date"`, - } - }) .returning({ id: rfqsLast.id, rfqCode: rfqsLast.rfqCode }); const rfqCodeToId = new Map<string, number>(); @@ -338,22 +320,7 @@ export async function mapAndSaveECCRfqDataToRfqLast( } } - // 4) 모든 RFQ 코드에 대한 ID 매핑 보완 (업데이트된 경우 포함) - const allCodes = rfqRecords - .map((r) => r.rfqCode) - .filter((c): c is string => typeof c === 'string' && c.length > 0); - const missingCodes = allCodes.filter((c) => !rfqCodeToId.has(c)); - if (missingCodes.length > 0) { - const existing = await tx - .select({ id: rfqsLast.id, rfqCode: rfqsLast.rfqCode }) - .from(rfqsLast) - .where(inArray(rfqsLast.rfqCode, missingCodes)); - for (const row of existing) { - if (row.rfqCode) { - rfqCodeToId.set(row.rfqCode, row.id); - } - } - } + // 4) 모든 새로 삽입된 레코드의 ID 매핑은 이미 완료됨 // 5) 모든 아이템을 한 번에 생성할 데이터로 변환 const allItemsToInsert: RfqPrItemData[] = []; @@ -372,7 +339,7 @@ export async function mapAndSaveECCRfqDataToRfqLast( } } - // 6) 아이템 일괄 삽입 (chunk 처리로 파라미터 제한 회피) + // 5) 아이템 일괄 삽입 (chunk 처리로 파라미터 제한 회피) const ITEM_CHUNK_SIZE = 1000; for (let i = 0; i < allItemsToInsert.length; i += ITEM_CHUNK_SIZE) { const chunk = allItemsToInsert.slice(i, i + ITEM_CHUNK_SIZE); |
