package com.ycl.task; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.ycl.common.base.Result; import com.ycl.common.enums.business.CodingRulerIntervalTypeEnum; import com.ycl.common.enums.business.ProjectProcessTypeEnum; import com.ycl.domain.entity.*; import com.ycl.domain.vo.CodingRulerVO; import com.ycl.domain.vo.ProcessCodingVO; import com.ycl.domain.vo.ProcessOvertimeTimesVO; import com.ycl.factory.FlowServiceFactory; import com.ycl.mapper.*; import com.ycl.service.CodingRulerService; import com.ycl.service.ProjectOvertimeTimesService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Component("codingTask") public class CodingTask extends FlowServiceFactory { private final ProjectOvertimeTimesMapper projectOvertimeTimesMapper; private final ProjectOvertimeTimesService projectOvertimeTimesService; private final ProjectProcessMapper projectProcessMapper; private final ProjectInfoMapper projectInfoMapper; private final CodingRulerService codingRulerService; private final ProcessCodingMapper processCodingMapper; //计数项目超时任务数并更具赋码规则进行赋码 public void codingTask(){ log.info("开始计算项目并且赋码"); //获得启用的赋码规则 Result result = codingRulerService.getStartRuler(); CodingRulerVO yellowRuler = (CodingRulerVO) result.get("yellowRuler"); CodingRulerVO redRuler = (CodingRulerVO) result.get("redRuler"); //没启用直接结束 if (Objects.isNull(yellowRuler) && Objects.isNull(redRuler)) { log.error("未启用赋码规则"); return; } //获得所有 超时任务数与流程实例id List processOvertimeTimesVOS = processCodingMapper.countProjectOvertimeTimes(); if (!CollectionUtils.isEmpty(processOvertimeTimesVOS)){ //将流程实例id转换为list List processIds = processOvertimeTimesVOS.stream().map(ProcessOvertimeTimesVO::getProcessInsId).toList(); //获得所有 更具流程定义id,流程相关项目id, key为流程id Map projectMap = new LambdaQueryChainWrapper<>(projectProcessMapper) .in(ProjectProcess::getProcessInsId, processIds) .eq(ProjectProcess::getProjectType, ProjectProcessTypeEnum.PROJECT) .list() .stream() .collect(Collectors.toMap(ProjectProcess::getProcessInsId, Function.identity())); //修改为黄码的项目 id List yellowProjectCodingIds = new ArrayList<>(); //修改为红码的项目 id List redProjectCodingIds = new ArrayList<>(); //新增的记录集合 List addList = new ArrayList<>(); for (ProcessOvertimeTimesVO processOvertimeTimesVO : processOvertimeTimesVOS) { //判断 项目类型为 ProjectProcessTypeEnum.PROJECT 并且超时任务数大于0 if (processOvertimeTimesVO.getTaskOvertimeNum() != 0 && projectMap.containsKey(processOvertimeTimesVO.getProcessInsId())) { ProjectOvertimeTimes projectOvertimeTimes = new ProjectOvertimeTimes(); projectOvertimeTimes.setProjectType(ProjectProcessTypeEnum.PROJECT.getValue()); projectOvertimeTimes.setProjectId(projectMap.get(processOvertimeTimesVO.getProcessInsId()).getProjectId()); projectOvertimeTimes.setProcessInsId(processOvertimeTimesVO.getProcessInsId()); projectOvertimeTimes.setTaskOvertimeNum(processOvertimeTimesVO.getTaskOvertimeNum()); //添加到新增集合内 addList.add(projectOvertimeTimes); //检验赋码规则 checkCodingType(projectOvertimeTimes.getTaskOvertimeNum(), projectOvertimeTimes.getProjectId(), yellowProjectCodingIds,redProjectCodingIds, yellowRuler,redRuler); } } if(!CollectionUtils.isEmpty(addList)){ projectOvertimeTimesMapper.delAll(); projectOvertimeTimesService.saveBatch(addList); } //修改项目赋码 updateProjectCoding(redProjectCodingIds,"red"); log.info("打印赋值为红码的项目id"); for (String s : redProjectCodingIds){ System.out.println(s); } log.info("打印赋值为红码的项目id完毕"); updateProjectCoding(yellowProjectCodingIds,"yellow"); log.info("打印赋值为黄码的项目id"); for (String s : yellowProjectCodingIds){ System.out.println(s); } log.info("打印赋值为黄码的项目id完毕"); } log.info("结束计算项目并且赋码"); } /** * 赋码 * * @param projectIds 流程实例ID列表 * @param coding 赋码值 */ private void updateProjectCoding(List projectIds, String coding) { if (!CollectionUtils.isEmpty(projectIds)) { //将id 类型转换为Long List longList = projectIds.stream() .map(Long::parseLong) .collect(Collectors.toList()); new LambdaUpdateChainWrapper<>(projectInfoMapper) .in(ProjectInfo::getId, longList) .set(ProjectInfo::getCoding, coding) .update(); } } /** * * @param overTimeNum 超时任务数 * @param projectId 项目id * @param yellowProjectCodingIds 修改项目赋码为黄码的id集合 * @param redProjectCodingIds 修改项目赋码为红码的id集合 * @param yellowRuler 黄码规则 * @param redRuler 红码规则 */ private void checkCodingType(Long overTimeNum,String projectId, List yellowProjectCodingIds, List redProjectCodingIds, CodingRulerVO yellowRuler,CodingRulerVO redRuler){ //先判断红码,规则如果满足,则不执行黄码规则 if (judgeState(overTimeNum, projectId, redProjectCodingIds, redRuler)) return; //判断是否满足黄码规则 judgeState(overTimeNum, projectId, yellowProjectCodingIds, yellowRuler); } private boolean judgeState(Long overTimeNum, String projectId, List projectCodingIds, CodingRulerVO ruler) { if (ruler != null){ if (CodingRulerIntervalTypeEnum.Interval.getValue().equals(ruler.getIntervalType())){ //区间情况 boolean result = false; //判断满足左区间 if (ruler.getLeftSymbol().equals("0")){ result = (overTimeNum > ruler.getLeftValue()); }else if (ruler.getLeftSymbol().equals("1")){ result = (overTimeNum >= ruler.getLeftValue()); }else if (ruler.getLeftSymbol().equals("2")){ result = (Objects.equals(overTimeNum, ruler.getLeftValue())); } //满足则判断满足右区间 if (result){ if (ruler.getRightSymbol().equals("2")){ result = (Objects.equals(overTimeNum, ruler.getRightValue())); }else if (ruler.getRightSymbol().equals("3")){ result = (overTimeNum < ruler.getRightValue()); }else if (ruler.getRightSymbol().equals("4")){ result = (overTimeNum <= ruler.getRightValue()); } } if (result){ //符合该赋码条件 projectCodingIds.add(projectId); return true; } } else{ //单区间情况 boolean result = false; if (ruler.getLeftSymbol().equals("0")){ result = (overTimeNum > ruler.getLeftValue()); }else if (ruler.getLeftSymbol().equals("1")){ result = (overTimeNum >= ruler.getLeftValue()); }else if (ruler.getLeftSymbol().equals("2")){ result = (Objects.equals(overTimeNum, ruler.getLeftValue())); }else if (ruler.getLeftSymbol().equals("3")){ result = (overTimeNum < ruler.getLeftValue()); }else if (ruler.getLeftSymbol().equals("4")){ result = (overTimeNum <= ruler.getLeftValue()); } if (result){ //符合该赋码条件 projectCodingIds.add(projectId); return true; } } } return false; } }