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.ProcessCoding; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; import com.ycl.factory.FlowServiceFactory; import com.ycl.mapper.ProcessCodingMapper; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; import com.ycl.service.ProcessCodingService; import lombok.extern.slf4j.Slf4j; import org.flowable.task.api.Task; import org.flowable.task.api.TaskInfo; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import static com.ycl.common.constant.ProcessOverTimeConstants.*; @Slf4j @Component("flowableTask") public class FlowableTask extends FlowServiceFactory { @Autowired private ProjectProcessMapper projectProcessMapper; @Autowired private ProjectInfoMapper projectInfoMapper; @Autowired private ProcessCodingMapper processCodingMapper; /** * 赋码任务 * 两个逻辑 改项目码、改节点颜色 */ public void expireTask() { log.info("开始赋码"); //当前正在运行的所有任务节点 List taskList = taskService.createTaskQuery().list(); if (CollectionUtils.isEmpty(taskList)) return; List taskIds = taskList.stream().map(TaskInfo::getId).collect(Collectors.toList()); //需要监控的赋码任务 List processCodingList = processCodingMapper.selectList(new QueryWrapper().in("task_id", taskIds)); Map taskMap = new HashMap<>(); Map startTaskMap = new HashMap<>(); if (!CollectionUtils.isEmpty(processCodingList)) { //key为taskId value为本体对象 taskMap = processCodingList.stream().collect(Collectors.toMap(ProcessCoding::getTaskId, Function.identity())); //拿到开始计时的节点集合 key:taskId value:开始时间 startTaskMap = getStartTaskList(processCodingList); } //提前准备接收数据的map key:流程实例id value:需要改变的颜色 Map> map = new HashMap<>(); List list = new ArrayList<>(); map.put(GREEN, new ArrayList<>()); map.put(RED, new ArrayList<>()); map.put(YELLOW, new ArrayList<>()); Date now = new Date(); //遍历所有代办的节点 for (Task task : taskList) { String taskId = task.getId(); ProcessCoding processCoding = taskMap.get(taskId); if (processCoding == null) { //不需要监控的任务节点直接改为绿色 List processInsIds = map.get(GREEN); processInsIds.add(task.getProcessInstanceId()); continue; } //判断是否超时 Date startTime = startTaskMap.get(processCoding.getStartTaskId()); Integer yellowTime = processCoding.getYellowTime(); Integer redTime = processCoding.getRedTime(); if (startTime == null) continue; long durationDay = (now.getTime() - startTime.getTime()) / (1000 * 60 * 60 * 24); // long durationDay = (now.getTime() - startTime.getTime()) / (1000 * 60); String status = GREEN; // 默认状态为绿色 if (redTime != null && durationDay >= redTime) { status = RED; // 如果超过红色时间阈值,则状态为红色 } else if (yellowTime != null && durationDay >= yellowTime) { status = YELLOW; // 否则,如果超过黄色时间阈值,则状态为黄色 } List processInsIds = map.get(status); processInsIds.add(task.getProcessInstanceId()); processCoding.setStatus(status); list.add(processCoding); } //更新项目码 map.forEach((key, value) -> updateProjectCoding(value, key)); //更新节点状态 自定义的mybatis方法 if (!CollectionUtils.isEmpty(list)) processCodingMapper.updateBatch(list); log.info("结束赋码"); } private Map getStartTaskList(List processCodingList) { //查出任务计时起始节点集合 List startTaskIds = processCodingList.stream().map(ProcessCoding::getStartTaskId).collect(Collectors.toList()); //查出起始计时节点数据 Map startDateMap = new HashMap<>(); List hisStartTasks = historyService.createHistoricTaskInstanceQuery().taskIds(startTaskIds).list(); if (!CollectionUtils.isEmpty(hisStartTasks)) { hisStartTasks.forEach(hisTask -> { startDateMap.put(hisTask.getId(), hisTask.getStartTime()); }); } return startDateMap; } /** * 赋码 * * @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(); } } }