fix:修复设备及台账定时生成工单任务问题

main
HuangHuiKang 12 hours ago
parent f9af1c74a8
commit 98544d42c9

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

@ -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());

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