huang
2025-11-25 19f59c243e8df97c8b9fd9dba4e758be8235d68b
mes-processes/mes-plcSend/src/main/java/com/mes/task/service/impl/MultiDeviceTaskServiceImpl.java
@@ -22,6 +22,7 @@
import com.mes.task.service.TaskStatusNotificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -69,6 +70,7 @@
            throw new IllegalArgumentException("至少需要配置一条玻璃ID");
        }
        // 创建任务记录
        MultiDeviceTask task = new MultiDeviceTask();
        task.setTaskId(generateTaskId(groupConfig));
        task.setGroupId(String.valueOf(groupConfig.getId()));
@@ -79,11 +81,39 @@
        task.setStartTime(new Date());
        save(task);
        // 异步执行任务,立即返回任务ID
        executeTaskAsync(task, groupConfig, devices, parameters);
        log.info("设备组任务已启动(异步执行): taskId={}, groupId={}, groupName={}",
            task.getTaskId(), groupConfig.getId(), groupConfig.getGroupName());
        return task;
    }
    /**
     * 异步执行设备组任务
     * 每个设备组作为独立线程执行,互不阻塞
     */
    @Async("deviceGroupTaskExecutor")
    public void executeTaskAsync(MultiDeviceTask task,
                                  DeviceGroupConfig groupConfig,
                                  List<DeviceConfig> devices,
                                  TaskParameters parameters) {
        try {
            log.info("开始执行设备组任务: taskId={}, groupId={}, deviceCount={}",
                task.getTaskId(), groupConfig.getId(), devices.size());
            // 更新任务状态为运行中
            task.setStatus(MultiDeviceTask.Status.RUNNING.name());
            updateById(task);
            // 通知任务开始
            notificationService.notifyTaskStatus(task);
            
            // 执行任务
            TaskExecutionResult result = taskExecutionEngine.execute(task, groupConfig, devices, parameters);
            // 更新任务结果
            task.setStatus(result.isSuccess() ? MultiDeviceTask.Status.COMPLETED.name() : MultiDeviceTask.Status.FAILED.name());
            task.setErrorMessage(result.isSuccess() ? null : result.getMessage());
            task.setEndTime(new Date());
@@ -93,14 +123,20 @@
            // 通知任务完成
            notificationService.notifyTaskStatus(task);
            
            return task;
            log.info("设备组任务执行完成: taskId={}, success={}, message={}",
                task.getTaskId(), result.isSuccess(), result.getMessage());
        } catch (Exception ex) {
            log.error("多设备任务执行异常, taskId={}", task.getTaskId(), ex);
            log.error("设备组任务执行异常: taskId={}, groupId={}", task.getTaskId(), groupConfig.getId(), ex);
            // 更新任务状态为失败
            task.setStatus(MultiDeviceTask.Status.FAILED.name());
            task.setErrorMessage(ex.getMessage());
            task.setEndTime(new Date());
            updateById(task);
            throw new RuntimeException("多设备任务执行失败: " + ex.getMessage(), ex);
            // 通知任务失败
            notificationService.notifyTaskStatus(task);
        }
    }