From 98544d42c97ab9c9d70a05a34fe369980d738718 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 10 Jul 2026 15:37:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=8F=8A=E5=8F=B0=E8=B4=A6=E5=AE=9A=E6=97=B6=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E4=BB=BB=E5=8A=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/TaskSchedulerManager.java | 18 +++- .../coretask/GenerateMoldWorkOrderTask.java | 4 + .../WorkOrderScheduleInitializer.java | 99 +++++++++++++++++++ 3 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/WorkOrderScheduleInitializer.java diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java index 5a9e857fc..792363add 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java @@ -1,6 +1,8 @@ // TaskSchedulerManager.java package cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler; +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task; import org.slf4j.Logger; @@ -42,6 +44,7 @@ public class TaskSchedulerManager { private Long initialDelay; private Long period; private TimeUnit timeUnit; + private Long tenantId; // 构造器 public TaskInfo(Long taskId, String taskType, String taskParam) { @@ -116,6 +119,7 @@ public class TaskSchedulerManager { taskInfo.initialDelay = initialDelay; taskInfo.period = period; taskInfo.timeUnit = timeUnit; + taskInfo.tenantId = TenantContextHolder.getTenantId(); taskInfos.put(taskId, taskInfo); // 根据调度类型创建任务 @@ -123,7 +127,7 @@ public class TaskSchedulerManager { switch (scheduleType) { case "CRON": future = taskScheduler.schedule( - () -> task.execute(taskId, taskParam), + () -> executeTask(task, taskId, taskParam, taskInfo.tenantId), new CronTrigger(cronExpression) ); break; @@ -131,7 +135,7 @@ public class TaskSchedulerManager { case "FIXED_RATE": if (initialDelay != null && period != null && timeUnit != null) { future = taskScheduler.scheduleAtFixedRate( - () -> task.execute(taskId, taskParam), + () -> executeTask(task, taskId, taskParam, taskInfo.tenantId), initialDelay ); } @@ -140,7 +144,7 @@ public class TaskSchedulerManager { case "FIXED_DELAY": if (initialDelay != null && period != null && timeUnit != null) { future = taskScheduler.scheduleWithFixedDelay( - () -> task.execute(taskId, taskParam), + () -> executeTask(task, taskId, taskParam, taskInfo.tenantId), initialDelay ); } @@ -162,6 +166,14 @@ public class TaskSchedulerManager { } } + private void executeTask(Task task, Long taskId, String taskParam, Long tenantId) { + if (tenantId == null) { + task.execute(taskId, taskParam); + return; + } + TenantUtils.execute(tenantId, () -> task.execute(taskId, taskParam)); + } + // TaskSchedulerManager.java public boolean stopTask(Long taskId) { try { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java index 65493f9c6..62746cf3a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java @@ -78,6 +78,10 @@ public class GenerateMoldWorkOrderTask implements Task { if (moldTaskManagementDO == null) { return; } + if (!Boolean.TRUE.equals(moldTaskManagementDO.getEnabled())) { + logger.info("模具工单任务已禁用,跳过执行,任务ID: {}", moldTaskManagementDO.getId()); + return; + } if (!isWithinTaskDateRange(moldTaskManagementDO)) { logger.info("模具工单任务不在执行日期范围内,任务ID: {}, startDate: {}, endDate: {}", moldTaskManagementDO.getId(), moldTaskManagementDO.getStartDate(), moldTaskManagementDO.getEndDate()); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/WorkOrderScheduleInitializer.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/WorkOrderScheduleInitializer.java new file mode 100644 index 000000000..4a209acde --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/WorkOrderScheduleInitializer.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.mes.service.taskmanagement; + +import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager; +import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService; +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldtaskmanagement.MoldTaskManagementDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.taskmanagement.TaskManagementDO; +import cn.iocoder.yudao.module.mes.dal.mysql.moldtaskmanagement.MoldTaskManagementMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.taskmanagement.TaskManagementMapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; + +@Slf4j +@Component +public class WorkOrderScheduleInitializer { + + @Resource + private TaskManagementMapper taskManagementMapper; + @Resource + private MoldTaskManagementMapper moldTaskManagementMapper; + @Resource + private TaskSchedulerManager taskSchedulerManager; + @Resource + private TenantFrameworkService tenantFrameworkService; + + @EventListener(ApplicationReadyEvent.class) + public void restoreEnabledWorkOrderSchedules() { + List tenantIds = getTenantIdsSafely(); + for (Long tenantId : tenantIds) { + try { + TenantUtils.execute(tenantId, () -> { + restoreDeviceWorkOrderSchedules(); + restoreMoldWorkOrderSchedules(); + }); + } catch (Exception ex) { + log.error("Tenant {} work order schedule restore exception", tenantId, ex); + } + } + } + + private List getTenantIdsSafely() { + try { + return tenantFrameworkService.getTenantIds(); + } catch (Exception ex) { + log.error("Load tenant ids for work order schedule restore failed", ex); + return Collections.emptyList(); + } + } + + private void restoreDeviceWorkOrderSchedules() { + List taskList = taskManagementMapper.selectList( + Wrappers.lambdaQuery().eq(TaskManagementDO::getEnabled, true)); + for (TaskManagementDO task : taskList) { + if (!StringUtils.hasText(task.getCronExpression())) { + log.warn("Device work order task {} is enabled but cron is blank, skip schedule restore", task.getId()); + continue; + } + try { + boolean success = taskSchedulerManager.startWorkOrderTask(task.getId(), task.getCronExpression()); + if (success) { + log.info("Device work order task {} schedule restored successfully", task.getId()); + } else { + log.warn("Device work order task {} schedule restore failed", task.getId()); + } + } catch (Exception ex) { + log.error("Device work order task {} schedule restore exception", task.getId(), ex); + } + } + } + + private void restoreMoldWorkOrderSchedules() { + List taskList = moldTaskManagementMapper.selectList( + Wrappers.lambdaQuery().eq(MoldTaskManagementDO::getEnabled, true)); + for (MoldTaskManagementDO task : taskList) { + if (!StringUtils.hasText(task.getCronExpression())) { + log.warn("Mold work order task {} is enabled but cron is blank, skip schedule restore", task.getId()); + continue; + } + try { + boolean success = taskSchedulerManager.startMoldWorkOrderTask(task.getId(), task.getCronExpression()); + if (success) { + log.info("Mold work order task {} schedule restored successfully", task.getId()); + } else { + log.warn("Mold work order task {} schedule restore failed", task.getId()); + } + } catch (Exception ex) { + log.error("Mold work order task {} schedule restore exception", task.getId(), ex); + } + } + } +}