summaryrefslogtreecommitdiff
path: root/lib/material-groups/sync-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/material-groups/sync-service.ts')
-rw-r--r--lib/material-groups/sync-service.ts89
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
};
});