Merge remote-tracking branch 'origin/main'

main
liutao 19 hours ago
commit aeb8e5839c

@ -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 {

@ -22,6 +22,7 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
@ -77,6 +78,15 @@ 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());
return;
}
List<Long> moldIds = Arrays.stream(moldTaskManagementDO.getMoldList().split(","))
.map(String::trim)
@ -125,6 +135,17 @@ public class GenerateMoldWorkOrderTask implements Task {
}
}
private boolean isWithinTaskDateRange(MoldTaskManagementDO moldTaskManagementDO) {
LocalDate today = LocalDate.now();
if (moldTaskManagementDO.getStartDate() != null && today.isBefore(moldTaskManagementDO.getStartDate())) {
return false;
}
if (moldTaskManagementDO.getEndDate() != null && today.isAfter(moldTaskManagementDO.getEndDate())) {
return false;
}
return true;
}
private void sendMoldTicketCreateNotifyMessage(MoldTaskManagementDO moldTaskManagementDO,
MoldTicketManagementDO moldTicketManagementDO) {
Map<String, Object> templateParams = new HashMap<>();
@ -132,12 +153,21 @@ public class GenerateMoldWorkOrderTask implements Task {
templateParams.put("planNo", Objects.toString(moldTicketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(moldTicketManagementDO.getConfigName(), ""));
templateParams.put("moldName", Objects.toString(moldTicketManagementDO.getMoldName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(moldTicketManagementDO.getTaskEndTime()));
templateParams.put("businessType", getMoldBusinessType(moldTicketManagementDO.getPlanType()));
templateParams.put("createTime", formatNotifyDateTime(
moldTicketManagementDO.getCreateTime() != null ? moldTicketManagementDO.getCreateTime() : LocalDateTime.now()));
mesNotifyMessageService.sendToAdmins(moldTaskManagementDO.getOperableUsers(), MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "模具工单", moldTicketManagementDO.getId());
}
private String getMoldBusinessType(Integer taskType) {
if (Integer.valueOf(2).equals(taskType)) {
return "模具保养";
}
return "模具点检";
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

@ -23,6 +23,7 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
@ -98,6 +99,15 @@ public class GenerateWorkOrderTask implements Task {
if (taskManagementDO == null){
return;
}
if (!Boolean.TRUE.equals(taskManagementDO.getEnabled())) {
logger.info("设备工单任务已禁用跳过执行任务ID: {}", taskManagementDO.getId());
return;
}
if (!isWithinTaskDateRange(taskManagementDO)) {
logger.info("设备工单任务不在执行日期范围内任务ID: {}, startDate: {}, endDate: {}",
taskManagementDO.getId(), taskManagementDO.getStartDate(), taskManagementDO.getEndDate());
return;
}
// 将逗号分隔的字符串转换为Long类型的List
List<Long> idList = Arrays.stream(taskManagementDO.getDeviceList().split(","))
@ -141,18 +151,38 @@ public class GenerateWorkOrderTask implements Task {
}
}
private boolean isWithinTaskDateRange(TaskManagementDO taskManagementDO) {
LocalDate today = LocalDate.now();
if (taskManagementDO.getStartDate() != null && today.isBefore(taskManagementDO.getStartDate())) {
return false;
}
if (taskManagementDO.getEndDate() != null && today.isAfter(taskManagementDO.getEndDate())) {
return false;
}
return true;
}
private void sendTicketCreateNotifyMessage(TaskManagementDO taskManagementDO, TicketManagementDO ticketManagementDO) {
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("ticketId", ticketManagementDO.getId());
templateParams.put("planNo", Objects.toString(ticketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(ticketManagementDO.getConfigName(), ""));
templateParams.put("deviceName", Objects.toString(ticketManagementDO.getDeviceName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(ticketManagementDO.getTaskEndTime()));
templateParams.put("businessType", getDeviceBusinessType(ticketManagementDO.getPlanType()));
templateParams.put("createTime", formatNotifyDateTime(
ticketManagementDO.getCreateTime() != null ? ticketManagementDO.getCreateTime() : LocalDateTime.now()));
mesNotifyMessageService.sendToAdmins(taskManagementDO.getOperableUsers(), TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "设备工单", ticketManagementDO.getId());
}
private String getDeviceBusinessType(Integer taskType) {
if (Integer.valueOf(2).equals(taskType)) {
return "设备保养";
}
return "设备点检";
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

@ -97,7 +97,9 @@ public class DvRepairServiceImpl implements DvRepairService {
templateParams.put("machineryName", Objects.toString(dvRepair.getMachineryName(), ""));
templateParams.put("faultPhenomenon", Objects.toString(dvRepair.getFaultPhenomenon(), ""));
templateParams.put("faultDescription", Objects.toString(dvRepair.getFaultDescription(), ""));
templateParams.put("requireDate", formatNotifyDateTime(dvRepair.getRequireDate()));
templateParams.put("businessType", "设备维修");
templateParams.put("createTime", formatNotifyDateTime(
dvRepair.getCreateTime() != null ? dvRepair.getCreateTime() : LocalDateTime.now()));
mesNotifyMessageService.sendToAdmin(dvRepair.getAcceptedBy(), DV_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "设备维修单", dvRepair.getId());

@ -106,7 +106,9 @@ public class MoldRepairServiceImpl implements MoldRepairService {
templateParams.put("moldName", Objects.toString(moldRepair.getMoldName(), ""));
templateParams.put("faultPhenomenon", Objects.toString(moldRepair.getFaultPhenomenon(), ""));
templateParams.put("faultDescription", Objects.toString(moldRepair.getFaultDescription(), ""));
templateParams.put("requireDate", formatNotifyDateTime(moldRepair.getRequireDate()));
templateParams.put("businessType", "模具维修");
templateParams.put("createTime", formatNotifyDateTime(
moldRepair.getCreateTime() != null ? moldRepair.getCreateTime() : LocalDateTime.now()));
mesNotifyMessageService.sendToAdmin(moldRepair.getAcceptedBy(), MOLD_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "模具维修单", moldRepair.getId());

@ -251,12 +251,21 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService
templateParams.put("planNo", Objects.toString(moldticketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(moldticketManagementDO.getConfigName(), ""));
templateParams.put("moldName", Objects.toString(moldticketManagementDO.getMoldName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(moldticketManagementDO.getTaskEndTime()));
templateParams.put("businessType", getMoldBusinessType(moldticketManagementDO.getPlanType()));
templateParams.put("createTime", formatNotifyDateTime(
moldticketManagementDO.getCreateTime() != null ? moldticketManagementDO.getCreateTime() : LocalDateTime.now()));
mesNotifyMessageService.sendToAdmins(moldtaskManagementDO.getOperableUsers(), MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "模具工单", moldticketManagementDO.getId());
}
private String getMoldBusinessType(Integer taskType) {
if (Integer.valueOf(2).equals(taskType)) {
return "模具保养";
}
return "模具点检";
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

@ -249,12 +249,21 @@ public class TaskManagementServiceImpl implements TaskManagementService {
templateParams.put("planNo", Objects.toString(ticketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(ticketManagementDO.getConfigName(), ""));
templateParams.put("deviceName", Objects.toString(ticketManagementDO.getDeviceName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(ticketManagementDO.getTaskEndTime()));
templateParams.put("businessType", getDeviceBusinessType(ticketManagementDO.getPlanType()));
templateParams.put("createTime", formatNotifyDateTime(
ticketManagementDO.getCreateTime() != null ? ticketManagementDO.getCreateTime() : LocalDateTime.now()));
mesNotifyMessageService.sendToAdmins(taskManagementDO.getOperableUsers(), TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "设备工单", ticketManagementDO.getId());
}
private String getDeviceBusinessType(Integer taskType) {
if (Integer.valueOf(2).equals(taskType)) {
return "设备保养";
}
return "设备点检";
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

@ -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<Long> 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<Long> 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<TaskManagementDO> taskList = taskManagementMapper.selectList(
Wrappers.<TaskManagementDO>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<MoldTaskManagementDO> taskList = moldTaskManagementMapper.selectList(
Wrappers.<MoldTaskManagementDO>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);
}
}
}
}
Loading…
Cancel
Save