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