|
|
|
@@ -39,6 +39,8 @@ open class SchedulerService( |
|
|
|
@Value("\${scheduler.m18Units.enabled:true}") val m18UnitsSchedulerEnabled: Boolean, |
|
|
|
@Value("\${scheduler.m18Units.incrementalLookbackDays:7}") val m18UnitsIncrementalLookbackDays: Int, |
|
|
|
@Value("\${scheduler.inventoryLotExpiry.enabled:true}") val inventoryLotExpiryEnabled: Boolean, |
|
|
|
/** When false (default), M18 PO / DO1 / DO2 / master-data cron jobs are not registered — use true in production only. */ |
|
|
|
@Value("\${scheduler.m18Sync.enabled:false}") val m18SyncEnabled: Boolean, |
|
|
|
val settingsService: SettingsService, |
|
|
|
/** |
|
|
|
* Lookback window for GRN code sync: rows with `created` from **start of (today − N days)** through **now**, |
|
|
|
@@ -63,6 +65,8 @@ open class SchedulerService( |
|
|
|
var scheduledM18Po: ScheduledFuture<*>? = null |
|
|
|
|
|
|
|
var scheduledM18Do1: ScheduledFuture<*>? = null |
|
|
|
/** Saturday DO1 run (same [getM18Dos1] as [scheduledM18Do1]). */ |
|
|
|
var scheduledM18Do1Sat: ScheduledFuture<*>? = null |
|
|
|
var scheduledM18Do2: ScheduledFuture<*>? = null |
|
|
|
|
|
|
|
@Volatile |
|
|
|
@@ -110,6 +114,49 @@ open class SchedulerService( |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Same second/minute/hour as [cronExpression] but only Mon–Fri and Sun (Saturday uses [SCHEDULE_M18_DO1_SAT]). |
|
|
|
* Expects a 6-field cron. |
|
|
|
*/ |
|
|
|
private fun cronToMonFriSunSchedule(cronExpression: String): String { |
|
|
|
val parts = cronExpression.trim().split(Regex("\\s+")) |
|
|
|
if (parts.size != 6) { |
|
|
|
return cronExpression |
|
|
|
} |
|
|
|
return "${parts[0]} ${parts[1]} ${parts[2]} ? * MON-FRI,SUN" |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* M18 DO1: [SCHEDULE_M18_DO1] applies Mon–Fri & Sun; [SCHEDULE_M18_DO1_SAT] is Saturday only (default 03:10). |
|
|
|
*/ |
|
|
|
fun scheduleM18Do1() { |
|
|
|
scheduledM18Do1?.cancel(false) |
|
|
|
scheduledM18Do1Sat?.cancel(false) |
|
|
|
if (!m18SyncEnabled) { |
|
|
|
scheduledM18Do1 = null |
|
|
|
scheduledM18Do1Sat = null |
|
|
|
logger.info("M18 DO1 schedulers disabled (scheduler.m18Sync.enabled=false)") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
var cronMain = settingsService.findByName(SettingNames.SCHEDULE_M18_DO1).getOrNull()?.value ?: "0 10 19 * * *" |
|
|
|
if (!isValidCronExpression(cronMain)) { |
|
|
|
cronMain = "0 10 19 * * *" |
|
|
|
} |
|
|
|
val weekdaySunCron = cronToMonFriSunSchedule(cronMain) |
|
|
|
val mainCron = if (isValidCronExpression(weekdaySunCron)) weekdaySunCron else cronMain |
|
|
|
|
|
|
|
scheduledM18Do1 = taskScheduler.schedule({ getM18Dos1() }, CronTrigger(mainCron)) |
|
|
|
|
|
|
|
var cronSat = settingsService.findByName(SettingNames.SCHEDULE_M18_DO1_SAT).getOrNull()?.value ?: "0 10 3 ? * SAT" |
|
|
|
if (!isValidCronExpression(cronSat)) { |
|
|
|
cronSat = "0 10 3 ? * SAT" |
|
|
|
} |
|
|
|
scheduledM18Do1Sat = taskScheduler.schedule({ getM18Dos1() }, CronTrigger(cronSat)) |
|
|
|
|
|
|
|
logger.info("Scheduled M18 DO1: Mon-Fri,Sun -> {} | Saturday -> {}", mainCron, cronSat) |
|
|
|
} |
|
|
|
|
|
|
|
// Init Scheduler |
|
|
|
@PostConstruct |
|
|
|
fun init() { |
|
|
|
@@ -142,19 +189,33 @@ open class SchedulerService( |
|
|
|
} |
|
|
|
|
|
|
|
fun scheduleM18Po() { |
|
|
|
commonSchedule(scheduledM18Po, SettingNames.SCHEDULE_M18_PO, ::getM18Po) |
|
|
|
} |
|
|
|
|
|
|
|
fun scheduleM18Do1() { |
|
|
|
commonSchedule(scheduledM18Do1, SettingNames.SCHEDULE_M18_DO1, ::getM18Dos1) |
|
|
|
if (!m18SyncEnabled) { |
|
|
|
scheduledM18Po?.cancel(false) |
|
|
|
scheduledM18Po = null |
|
|
|
logger.info("M18 PO scheduler disabled (scheduler.m18Sync.enabled=false)") |
|
|
|
return |
|
|
|
} |
|
|
|
scheduledM18Po = commonSchedule(scheduledM18Po, SettingNames.SCHEDULE_M18_PO, ::getM18Po) |
|
|
|
} |
|
|
|
|
|
|
|
fun scheduleM18Do2() { |
|
|
|
commonSchedule(scheduledM18Do2, SettingNames.SCHEDULE_M18_DO2, ::getM18Dos2) |
|
|
|
if (!m18SyncEnabled) { |
|
|
|
scheduledM18Do2?.cancel(false) |
|
|
|
scheduledM18Do2 = null |
|
|
|
logger.info("M18 DO2 scheduler disabled (scheduler.m18Sync.enabled=false)") |
|
|
|
return |
|
|
|
} |
|
|
|
scheduledM18Do2 = commonSchedule(scheduledM18Do2, SettingNames.SCHEDULE_M18_DO2, ::getM18Dos2) |
|
|
|
} |
|
|
|
|
|
|
|
fun scheduleM18MasterData() { |
|
|
|
commonSchedule(scheduledM18Master, SettingNames.SCHEDULE_M18_MASTER, ::getM18MasterData) |
|
|
|
if (!m18SyncEnabled) { |
|
|
|
scheduledM18Master?.cancel(false) |
|
|
|
scheduledM18Master = null |
|
|
|
logger.info("M18 master-data scheduler disabled (scheduler.m18Sync.enabled=false)") |
|
|
|
return |
|
|
|
} |
|
|
|
scheduledM18Master = commonSchedule(scheduledM18Master, SettingNames.SCHEDULE_M18_MASTER, ::getM18MasterData) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
|