diff options
| author | joonhoekim <26rote@gmail.com> | 2025-08-18 01:06:37 +0000 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-08-18 01:06:37 +0000 |
| commit | b36330c94400f39ec9baed64b82a73bae58edbf2 (patch) | |
| tree | eea344d39b3101289ed4f6b74e0c98b6b33ef460 /lib/shi-api | |
| parent | 5adc1df95f80fbec7a0b5bbee15448b10d5aec3a (diff) | |
(김준회) 파일업로드시 바이너리검증부 주석처리, knex webpack 한계로 인한 빌드 로그 경고 무시, 환경변수 오류 처리, 벤더 로그인 폼 사업자번호를 000 으로 수정, 유저 phone number 사이즈 늘림, 도커 DB 예시 추가
Diffstat (limited to 'lib/shi-api')
| -rw-r--r-- | lib/shi-api/shi-api-utils.ts | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/lib/shi-api/shi-api-utils.ts b/lib/shi-api/shi-api-utils.ts index 280a2fcb..3906883a 100644 --- a/lib/shi-api/shi-api-utils.ts +++ b/lib/shi-api/shi-api-utils.ts @@ -65,8 +65,8 @@ export const getAllNonsapUser = async () => { name: u.USR_NM || undefined, email: u.EMAIL_ADR || undefined, epId: u.MYSNG_ID || undefined, - deptCode: u.CH_DEPTCD || undefined, - deptName: u.CH_DEPTNM || undefined, + deptCode: u.DEPTCD || undefined, + deptName: u.DEPTNM || undefined, phone: u.TELNO || undefined, isAbsent, isDeletedOnNonSap: isDeleted, @@ -80,27 +80,49 @@ export const getAllNonsapUser = async () => { const mappedUsers = mappedRaw as InsertUser[]; if (mappedUsers.length > 0) { - await db.insert(users) - .values(mappedUsers) - .onConflictDoUpdate({ - target: users.nonsapUserId, - set: { - name: users.name, - employeeNumber: users.employeeNumber, - knoxId: users.knoxId, - epId: users.epId, - deptCode: users.deptCode, - deptName: users.deptName, - phone: users.phone, - nonsapUserId: users.nonsapUserId, - isAbsent: users.isAbsent, - isDeletedOnNonSap: users.isDeletedOnNonSap, - isActive: users.isActive, - isRegularEmployee: users.isRegularEmployee, - updatedAt: sql`now()`, - }, - }); - debugSuccess(`[UPSERT] users upserted=${mappedUsers.length} using key=nonsapUserId`); + // 배치 처리: 500개씩 분할하여 처리 (콜스택 크기 문제 대응) + const BATCH_SIZE = 500; + let totalUpserted = 0; + + for (let i = 0; i < mappedUsers.length; i += BATCH_SIZE) { + const batch = mappedUsers.slice(i, i + BATCH_SIZE); + + try { + await db.insert(users) + .values(batch) + .onConflictDoUpdate({ + target: users.nonsapUserId, + set: { + name: users.name, + employeeNumber: users.employeeNumber, + knoxId: users.knoxId, + epId: users.epId, + deptCode: users.deptCode, + deptName: users.deptName, + phone: users.phone, + nonsapUserId: users.nonsapUserId, + isAbsent: users.isAbsent, + isDeletedOnNonSap: users.isDeletedOnNonSap, + isActive: users.isActive, + isRegularEmployee: users.isRegularEmployee, + updatedAt: sql`now()`, + }, + }); + + totalUpserted += batch.length; + debugLog(`[BATCH ${Math.floor(i/BATCH_SIZE) + 1}] Processed ${batch.length} users (${totalUpserted}/${mappedUsers.length})`); + + // 배치 간 잠시 대기하여 시스템 부하 방지 + if (i + BATCH_SIZE < mappedUsers.length) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + } catch (batchError) { + debugError(`[BATCH ${Math.floor(i/BATCH_SIZE) + 1}] Failed to process batch ${i}-${i+batch.length}`, batchError); + throw batchError; + } + } + + debugSuccess(`[UPSERT] users upserted=${totalUpserted} using key=nonsapUserId (processed in ${Math.ceil(mappedUsers.length/BATCH_SIZE)} batches)`); } else { debugWarn('[UPSERT] No users mapped for upsert (missing name/email or invalid USR_ID)'); } |
