blob: ed77a3fd4c104319449f4604d91f6b7c39b1c2ea (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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);
});
// 직급 정보 기반으로, 각 직급마다 임직원 조회 (Knox API 구조상 제한으로 직급 및 부서마다 조회 가능하며, 직급이 수가 더 적음(600 vs 2400))
logSchedulerInfo('통합(직급→조직→임직원)', CRON_STRING);
}
|