xiangpei
4 天以前 e85cd3fe826efe0baaa3fc09ea371467127c370c
business/src/main/java/com/ycl/task/CodingTask.java
New file
@@ -0,0 +1,216 @@
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<ProcessOvertimeTimesVO> processOvertimeTimesVOS = processCodingMapper.countProjectOvertimeTimes();
        if (!CollectionUtils.isEmpty(processOvertimeTimesVOS)){
            //将流程实例id转换为list
            List<String> processIds = processOvertimeTimesVOS.stream().map(ProcessOvertimeTimesVO::getProcessInsId).toList();
            //获得所有 更具流程定义id,流程相关项目id, key为流程id
            Map<String, ProjectProcess> projectMap = new LambdaQueryChainWrapper<>(projectProcessMapper)
                    .in(ProjectProcess::getProcessInsId, processIds)
                    .eq(ProjectProcess::getProjectType, ProjectProcessTypeEnum.PROJECT)
                    .list()
                    .stream()
                    .collect(Collectors.toMap(ProjectProcess::getProcessInsId, Function.identity()));
            //修改为黄码的项目 id
            List<String> yellowProjectCodingIds = new ArrayList<>();
            //修改为红码的项目 id
            List<String> redProjectCodingIds = new ArrayList<>();
            //新增的记录集合
            List<ProjectOvertimeTimes> 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<String> projectIds, String coding) {
        if (!CollectionUtils.isEmpty(projectIds)) {
            //将id 类型转换为Long
            List<Long> 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<String> yellowProjectCodingIds, List<String> 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<String> 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;
    }
}