diff options
| author | joonhoekim <26rote@gmail.com> | 2025-07-28 01:24:00 +0000 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-07-28 01:24:00 +0000 |
| commit | 563af36718e25d6ad6b72d3f89d571f9093df043 (patch) | |
| tree | ec516cfc3b37ca3451759761f83fe4d51a6a1e71 /lib/knox-sync/master-sync-service.ts | |
| parent | 2650b7c0bb0ea12b68a58c0439f72d61df04b2f1 (diff) | |
(김준회) SPREADJS 키 정리, Knox 동기화 스케줄러 개선
Diffstat (limited to 'lib/knox-sync/master-sync-service.ts')
| -rw-r--r-- | lib/knox-sync/master-sync-service.ts | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/knox-sync/master-sync-service.ts b/lib/knox-sync/master-sync-service.ts new file mode 100644 index 00000000..5cabe9ed --- /dev/null +++ b/lib/knox-sync/master-sync-service.ts @@ -0,0 +1,72 @@ +'use server'; + +import * as cron from 'node-cron'; +import { syncKnoxTitles } from './title-sync-service'; +import { syncKnoxOrganizations } from './organization-sync-service'; +import { syncKnoxEmployees } from './employee-sync-service'; +import { + checkTimeRestriction, + logSchedulerInfo, +} from './common'; + +// 통합 CRON 스케줄 (기본: 매일 04:00) +const CRON_STRING = process.env.KNOX_MASTER_SYNC_CRON || '0 4 * * *'; + +// 애플리케이션 기동 시 최초 한 번 실행 여부 +const DO_FIRST_RUN = process.env.KNOX_MASTER_SYNC_FIRST_RUN === 'true'; + +/** + * Knox 동기화 마스터 함수 - 직급 → 조직 → 임직원 순차 실행 + */ +export async function syncAllKnoxData(): Promise<void> { + console.log('[KNOX-SYNC] 🚀 Knox 통합 동기화 시작 (순차 실행)'); + const overallStartTime = Date.now(); + + try { + // 1단계: 직급 동기화 + console.log('[KNOX-SYNC] 1/3: 직급 동기화 시작'); + await syncKnoxTitles(); + console.log('[KNOX-SYNC] 1/3: 직급 동기화 완료 ✅'); + + // 2단계: 조직 동기화 (직급 완료 후) + console.log('[KNOX-SYNC] 2/3: 조직 동기화 시작'); + await syncKnoxOrganizations(); + console.log('[KNOX-SYNC] 2/3: 조직 동기화 완료 ✅'); + + // 3단계: 임직원 동기화 (조직 완료 후) + console.log('[KNOX-SYNC] 3/3: 임직원 동기화 시작'); + await syncKnoxEmployees(); + console.log('[KNOX-SYNC] 3/3: 임직원 동기화 완료 ✅'); + + const overallDuration = Math.round((Date.now() - overallStartTime) / 1000); + console.log(`[KNOX-SYNC] 🎉 Knox 통합 동기화 완료 - 총 ${overallDuration}초 소요`); + + } catch (error) { + console.error('[KNOX-SYNC] ❌ Knox 통합 동기화 중 오류 발생:', error); + throw error; + } +} + +/** + * Knox 마스터 동기화 스케줄러 시작 + */ +export async function startKnoxMasterSyncScheduler() { + // 환경 변수에 따라 실행시 즉시 실행 여부 결정 + if (DO_FIRST_RUN) { + if (!checkTimeRestriction()) { + return; + } + + console.log('[KNOX-SYNC] 첫 실행: Knox 통합 동기화 즉시 시작'); + syncAllKnoxData().catch(console.error); + } + + // 통합 CRON JOB 등록 (기존 개별 스케줄 대신) + cron.schedule(CRON_STRING, () => { + console.log('[KNOX-SYNC] CRON 실행: Knox 통합 동기화 시작'); + syncAllKnoxData().catch(console.error); + }); + + logSchedulerInfo('통합(직급→조직→임직원)', CRON_STRING); + console.log('[KNOX-SYNC] 💡 순차 실행으로 의존성 문제 해결 (직급 완료 → 조직 완료 → 임직원 완료)'); +}
\ No newline at end of file |
