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) {
// 校验存在