'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 { 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] 💡 순차 실행으로 의존성 문제 해결 (직급 완료 → 조직 완료 → 임직원 완료)'); }