diff --git a/yudao-module-iot/yudao-module-iot-biz/pom.xml b/yudao-module-iot/yudao-module-iot-biz/pom.xml index 60e41dee82..3284ebf3e7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/pom.xml +++ b/yudao-module-iot/yudao-module-iot-biz/pom.xml @@ -52,6 +52,12 @@ yudao-spring-boot-starter-mybatis + + com.cronutils + cron-utils + 9.2.0 + + cn.iocoder.boot diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 6618f4adf1..cb6adedc8f 100644 --- a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -143,6 +143,8 @@ public interface ErrorCodeConstants { ErrorCode SUBJECT_EXISTS = new ErrorCode(1002000010, "项目编码已存在"); ErrorCode TASK_MANAGEMENT_NOT_EXISTS = new ErrorCode(1002000011, "设备类型不存在"); ErrorCode TASK_CORN_NOT_EXISTS = new ErrorCode(1002000011, "设备corn表达式为空"); + ErrorCode TASK_CORN_NOT_LE_HOUR = new ErrorCode(1002000011, "corn表达式不能小于一小时"); + ErrorCode TICKET_MANAGEMENT_NOT_EXISTS = new ErrorCode(1002000012, "工单管理不存在"); ErrorCode TICKET_RESULTS_NOT_EXISTS = new ErrorCode(1002000013, "工单检验结果不存在"); ErrorCode TICKET_RESULTS_ID_NOT_NULL = new ErrorCode(1002000014, "工单检验结果Id不存在"); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java index e39cc002bc..035dd42143 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java @@ -16,6 +16,11 @@ import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMa import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cronutils.model.Cron; +import com.cronutils.model.CronType; +import com.cronutils.model.definition.CronDefinitionBuilder; +import com.cronutils.model.time.ExecutionTime; +import com.cronutils.parser.CronParser; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -23,6 +28,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Collectors; @@ -73,6 +80,12 @@ public class TaskManagementServiceImpl implements TaskManagementService { @Override public Long createTaskManagement(TaskManagementSaveReqVO createReqVO) { + String cronExpr = createReqVO.getCronExpression(); + + // 校验 cron 表达式最小间隔 + isCronIntervalAtLeastOneHour(cronExpr); + + // 插入 TaskManagementDO taskManagement = BeanUtils.toBean(createReqVO, TaskManagementDO.class); taskManagementMapper.insert(taskManagement); @@ -80,6 +93,35 @@ public class TaskManagementServiceImpl implements TaskManagementService { return taskManagement.getId(); } + private void isCronIntervalAtLeastOneHour(String cronExpr) { + + try { + if (StringUtils.isBlank(cronExpr)){ + return; + } + + CronParser parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ)); + Cron cron = parser.parse(cronExpr); + cron.validate(); + + ExecutionTime executionTime = ExecutionTime.forCron(cron); + + ZonedDateTime now = ZonedDateTime.now(); + ZonedDateTime next1 = executionTime.nextExecution(now).get(); + ZonedDateTime next2 = executionTime.nextExecution(next1).get(); + + Duration duration = Duration.between(next1, next2); + + if (duration.toHours() < 1) { + throw exception(TASK_CORN_NOT_LE_HOUR); + } + + } catch (Exception e) { + throw exception(TASK_CORN_NOT_LE_HOUR); + } + + } + @Override public void updateTaskManagement(TaskManagementSaveReqVO updateReqVO) { // 校验存在