diff options
Diffstat (limited to 'lib/material-groups/sync-service.ts')
| -rw-r--r-- | lib/material-groups/sync-service.ts | 89 |
1 files changed, 51 insertions, 38 deletions
diff --git a/lib/material-groups/sync-service.ts b/lib/material-groups/sync-service.ts index eda5dba5..9bcdd8bf 100644 --- a/lib/material-groups/sync-service.ts +++ b/lib/material-groups/sync-service.ts @@ -32,44 +32,58 @@ export async function syncMaterialGroupMaster(): Promise<SyncResult> { console.log("๐ ์์ฌ๊ทธ๋ฃน ๋ง์คํฐ ๋๊ธฐํ ์์..."); const result = await db.transaction(async (tx) => { - // 1๋จ๊ณ: ๊ธฐ์กด MDG ํ
์ด๋ธ์์ MATKL๋ณ ์์ด ์ค๋ช
์กฐํ + // 1๋จ๊ณ: MATKL๋ณ๋ก ์ฒซ ๋ฒ์งธ MATNR ์ ํ (DISTINCT ON ์ฌ์ฉ) + const matklWithMatnr = await tx.execute(sql` + SELECT DISTINCT ON (${MATERIAL_MASTER_PART_MATL.MATKL}) + ${MATERIAL_MASTER_PART_MATL.MATKL} as "MATKL", + ${MATERIAL_MASTER_PART_MATL.MATNR} as "MATNR" + FROM ${MATERIAL_MASTER_PART_MATL} + WHERE ${MATERIAL_MASTER_PART_MATL.MATKL} IS NOT NULL + AND ${MATERIAL_MASTER_PART_MATL.MATKL} != '' + ORDER BY ${MATERIAL_MASTER_PART_MATL.MATKL}, ${MATERIAL_MASTER_PART_MATL.MATNR} + `); + + console.log(`๐ ๋ฐ๊ฒฌ๋ ๊ณ ์ ์์ฌ๊ทธ๋ฃน์ฝ๋: ${matklWithMatnr.rowCount}๊ฐ`); + + if (matklWithMatnr.rowCount === 0) { + return { + totalProcessed: 0, + newRecords: 0, + updatedRecords: 0, + skippedRecords: 0 + }; + } + + // 2๋จ๊ณ: ์ ํ๋ MATNR๋ค๋ก DESC ํ
์ด๋ธ์์ ์์ด ์ค๋ช
์กฐํ + const matnrList = matklWithMatnr.rows.map(item => item.MATNR as string); + const materialGroupData = await tx .select({ MATKL: MATERIAL_MASTER_PART_MATL.MATKL, - MAKTX: sql<string>` - ( - SELECT ${MATERIAL_MASTER_PART_MATL_DESC.MAKTX} - FROM ${MATERIAL_MASTER_PART_MATL_DESC} - WHERE ${MATERIAL_MASTER_PART_MATL_DESC.MATNR} = ${MATERIAL_MASTER_PART_MATL.MATNR} - AND ${MATERIAL_MASTER_PART_MATL_DESC.SPRAS} = 'E' - AND ${MATERIAL_MASTER_PART_MATL_DESC.MAKTX} IS NOT NULL - AND ${MATERIAL_MASTER_PART_MATL_DESC.MAKTX} != '' - LIMIT 1 - ) - `.as("MAKTX") + MAKTX: MATERIAL_MASTER_PART_MATL_DESC.MAKTX }) .from(MATERIAL_MASTER_PART_MATL) + .innerJoin( + MATERIAL_MASTER_PART_MATL_DESC, + sql`${MATERIAL_MASTER_PART_MATL.MATNR} = ${MATERIAL_MASTER_PART_MATL_DESC.MATNR}` + ) .where(sql` - ${MATERIAL_MASTER_PART_MATL.MATKL} IS NOT NULL - AND ${MATERIAL_MASTER_PART_MATL.MATKL} != '' - `) - .groupBy(MATERIAL_MASTER_PART_MATL.MATKL); // MATKL๋ณ ์ค๋ณต ์ ๊ฑฐ - - console.log(`๐ ๋ฐ๊ฒฌ๋ ๊ณ ์ ์์ฌ๊ทธ๋ฃน์ฝ๋: ${materialGroupData.length}๊ฐ`); + ${MATERIAL_MASTER_PART_MATL.MATNR} IN (${sql.join(matnrList.map(matnr => sql`${matnr}`), sql`, `)}) + AND ${MATERIAL_MASTER_PART_MATL_DESC.SPRAS} = 'E' + AND ${MATERIAL_MASTER_PART_MATL_DESC.MAKTX} IS NOT NULL + AND ${MATERIAL_MASTER_PART_MATL_DESC.MAKTX} != '' + `); - // 2๋จ๊ณ: MAKTX๊ฐ ์๋ ๋ ์ฝ๋๋ง ํํฐ๋ง - const validData = materialGroupData.filter(item => - item.MAKTX && item.MAKTX.trim() !== '' - ); + console.log(`โ
์ ํจํ ์์ฌ๊ทธ๋ฃน ๋ฐ์ดํฐ: ${materialGroupData.length}๊ฐ`); - console.log(`โ
์ ํจํ ์์ฌ๊ทธ๋ฃน ๋ฐ์ดํฐ: ${validData.length}๊ฐ`); + const validData = materialGroupData; if (validData.length === 0) { return { totalProcessed: 0, newRecords: 0, updatedRecords: 0, - skippedRecords: materialGroupData.length + skippedRecords: matklWithMatnr.rowCount || 0 }; } @@ -80,9 +94,13 @@ export async function syncMaterialGroupMaster(): Promise<SyncResult> { const existingMatkls = new Set(existingRecords.map(r => r.MATKL)); - // 4๋จ๊ณ: ์ ๊ท/์
๋ฐ์ดํธ ๋ฐ์ดํฐ ๋ถ๋ฅ - const newRecords = validData.filter(item => !existingMatkls.has(item.MATKL)); - const updateRecords = validData.filter(item => existingMatkls.has(item.MATKL)); + // 4๋จ๊ณ: ์ ๊ท/์
๋ฐ์ดํธ ๋ฐ์ดํฐ ๋ถ๋ฅ (null ๊ฐ ์ ์ธํ๊ณ ํ์
์์ ํ๊ฒ) + const filteredData = validData.filter((item): item is { MATKL: string; MAKTX: string } => + !!item.MATKL && !!item.MAKTX + ); + + const newRecords = filteredData.filter(item => !existingMatkls.has(item.MATKL)); + const updateRecords = filteredData.filter(item => existingMatkls.has(item.MATKL)); let insertedCount = 0; let updatedCount = 0; @@ -91,12 +109,7 @@ export async function syncMaterialGroupMaster(): Promise<SyncResult> { if (newRecords.length > 0) { await tx .insert(MATERIAL_GROUP_MASTER) - .values( - newRecords.map(item => ({ - MATKL: item.MATKL, - MAKTX: item.MAKTX - })) - ); + .values(newRecords); insertedCount = newRecords.length; console.log(`โ ์ ๊ท ์ฝ์
: ${insertedCount}๊ฐ`); } @@ -105,10 +118,10 @@ export async function syncMaterialGroupMaster(): Promise<SyncResult> { if (updateRecords.length > 0) { // PostgreSQL์ UPDATE ... FROM ๊ตฌ๋ฌธ ์ฌ์ฉ await tx.execute(sql` - UPDATE ${MATERIAL_GROUP_MASTER} + UPDATE mdg."MATERIAL_GROUP_MASTER" SET - ${MATERIAL_GROUP_MASTER.MAKTX} = temp_data.maktx, - ${MATERIAL_GROUP_MASTER.updatedAt} = NOW() + "MAKTX" = temp_data.maktx, + "updated_at" = NOW() FROM ( VALUES ${sql.join( updateRecords.map(item => @@ -117,7 +130,7 @@ export async function syncMaterialGroupMaster(): Promise<SyncResult> { sql`, ` )} ) AS temp_data(matkl, maktx) - WHERE ${MATERIAL_GROUP_MASTER.MATKL} = temp_data.matkl + WHERE "MATKL" = temp_data.matkl `); updatedCount = updateRecords.length; console.log(`๐ ์
๋ฐ์ดํธ: ${updatedCount}๊ฐ`); @@ -127,7 +140,7 @@ export async function syncMaterialGroupMaster(): Promise<SyncResult> { totalProcessed: validData.length, newRecords: insertedCount, updatedRecords: updatedCount, - skippedRecords: materialGroupData.length - validData.length + skippedRecords: (matklWithMatnr.rowCount || 0) - validData.length }; }); |
