business/src/main/java/com/ycl/task/FlowableTask.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
common/src/main/java/com/ycl/common/constant/Constants.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
business/src/main/java/com/ycl/task/FlowableTask.java
New file @@ -0,0 +1,77 @@ 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.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; import com.ycl.factory.FlowServiceFactory; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; import com.ycl.service.ProjectProcessService; import lombok.extern.slf4j.Slf4j; import org.flowable.task.api.Task; import org.flowable.task.api.TaskInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @Component("flowableTask") public class FlowableTask extends FlowServiceFactory { @Autowired private ProjectProcessMapper projectProcessMapper; @Autowired private ProjectInfoMapper projectInfoMapper; /** * 赋码任务 */ public void expireTask() { log.info("开始赋码"); List<Task> taskList = taskService.createTaskQuery().list(); if (!CollectionUtils.isEmpty(taskList)) { Date now = new Date(); // 按超时状态分组任务 Map<Boolean, List<String>> processInstanceMap = taskList.stream() .collect(Collectors.groupingBy( task -> task.getDueDate() != null && now.after(task.getDueDate()), Collectors.mapping(TaskInfo::getProcessInstanceId, Collectors.toList()) )); // 处理超时和未超时的项目 updateProjectCoding(processInstanceMap.get(true), "red"); // 超时项目 updateProjectCoding(processInstanceMap.get(false), "green"); // 未超时项目 } log.info("结束赋码"); } /** * 赋码 * * @param processInstanceIds 流程实例ID列表 * @param coding 赋码值 */ private void updateProjectCoding(List<String> processInstanceIds, String coding) { if (CollectionUtils.isEmpty(processInstanceIds)) { return; } List<Long> projectIds = projectProcessMapper.selectList( new QueryWrapper<ProjectProcess>() .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(); } } } common/src/main/java/com/ycl/common/constant/Constants.java
@@ -163,7 +163,7 @@ /** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */ public static final String[] JOB_WHITELIST_STR = { "com.ycl.quartz.task" }; public static final String[] JOB_WHITELIST_STR = { "com.ycl.task" }; /** * 定时任务违规的字符 flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java
@@ -99,4 +99,6 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date finishTime; private Boolean overtime; } flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
@@ -20,4 +20,9 @@ * 是否完成(已经审批) */ private boolean completed; /** * 是否已经超时 */ private boolean overtime; } flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -792,6 +792,11 @@ .processInstanceId(procInsId) .orderByHistoricActivityInstanceStartTime() .desc().list(); Date now =new Date(); //扩展 List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(procInsId) .list(); List<FlowTaskDto> hisFlowList = new ArrayList<>(); for (HistoricActivityInstance histIns : list) { // 展示开始节点 @@ -850,6 +855,23 @@ } flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); String taskId = histIns.getTaskId(); //扩展 判断是否超时 for (HistoricTaskInstance taskInstance : taskList) { Date dueDate = taskInstance.getDueDate(); //找到对应任务节点 if(dueDate!=null && taskInstance.getId().equals(taskId) ) { //如果任务还没完成 if(flowTask.getDuration()==null) { //判断当前时间是否超过到期时间 if (now.after(dueDate)) flowTask.setOvertime(Boolean.TRUE); }else { //如果任务节点已经完成了,用完成时间判断 if(histIns.getEndTime().after(dueDate)) flowTask.setOvertime(Boolean.TRUE); } } } // 获取意见评论内容 List<Comment> commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); commentList.forEach(comment -> { @@ -1095,9 +1117,15 @@ @Override public AjaxResult flowXmlAndNode(String procInsId, String deployId) { try { Date now = new Date(); List<FlowViewerDto> flowViewerList = new ArrayList<>(); // 获取已经完成的节点 List<HistoricActivityInstance> listFinished = historyService.createHistoricActivityInstanceQuery() .processInstanceId(procInsId) .finished() .list(); //获取所有任务节点信息(扩展) List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(procInsId) .finished() .list(); @@ -1107,6 +1135,15 @@ FlowViewerDto flowViewerDto = new FlowViewerDto(); flowViewerDto.setKey(s.getActivityId()); flowViewerDto.setCompleted(true); //扩展内容 已完成的用完成时间判断 Date endTime = s.getEndTime(); for (HistoricTaskInstance task : taskList) { if(s.getTaskId()!=null && s.getTaskId().equals(task.getId())){ if(task.getDueDate()!=null && endTime.after(task.getDueDate())){ flowViewerDto.setOvertime(true); } } } // 退回节点不进行展示 if (StringUtils.isBlank(s.getDeleteReason())) { flowViewerList.add(flowViewerDto); @@ -1126,6 +1163,14 @@ FlowViewerDto flowViewerDto = new FlowViewerDto(); flowViewerDto.setKey(s.getActivityId()); flowViewerDto.setCompleted(false); //扩展内容 代办的通过当前时间去判断 for (HistoricTaskInstance task : taskList) { if(s.getTaskId()!=null && s.getTaskId().equals(task.getId())){ if(task.getDueDate()!=null && now.after(task.getDueDate())){ flowViewerDto.setOvertime(true); } } } flowViewerList.add(flowViewerDto); }); Map<String, Object> result = new HashMap();