package com.ycl.task; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; import com.ycl.factory.FlowServiceFactory; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; import com.ycl.service.ProjectProcessService; import lombok.extern.slf4j.Slf4j; import org.flowable.task.api.Task; import org.flowable.task.api.TaskInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @Component("flowableTask") public class FlowableTask extends FlowServiceFactory { @Autowired private ProjectProcessMapper projectProcessMapper; @Autowired private ProjectInfoMapper projectInfoMapper; /** * 赋码任务 */ public void expireTask() { log.info("开始赋码"); List taskList = taskService.createTaskQuery().list(); if (!CollectionUtils.isEmpty(taskList)) { Date now = new Date(); // 按超时状态分组任务 Map> processInstanceMap = taskList.stream() .collect(Collectors.groupingBy( task -> task.getDueDate() != null && now.after(task.getDueDate()), Collectors.mapping(TaskInfo::getProcessInstanceId, Collectors.toList()) )); // 处理超时和未超时的项目 updateProjectCoding(processInstanceMap.get(true), "red"); // 超时项目 updateProjectCoding(processInstanceMap.get(false), "green"); // 未超时项目 } log.info("结束赋码"); } /** * 赋码 * * @param processInstanceIds 流程实例ID列表 * @param coding 赋码值 */ private void updateProjectCoding(List processInstanceIds, String coding) { if (CollectionUtils.isEmpty(processInstanceIds)) { return; } List projectIds = projectProcessMapper.selectList( new QueryWrapper() .in("process_ins_id", processInstanceIds) ).stream() .map(ProjectProcess::getProjectId) .collect(Collectors.toList()); if (!CollectionUtils.isEmpty(projectIds)) { new LambdaUpdateChainWrapper<>(projectInfoMapper) .in(ProjectInfo::getId, projectIds) .set(ProjectInfo::getCoding, coding) .update(); } } }