@@ -2,41 +2,75 @@ package com.ffii.fpsms.m18.service | |||||
import com.ffii.core.utils.JwtTokenUtil | import com.ffii.core.utils.JwtTokenUtil | ||||
import com.ffii.fpsms.m18.web.models.M18CommonRequest | 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.Logger | ||||
import org.slf4j.LoggerFactory | import org.slf4j.LoggerFactory | ||||
import org.springframework.scheduling.TaskScheduler | |||||
//import org.springframework.scheduling.annotation.Async | //import org.springframework.scheduling.annotation.Async | ||||
import org.springframework.scheduling.annotation.Scheduled | import org.springframework.scheduling.annotation.Scheduled | ||||
import org.springframework.scheduling.support.CronTrigger | |||||
import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
import java.time.format.DateTimeFormatter | 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 | @Service | ||||
open class M18SchedulerService( | open class M18SchedulerService( | ||||
val m18PurchaseOrderService: M18PurchaseOrderService, | val m18PurchaseOrderService: M18PurchaseOrderService, | ||||
val m18DeliveryOrderService: M18DeliveryOrderService, | val m18DeliveryOrderService: M18DeliveryOrderService, | ||||
val m18MasterDataService: M18MasterDataService, | val m18MasterDataService: M18MasterDataService, | ||||
val settingsService: SettingsService, | |||||
val taskScheduler: TaskScheduler, | |||||
) { | ) { | ||||
var logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) | var logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) | ||||
val dataStringFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd") | 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 | // @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) | |||||
// @Scheduled(cron = "0 0 2 * * *") // (SS/MM/HH/DD/MM/YY) | |||||
open fun getM18Pos() { | open fun getM18Pos() { | ||||
val currentTime = LocalDateTime.now() | val currentTime = LocalDateTime.now() | ||||
val today = currentTime.toLocalDate().atStartOfDay() | val today = currentTime.toLocalDate().atStartOfDay() | ||||
@@ -4,6 +4,7 @@ import com.ffii.core.utils.JwtTokenUtil | |||||
import com.ffii.fpsms.m18.M18Config | import com.ffii.fpsms.m18.M18Config | ||||
import com.ffii.fpsms.m18.service.* | import com.ffii.fpsms.m18.service.* | ||||
import com.ffii.fpsms.m18.web.models.M18CommonRequest | 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.ItemUom | ||||
import com.ffii.fpsms.modules.master.entity.Items | import com.ffii.fpsms.modules.master.entity.Items | ||||
import com.ffii.fpsms.modules.master.entity.ShopRepository | 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.ItemUomService | ||||
import com.ffii.fpsms.modules.master.service.ItemsService | import com.ffii.fpsms.modules.master.service.ItemsService | ||||
import com.ffii.fpsms.modules.master.service.ShopService | import com.ffii.fpsms.modules.master.service.ShopService | ||||
import com.ffii.fpsms.modules.settings.service.SettingsService | |||||
import jakarta.validation.Valid | import jakarta.validation.Valid | ||||
import org.slf4j.Logger | import org.slf4j.Logger | ||||
import org.slf4j.LoggerFactory | import org.slf4j.LoggerFactory | ||||
@@ -30,6 +32,7 @@ class M18TestController ( | |||||
private val m18PurchaseQuotationService: M18PurchaseQuotationService, | private val m18PurchaseQuotationService: M18PurchaseQuotationService, | ||||
private val m18DeliveryOrderService: M18DeliveryOrderService, | private val m18DeliveryOrderService: M18DeliveryOrderService, | ||||
val m18SchedulerService: M18SchedulerService, | val m18SchedulerService: M18SchedulerService, | ||||
private val settingsService: SettingsService, | |||||
) { | ) { | ||||
var logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) | var logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) | ||||
@@ -59,6 +62,13 @@ class M18TestController ( | |||||
fun test4(): Any { | fun test4(): Any { | ||||
return m18SchedulerService.getM18Pos(); | return m18SchedulerService.getM18Pos(); | ||||
} | } | ||||
// --------------------------------------------- Scheduler --------------------------------------------- /// | |||||
@GetMapping("/schedule/po") // | |||||
fun schedulePo(@RequestParam @Valid newCron: String) { | |||||
settingsService.update(SettingNames.SCHEDULE_M18_PO, newCron); | |||||
m18SchedulerService.scheduleM18PoTask() | |||||
} | |||||
// --------------------------------------------- Master Data --------------------------------------------- /// | // --------------------------------------------- Master Data --------------------------------------------- /// | ||||
@GetMapping("/all") | @GetMapping("/all") | ||||
fun m18All() { | fun m18All() { | ||||
@@ -20,6 +20,11 @@ public abstract class SettingNames { | |||||
/** Define the system modules (authorities.module) */ | /** Define the system modules (authorities.module) */ | ||||
public static final String SYS_ROLE_MODULES = "SYS.modules"; | public static final String SYS_ROLE_MODULES = "SYS.modules"; | ||||
/* | |||||
* Schedule settings | |||||
*/ | |||||
public static final String SCHEDULE_M18_PO = "SCHEDULE.m18.po"; | |||||
/* | /* | ||||
* Mail settings | * Mail settings | ||||
*/ | */ | ||||
@@ -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'); |