xiangpei
3 天以前 e85cd3fe826efe0baaa3fc09ea371467127c370c
Merge branch 'dev'

# Conflicts:
# business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
11个文件已修改
11个文件已添加
812 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/CodingRulerController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/entity/ProjectOvertimeTimes.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/form/ProjectOvertimeTimesForm.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/query/ProjectOvertimeTimesQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/ProjectOvertimeTimesVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/CodingRulerMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/ProjectOvertimeTimesMapper.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/CodingRulerService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProjectOvertimeTimesService.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/CodingRulerServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectCodingStatusServiceImpl.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/task/CodingTask.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/CodingRulerMapper.xml 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/ProjectOvertimeTimesMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/CodingRulerCodeTypeEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/CodingRulerSymbolTypeEnum.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/vo/ProcessOvertimeTimesVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/resources/mapper/ProcessCodingMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
start/src/main/resources/application-dev.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
start/src/main/resources/application-prod.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/CodingRulerController.java
@@ -25,7 +25,7 @@
 */
@Validated
@RequiredArgsConstructor
@Api(value = "项目编码类型管理", tags = "管理")
@Api(value = "赋码规则类型管理", tags = "管理")
@RestController
@RequestMapping("/coding-ruler")
public class CodingRulerController {
business/src/main/java/com/ycl/domain/entity/ProjectOvertimeTimes.java
New file
@@ -0,0 +1,39 @@
package com.ycl.domain.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import com.ycl.system.domain.base.AbsEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 *
 *
 * @author zxl
 * @since 2025-04-01
 */
@Data
@TableName("t_project_overtime_times")
public class ProjectOvertimeTimes extends AbsEntity {
    private static final long serialVersionUID = 1L;
    @TableField("task_overtime_num")
    /**  超时任务数*/
    private Long taskOvertimeNum;
    @TableField("process_ins_id")
    /**  流程实例id*/
    private String processInsId;
    @TableField("project_id")
    /**  项目id*/
    private String projectId;
    /**  项目类型*/
    @TableField("project_type")
    private String projectType;
}
business/src/main/java/com/ycl/domain/form/ProjectOvertimeTimesForm.java
New file
@@ -0,0 +1,49 @@
package com.ycl.domain.form;
import com.ycl.common.group.Update;
import com.ycl.common.group.Add;
import com.ycl.domain.entity.ProjectOvertimeTimes;
import com.ycl.system.domain.base.AbsForm;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotNull;
import org.springframework.lang.NonNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 表单
 *
 * @author zxl
 * @since 2025-04-01
 */
@Data
@ApiModel(value = "ProjectCodingStatus表单", description = "表单")
public class ProjectOvertimeTimesForm extends AbsForm {
    @NotNull(message = "不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("超时任务数")
    private Integer taskOvertimeNum;
    @NotNull(message = "不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("流程实例id")
    private String processInsId;
    @NotNull(message = "不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("项目id")
    private String projectId;
    @NotNull(message = "不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("项目类型")
    private String projectType;
    public static ProjectOvertimeTimes getEntityByForm(@NonNull ProjectOvertimeTimesForm form, ProjectOvertimeTimes entity) {
        if(entity == null) {
          entity = new ProjectOvertimeTimes();
        }
        BeanUtils.copyProperties(form, entity);
        return entity;
    }
}
business/src/main/java/com/ycl/domain/query/ProjectOvertimeTimesQuery.java
New file
@@ -0,0 +1,22 @@
package com.ycl.domain.query;
import com.ycl.system.domain.base.AbsQuery;
import java.util.List;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 查询
 *
 * @author zxl
 * @since 2025-04-01
 */
@Data
@ApiModel(value = "ProjectOvertimeTimesQuery查询参数", description = "查询参数")
public class ProjectOvertimeTimesQuery extends AbsQuery {
}
business/src/main/java/com/ycl/domain/vo/ProjectOvertimeTimesVO.java
New file
@@ -0,0 +1,46 @@
package com.ycl.domain.vo;
import com.ycl.domain.entity.ProjectOvertimeTimes;
import com.ycl.system.domain.base.AbsVo;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 展示
 *
 * @author zxl
 * @since 2025-04-01
 */
@Data
@ApiModel(value = "响应数据", description = "响应数据")
public class ProjectOvertimeTimesVO extends AbsVo {
    /**  任务超时数*/
    @ApiModelProperty("任务超时数")
    private Integer taskOvertimeNum;
    /**  流程实例id*/
    @ApiModelProperty("流程实例id")
    private String processInsId;
    /**  项目id*/
    @ApiModelProperty("项目id")
    private String projectId;
    /**  项目类型*/
    @ApiModelProperty("项目类型")
    private String projectType;
    public static ProjectOvertimeTimesVO getVoByEntity(@NonNull ProjectOvertimeTimes entity, ProjectOvertimeTimesVO vo) {
        if(vo == null) {
            vo = new ProjectOvertimeTimesVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
business/src/main/java/com/ycl/mapper/CodingRulerMapper.java
@@ -4,7 +4,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.domain.vo.CodingRulerVO;
import com.ycl.domain.form.CodingRulerForm;
import com.ycl.domain.query.CodingRulerQuery;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@@ -31,4 +30,6 @@
    */
    IPage getPage(IPage page, @Param("query") CodingRulerQuery query);
    List<CodingRulerVO> getStartRuler();
}
business/src/main/java/com/ycl/mapper/ProjectOvertimeTimesMapper.java
New file
@@ -0,0 +1,36 @@
package com.ycl.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.domain.entity.ProjectOvertimeTimes;
import com.ycl.domain.query.ProjectOvertimeTimesQuery;
import com.ycl.domain.vo.ProjectOvertimeTimesVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 *  Mapper 接口
 *
 * @author zxl
 * @since 2025-04-01
 */
@Mapper
public interface ProjectOvertimeTimesMapper extends BaseMapper<ProjectOvertimeTimes> {
    /**
     * id查找
     * @param id
     * @return
     */
    ProjectOvertimeTimesVO getById(Integer id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") ProjectOvertimeTimesQuery query);
    void delAll();
}
business/src/main/java/com/ycl/service/CodingRulerService.java
@@ -8,7 +8,7 @@
import java.util.List;
/**
 *  服务类
 *  赋码规则服务类
 *
 * @author zxl
 * @since 2025-03-18
@@ -68,4 +68,10 @@
     * @return
     */
    Result changeCodingRulerStatus(Integer id);
    /**
     * 获得启动的赋码规则
     * @return 存放的字段 yellowRuler启用的黄码规则,redRuler启用的红码规则
     */
    Result getStartRuler();
}
business/src/main/java/com/ycl/service/ProjectOvertimeTimesService.java
New file
@@ -0,0 +1,66 @@
package com.ycl.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.common.base.Result;
import com.ycl.domain.entity.ProjectOvertimeTimes;
import com.ycl.domain.form.ProjectOvertimeTimesForm;
import com.ycl.domain.query.ProjectOvertimeTimesQuery;
import java.util.List;
/**
 *  服务类
 *
 * @author zxl
 * @since 2025-04-01
 */
public interface ProjectOvertimeTimesService extends IService<ProjectOvertimeTimes> {
    /**
     * 添加
     * @param form
     * @return
     */
    Result add(ProjectOvertimeTimesForm form);
    /**
     * 修改
     * @param form
     * @return
     */
    Result update(ProjectOvertimeTimesForm form);
    /**
     * 批量删除
     * @param ids
     * @return
     */
    Result remove(List<String> ids);
    /**
     * id删除
     * @param id
     * @return
     */
    Result removeById(String id);
    /**
     * 分页查询
     * @param query
     * @return
     */
    Result page(ProjectOvertimeTimesQuery query);
    /**
     * 根据id查找
     * @param id
     * @return
     */
    Result detail(Integer id);
    /**
     * 列表
     * @return
     */
    Result all();
}
business/src/main/java/com/ycl/service/impl/CodingRulerServiceImpl.java
@@ -17,6 +17,7 @@
import com.ycl.framework.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
@@ -150,4 +151,30 @@
        baseMapper.updateById(codingRuler);
        return Result.ok(msg);
    }
    /**
     * 获得启动的赋码规则
     * @return 存放的字段 yellowRuler启用的黄码规则,redRuler启用的红码规则
     */
    @Override
    public Result getStartRuler() {
        Result result = new Result();
        //获得启用的赋码规则
        List<CodingRulerVO> codingRulerVOS = codingRulerMapper.getStartRuler();
        if (CollectionUtils.isEmpty(codingRulerVOS)){
            log.error("未启用赋码规则");
            return result;
        }
        CodingRulerVO yellowRuler = null;
        CodingRulerVO redRuler = null;
        for (CodingRulerVO codingRulerVO : codingRulerVOS){
            if (CodingRulerCodeTypeEnum.YELLOW.getValue().equals(codingRulerVO.getProjectCodeType())){
                yellowRuler = codingRulerVO;
            }else if (CodingRulerCodeTypeEnum.RED.getValue().equals(codingRulerVO.getProjectCodeType())){
                redRuler = codingRulerVO;
            }
        }
        result.put("yellowRuler",yellowRuler);
        result.put("redRuler",redRuler);
        return result;
    }
}
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -20,6 +20,7 @@
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.exception.CustomException;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.constant.ProjectConstant;
import com.ycl.domain.dto.FlowCommentDto;
import com.ycl.domain.dto.FlowNextDto;
import com.ycl.domain.dto.FlowTaskDto;
@@ -73,6 +74,7 @@
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -109,6 +111,9 @@
    private final ProcessLogService processLogService;
    private final ApplicationEventPublisher publisher;
    private final ProjectProcessMapper projectProcessMapper;
    @Value("${targetIp}")
    private String targetIp;
    /**
     * 完成审核任务
@@ -1841,11 +1846,29 @@
                        for (JSONObject oldField : oldFields) {
                            JSONObject options = oldField.getJSONObject("options");
                            options.put("disabled", true);
                            // 处理文件上传ip问题
                            if ("file-upload".equals(oldField.get("type"))) {
                                options.put("uploadURL", String.format("http://%s:10076/common/upload", this.targetIp));
                            }
                        }
                    }
                    formJson.put(ProcessConstants.WIDGET_LIST, oldFields);
                    newP.put(ProcessConstants.TASK_FORM_KEY, formJson);
                    newP.remove(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY);
                    // 处理已经上传的文件的ip地址
                    for (String s : newP.keySet()) {
                        if (ProcessConstants.TASK_FORM_KEY.equals(s)) {
                            continue;
                        }
                        if (s.startsWith("fileupload")) {
                            List files = (List) newP.get(s);
                            for (Object file : files) {
                                LinkedHashMap<String, String> fileMap = (LinkedHashMap<String, String>) file;
                                String url = fileMap.get("url");
                                fileMap.put("url", url.replace("42.193.1.25", this.targetIp));
                            }
                        }
                    }
                    formDetailVO.setFormJsonObj(newP);
                }
                // TODO 暂时只处理用户任务上的表单
business/src/main/java/com/ycl/service/impl/ProjectCodingStatusServiceImpl.java
New file
@@ -0,0 +1,121 @@
package com.ycl.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ycl.domain.entity.ProjectOvertimeTimes;
import com.ycl.domain.query.ProjectOvertimeTimesQuery;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.domain.form.ProjectOvertimeTimesForm;
import com.ycl.domain.vo.ProjectOvertimeTimesVO;
import com.ycl.mapper.ProjectOvertimeTimesMapper;
import com.ycl.service.ProjectOvertimeTimesService;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import com.ycl.framework.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.util.List;
import java.util.stream.Collectors;
/**
 *  服务实现类
 *
 * @author zxl
 * @since 2025-04-01
 */
@Service
@RequiredArgsConstructor
public class ProjectCodingStatusServiceImpl extends ServiceImpl<ProjectOvertimeTimesMapper, ProjectOvertimeTimes> implements ProjectOvertimeTimesService {
    private final ProjectOvertimeTimesMapper projectCodingStatusMapper;
    /**
     * 添加
     * @param form
     * @return
     */
    @Override
    public Result add(ProjectOvertimeTimesForm form) {
        ProjectOvertimeTimes entity = ProjectOvertimeTimesForm.getEntityByForm(form, null);
        baseMapper.insert(entity);
        return Result.ok("添加成功");
    }
    /**
     * 修改
     * @param form
     * @return
     */
    @Override
    public Result update(ProjectOvertimeTimesForm form) {
        ProjectOvertimeTimes entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        baseMapper.updateById(entity);
        return Result.ok("修改成功");
    }
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
        return Result.ok("删除成功");
    }
    /**
     * id删除
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        return Result.ok("删除成功");
    }
    /**
     * 分页查询
     * @param query
     * @return
     */
    @Override
    public Result page(ProjectOvertimeTimesQuery query) {
        IPage<ProjectOvertimeTimesVO> page = PageUtil.getPage(query, ProjectOvertimeTimesVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     * 根据id查找
     * @param id
     * @return
     */
    @Override
    public Result detail(Integer id) {
        ProjectOvertimeTimesVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
    /**
     * 列表
     * @return
     */
    @Override
    public Result all() {
        List<ProjectOvertimeTimes> entities = baseMapper.selectList(null);
        List<ProjectOvertimeTimesVO> vos = entities.stream()
                .map(entity -> ProjectOvertimeTimesVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
}
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;
    }
}
business/src/main/resources/mapper/CodingRulerMapper.xml
@@ -13,11 +13,21 @@
        <result column="status" property="status"/>
    </resultMap>
    <select id="getStartRuler" resultMap="BaseResultMap">
        select
            TCR.project_code_type,
            TCR.interval_type,
            TCR.left_symbol,
            TCR.left_value,
            TCR.right_symbol,
            TCR.right_value,
            TCR.id,
            TCR.status
        FROM
            t_coding_ruler TCR
        WHERE
            TCR.status = 1 AND TCR.deleted = 0;
    </select>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
business/src/main/resources/mapper/ProjectOvertimeTimesMapper.xml
New file
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycl.mapper.ProjectOvertimeTimesMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ycl.domain.vo.ProjectOvertimeTimesVO">
        <result column="task_overtime_num" property="taskOvertimeNum" />
        <result column="process_ins_id" property="processInsId" />
        <result column="project_id" property="projectId" />
        <result column="project_type" property="projectType" />
    </resultMap>
    <delete id="delAll">
        DELETE FROM t_project_overtime_times
    </delete>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
            TPOT.task_overtime_num,
            TPOT.process_ins_id,
            TPOT.project_id,
            TPOT.id
        FROM
            t_project_overtime_times TPOT
        WHERE
            TPOT.id = #{id} AND TPOT.deleted = 0
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT
            TPOT.task_overtime_num,
            TPOT.process_ins_id,
            TPOT.project_id,
            TPOT.id
        FROM
            t_project_overtime_times TPOT
        WHERE
            TPOT.deleted = 0
    </select>
</mapper>
common/src/main/java/com/ycl/common/enums/business/CodingRulerCodeTypeEnum.java
@@ -11,7 +11,7 @@
@Getter
public enum CodingRulerCodeTypeEnum {
    RED("red", "红码"),
    GREEN("green","绿码");
    YELLOW("yellow","黄码");
    @EnumValue
    @JsonValue
common/src/main/java/com/ycl/common/enums/business/CodingRulerSymbolTypeEnum.java
New file
@@ -0,0 +1,36 @@
package com.ycl.common.enums.business;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@Getter
public enum CodingRulerSymbolTypeEnum {
    GT("0","大于"),
    GE("1","大于等于"),
    EQ("2","等于"),
    LT("3","小于"),
    LE("4","小于等于");
    @EnumValue
    @JsonValue
    private final String value;
    private final String desc;
    CodingRulerSymbolTypeEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }
    // 将枚举转换为 Map
    public static Map<String, String> getMap() {
        return Arrays.stream(CodingRulerSymbolTypeEnum.values())
                .collect(Collectors.toMap(CodingRulerSymbolTypeEnum::getValue, CodingRulerSymbolTypeEnum::getDesc));
    }
}
flowable/src/main/java/com/ycl/domain/vo/ProcessOvertimeTimesVO.java
New file
@@ -0,0 +1,18 @@
package com.ycl.domain.vo;
import com.ycl.system.domain.base.AbsVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "响应数据", description = "响应数据")
public class ProcessOvertimeTimesVO extends AbsVo {
    /** 流程实例id */
    @ApiModelProperty("流程实例id")
    private String processInsId;
    /** 超时任务数 */
    @ApiModelProperty("超时任务数")
    private Long taskOvertimeNum;
}
flowable/src/main/java/com/ycl/mapper/ProcessCodingMapper.java
@@ -5,6 +5,7 @@
import com.ycl.domain.entity.ProcessCoding;
import com.ycl.domain.query.ProcessCodingQuery;
import com.ycl.domain.vo.ProcessCodingVO;
import com.ycl.domain.vo.ProcessOvertimeTimesVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -38,4 +39,10 @@
    void updateBatch(@Param("list") List<ProcessCoding> list);
    List<ProcessCoding> findByTaskId(@Param("taskId") String taskId);
    /**
     * 查询出每个流程实例id中超时的任务数,流程实例id
     * @return
     */
    List<ProcessOvertimeTimesVO> countProjectOvertimeTimes();
}
flowable/src/main/resources/mapper/ProcessCodingMapper.xml
@@ -14,6 +14,21 @@
        <result column="status" property="status" />
        <result column="overtime_status" property="overtimeStatus" />
    </resultMap>
    <resultMap id="processOvertimeTimesVO" type="com.ycl.domain.vo.ProcessOvertimeTimesVO">
        <id column="id" property="id"/>
        <result column="task_overtime_num" property="taskOvertimeNum"/>
        <result column="process_ins_id" property="processInsId"/>
    </resultMap>
    <select id="countProjectOvertimeTimes" resultMap="processOvertimeTimesVO">
        select TPC.id,
               TPC.process_ins_id,
               COUNT(TPC.overtime_status) as task_overtime_num
        FROM t_process_coding TPC
        where
                TPC.overtime_status = 'overtime'
        GROUP BY TPC.process_ins_id
    </select>
    <select id="getById" resultMap="BaseResultMap">
start/src/main/resources/application-dev.yml
@@ -114,3 +114,6 @@
#  app: # app的功能是为flowable在spring中高效运行而提供了很多bean,与flowable本身的内容无关
#    enabled: true
#  check-process-definitions: true
# 用于替换动态表单的文件上传ip(更换服务器ip没调整)
targetIp: 119.6.246.90
start/src/main/resources/application-prod.yml
@@ -18,13 +18,14 @@
    # redis 配置
    redis:
        # 地址
        host: 42.193.1.25
#        host: 42.193.1.25
        host: 127.0.0.1
        # 端口,默认为6379
        port: 6379
        # 数据库索引
        database: 2
        # 密码
        password: ycl2018
#        password: ycl2018
        # 连接超时时间
        timeout: 10s
        lettuce:
@@ -43,7 +44,7 @@
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://221.237.224.33:8066/project_management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
                url: jdbc:mysql://119.6.246.90:8066/project_management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
                username: root
                password: Mysql@my
            # 从库数据源
@@ -119,3 +120,6 @@
#  app: # app的功能是为flowable在spring中高效运行而提供了很多bean,与flowable本身的内容无关
#    enabled: true
#  check-process-definitions: true
# 用于替换动态表单的文件上传ip(更换服务器ip没调整)
targetIp: 119.6.246.90