diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18SchedulerService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18SchedulerService.kt index da2b8c1..a73a2a3 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18SchedulerService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18SchedulerService.kt @@ -2,41 +2,75 @@ package com.ffii.fpsms.m18.service import com.ffii.core.utils.JwtTokenUtil import com.ffii.fpsms.m18.web.models.M18CommonRequest -//import jakarta.annotation.PostConstruct +import com.ffii.fpsms.modules.common.SettingNames +import com.ffii.fpsms.modules.settings.service.SettingsService +import jakarta.annotation.PostConstruct import org.slf4j.Logger import org.slf4j.LoggerFactory +import org.springframework.scheduling.TaskScheduler //import org.springframework.scheduling.annotation.Async import org.springframework.scheduling.annotation.Scheduled +import org.springframework.scheduling.support.CronTrigger import org.springframework.stereotype.Service import java.time.LocalDateTime import java.time.format.DateTimeFormatter -//import java.util.concurrent.ScheduledFuture -//import kotlin.concurrent.Volatile +import java.util.concurrent.ScheduledFuture +import kotlin.concurrent.Volatile +import kotlin.jvm.optionals.getOrNull @Service open class M18SchedulerService( val m18PurchaseOrderService: M18PurchaseOrderService, val m18DeliveryOrderService: M18DeliveryOrderService, val m18MasterDataService: M18MasterDataService, + val settingsService: SettingsService, + val taskScheduler: TaskScheduler, ) { var logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) val dataStringFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd") -// @Volatile -// var scheduledM18Po: ScheduledFuture<*>? = null -// -// @PostConstruct -// fun init() { -// -// } -// -// fun scheduleM18PoTask() { -// scheduledM18Po?.cancel(false) -// } + @Volatile + var scheduledM18Po: ScheduledFuture<*>? = null + + fun isValidCronExpression(cronExpression: String): Boolean { + return try { + CronTrigger(cronExpression) + true + } catch (e: IllegalArgumentException) { + false + } + } + @PostConstruct + fun init() { + scheduleM18PoTask() + } + + fun scheduleM18PoTask() { + val defaultCronExpression = "0 0 2 * * *"; + scheduledM18Po?.cancel(false) + + var cron = settingsService.findByName(SettingNames.SCHEDULE_M18_PO).getOrNull()?.value ?: defaultCronExpression; + + if (!isValidCronExpression(cron)) { + cron = defaultCronExpression + } + scheduledM18Po = taskScheduler.schedule( + { +// testTask(); + getM18Pos() + }, + CronTrigger(cron) + ) + println("Cron: $cron") + } + + fun testTask() { + println("Test: ${LocalDateTime.now()}") + } // @Async // @Scheduled(cron = "0 0 2 * * *") // (SS/MM/HH/DD/MM/YY) - @Scheduled(cron = "0 0 2 * * *") // (SS/MM/HH/DD/MM/YY) +// @Scheduled(cron = "0 0 2 * * *") // (SS/MM/HH/DD/MM/YY) open fun getM18Pos() { val currentTime = LocalDateTime.now() val today = currentTime.toLocalDate().atStartOfDay() diff --git a/src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt b/src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt index d9a1654..999515c 100644 --- a/src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt +++ b/src/main/java/com/ffii/fpsms/m18/web/M18TestController.kt @@ -4,6 +4,7 @@ import com.ffii.core.utils.JwtTokenUtil import com.ffii.fpsms.m18.M18Config import com.ffii.fpsms.m18.service.* import com.ffii.fpsms.m18.web.models.M18CommonRequest +import com.ffii.fpsms.modules.common.SettingNames import com.ffii.fpsms.modules.master.entity.ItemUom import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.master.entity.ShopRepository @@ -11,6 +12,7 @@ import com.ffii.fpsms.modules.master.enums.ShopType import com.ffii.fpsms.modules.master.service.ItemUomService import com.ffii.fpsms.modules.master.service.ItemsService import com.ffii.fpsms.modules.master.service.ShopService +import com.ffii.fpsms.modules.settings.service.SettingsService import jakarta.validation.Valid import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -30,6 +32,7 @@ class M18TestController ( private val m18PurchaseQuotationService: M18PurchaseQuotationService, private val m18DeliveryOrderService: M18DeliveryOrderService, val m18SchedulerService: M18SchedulerService, + private val settingsService: SettingsService, ) { var logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) @@ -59,6 +62,13 @@ class M18TestController ( fun test4(): Any { return m18SchedulerService.getM18Pos(); } + // --------------------------------------------- Scheduler --------------------------------------------- /// + @GetMapping("/schedule/po") // + fun schedulePo(@RequestParam @Valid newCron: String) { + settingsService.update(SettingNames.SCHEDULE_M18_PO, newCron); + m18SchedulerService.scheduleM18PoTask() + } + // --------------------------------------------- Master Data --------------------------------------------- /// @GetMapping("/all") fun m18All() { diff --git a/src/main/java/com/ffii/fpsms/modules/common/SettingNames.java b/src/main/java/com/ffii/fpsms/modules/common/SettingNames.java index 9f2fa21..ce63b5d 100644 --- a/src/main/java/com/ffii/fpsms/modules/common/SettingNames.java +++ b/src/main/java/com/ffii/fpsms/modules/common/SettingNames.java @@ -20,6 +20,11 @@ public abstract class SettingNames { /** Define the system modules (authorities.module) */ public static final String SYS_ROLE_MODULES = "SYS.modules"; + /* + * Schedule settings + */ + public static final String SCHEDULE_M18_PO = "SCHEDULE.m18.po"; + /* * Mail settings */ diff --git a/src/main/resources/db/changelog/changes/20250731_01_cyril/01_insert_schedule_setting.sql b/src/main/resources/db/changelog/changes/20250731_01_cyril/01_insert_schedule_setting.sql new file mode 100644 index 0000000..f924c29 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250731_01_cyril/01_insert_schedule_setting.sql @@ -0,0 +1,4 @@ +-- liquibase formatted sql +-- changeset cyril:insert_schedule_setting + +INSERT INTO `settings` (`name`, `value`, `category`, `type`) VALUES ('SCHEDULE.m18.po', '0 0 2 * * *', 'SCHEDULE', 'string');