fuliqi
2025-01-03 a0e8d1bbff7a02f538be76e852aa233324bd8810
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.core.domain.AjaxResult;
@@ -17,6 +18,7 @@
import com.ycl.domain.dto.FlowNextDto;
import com.ycl.domain.dto.FlowTaskDto;
import com.ycl.domain.dto.FlowViewerDto;
import com.ycl.domain.entity.ProcessCoding;
import com.ycl.domain.entity.SysForm;
import com.ycl.domain.vo.FlowQueryVo;
import com.ycl.domain.vo.FlowTaskVo;
@@ -25,6 +27,7 @@
import com.ycl.flow.CustomProcessDiagramGenerator;
import com.ycl.flow.FindNextNodeUtil;
import com.ycl.flow.FlowableUtils;
import com.ycl.mapper.ProcessCodingMapper;
import com.ycl.service.IFlowTaskService;
import com.ycl.service.ISysDeployFormService;
import com.ycl.service.ISysFormService;
@@ -71,6 +74,9 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
import static com.ycl.common.constant.ProcessOverTimeConstants.RED;
import static com.ycl.common.constant.ProcessOverTimeConstants.YELLOW;
/**
 * @author Tony
 * @date 2021-04-03
@@ -86,6 +92,7 @@
    private final ISysDeployFormService sysInstanceFormService;
    private final ISysFormService sysFormService;
    private final TaskCommonService taskCommonService;
    private final ProcessCodingMapper processCodingMapper;
    /**
     * 完成审核任务
@@ -310,7 +317,6 @@
        if (!isSequential) {
            throw new CustomException("当前节点相对于目标节点,不属于串行关系,无法回退");
        }
        // 获取所有正常进行的任务节点 Key,这些任务不能直接使用,需要找出其中需要撤回的任务
        List<Task> runTaskList = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
@@ -793,10 +799,10 @@
                    .orderByHistoricActivityInstanceStartTime()
                    .desc().list();
            Date now =new Date();
            //扩展
            List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(procInsId)
                    .list();
            //扩展 获取这个流程实例的监控信息 key:TaskId value:实体类
            Map<String, ProcessCoding> processCodingMap = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>().eq("process_ins_id", procInsId))
                    .stream()
                    .collect(Collectors.toMap(ProcessCoding::getTaskId, Function.identity()));
            List<FlowTaskDto> hisFlowList = new ArrayList<>();
            for (HistoricActivityInstance histIns : list) {
                // 展示开始节点
@@ -855,21 +861,19 @@
                    }
                    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) ) {
                            //如果任务还没完成
                    ProcessCoding processCoding = processCodingMap.get(histIns.getTaskId());
                    if(processCoding!=null){
                        //如果任务是代办节点
                            if(flowTask.getDuration()==null) {
                                //判断当前时间是否超过到期时间
                                if (now.after(dueDate)) flowTask.setOvertime(Boolean.TRUE);
                            }else {
                                //如果任务节点已经完成了,用完成时间判断
                                if(histIns.getEndTime().after(dueDate)) flowTask.setOvertime(Boolean.TRUE);
                            if(RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus())){
                                flowTask.setOvertime(processCoding.getStatus());
                            }
                        }else {
                            //如果任务节点属于历史节点
                            if(RED.equals(processCoding.getStatus())){
                                flowTask.setOvertime(processCoding.getStatus());
                            };
                        }
                    }
                    // 获取意见评论内容
@@ -1117,35 +1121,28 @@
    @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> taskHistoryList = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(procInsId)
                    .finished()
                    .list();
            //获取所有当前任务节点信息(扩展)
            List<Task> taskList = taskService.createTaskQuery()
                    .processInstanceId(procInsId)
                    .list();
            //获取这个流程实例的监控信息 key:TaskId value:实体类
            Map<String, ProcessCoding> processCodingMap = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>().eq("process_ins_id", procInsId))
                    .stream()
                    .collect(Collectors.toMap(ProcessCoding::getTaskId, Function.identity()));
            // 保存已经完成的流程节点编号
            listFinished.forEach(s -> {
                FlowViewerDto flowViewerDto = new FlowViewerDto();
                flowViewerDto.setKey(s.getActivityId());
                flowViewerDto.setCompleted(true);
                //扩展内容 已完成的用完成时间判断
                Date endTime = s.getEndTime();
                for (HistoricTaskInstance task : taskHistoryList) {
                    if(s.getTaskId()!=null && s.getTaskId().equals(task.getId())){
                        if(task.getDueDate()!=null && endTime.after(task.getDueDate())){
                            flowViewerDto.setOvertime(true);
                        }
                    }
                //扩展内容 不反overtime前端默认是绿色
                ProcessCoding processCoding = processCodingMap.get(s.getTaskId());
                //如果有监控数据, 历史节点只判断红码
                if (processCoding != null && RED.equals(processCoding.getStatus())) {
                    flowViewerDto.setOvertime(processCoding.getStatus());
                }
                // 退回节点不进行展示
                if (StringUtils.isBlank(s.getDeleteReason())) {
@@ -1158,7 +1155,6 @@
                    .processInstanceId(procInsId)
                    .unfinished()
                    .list();
            // 保存需要代办的节点编号
            listUnFinished.forEach(s -> {
                // 删除已退回节点
@@ -1166,13 +1162,11 @@
                FlowViewerDto flowViewerDto = new FlowViewerDto();
                flowViewerDto.setKey(s.getActivityId());
                flowViewerDto.setCompleted(false);
                //扩展内容 代办的通过当前时间去判断
                for (Task task : taskList) {
                    if(s.getTaskId()!=null && s.getTaskId().equals(task.getId())){
                        if(task.getDueDate()!=null && now.after(task.getDueDate())){
                            flowViewerDto.setOvertime(true);
                        }
                    }
                // 扩展内容 代办的通过当前时间作为endTime
                ProcessCoding processCoding = processCodingMap.get(s.getTaskId());
                //如果有监控数据 不反的话前端默认是进行中(蓝色)
                if (processCoding != null && (RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus()))) {
                    flowViewerDto.setOvertime(processCoding.getStatus());
                }
                flowViewerList.add(flowViewerDto);
            });
@@ -1185,6 +1179,7 @@
            result.put("xmlData", xmlData);
            return AjaxResult.success(result);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("高亮历史任务失败");
        }
    }
@@ -1277,8 +1272,7 @@
                    if (key.startsWith(formDetailVO.getBeforeNodeDefId())) {
                        if (key.contains(ProcessConstants.TASK_FORM_KEY)) {
                            newP.put(key, parameters.get(key));
                        }
                        else {
                        } else {
                            newP.put(key.split("&")[1], parameters.get(key));
                        }
                    }