jiangbiao 2 éve
szülő
commit
dc34af3476

+ 95 - 23
master/src/main/java/com/ruoyi/project/ehs/controller/TApproveDangerController.java

@@ -1,40 +1,40 @@
 package com.ruoyi.project.ehs.controller;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URLDecoder;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
 import com.alibaba.fastjson.JSON;
-import com.ruoyi.common.utils.file.FileUploadUtils;
 import com.ruoyi.common.utils.http.HttpContextUtils;
-import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.project.apply.domain.TApplyOfflinevalve;
 import com.ruoyi.project.apply.domain.TApplySafetychange;
 import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
 import com.ruoyi.project.apply.service.ITApplySafetychangeService;
 import com.ruoyi.project.approve.damain.DevProcess;
 import com.ruoyi.project.approve.damain.DevTask;
-import com.ruoyi.project.common.domain.TCommonfile;
 import com.ruoyi.project.common.service.ITCommonfileService;
 import com.ruoyi.project.ehs.domain.TApproveAccident;
+import com.ruoyi.project.ehs.domain.TApproveDanger;
 import com.ruoyi.project.ehs.service.ITApproveAccidentService;
+import com.ruoyi.project.ehs.service.ITApproveDangerService;
 import com.ruoyi.project.intact.domain.TApproveMaintenance;
 import com.ruoyi.project.intact.domain.TIntactApprove;
 import com.ruoyi.project.intact.service.ITApproveMaintenanceService;
 import com.ruoyi.project.intact.service.ITIntactApproveService;
 import com.ruoyi.project.invoice.domain.TApproveReserveInvoice;
 import com.ruoyi.project.invoice.service.ITApproveReserveInvoiceService;
-import com.ruoyi.project.listener.*;
+import com.ruoyi.project.listener.EndSucessListener;
+import com.ruoyi.project.listener.ExecutorTaskCreateListener;
+import com.ruoyi.project.listener.RecorderTaskCreateListener;
+import com.ruoyi.project.listener.VerificationTaskCreateListener;
 import com.ruoyi.project.reliability.domain.TKekaoApprove;
 import com.ruoyi.project.reliability.service.ITKekaoApproveService;
 import com.ruoyi.project.sems.domain.TApprove;
 import com.ruoyi.project.sems.his.domain.TApproveSpecModify;
 import com.ruoyi.project.sems.his.service.ITApproveSpecModifyService;
 import com.ruoyi.project.sems.service.ITApproveService;
-import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.domain.SysUserRole;
 import com.ruoyi.project.system.service.ISysUserService;
@@ -56,20 +56,17 @@ import org.activiti.engine.task.Comment;
 import org.activiti.engine.task.Task;
 import org.activiti.image.impl.DefaultProcessDiagramGenerator;
 import org.apache.commons.collections.CollectionUtils;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.project.ehs.domain.TApproveDanger;
-import com.ruoyi.project.ehs.service.ITApproveDangerService;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 隐患申请Controller
@@ -731,8 +728,13 @@ public class TApproveDangerController extends BaseController {
         for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
             highLightedActivitiIds.add(historicActivityInstance.getActivityId());
         }
+        //获取已完成的节点
+        List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery()
+                .processInstanceId(processId)
+                .finished().list();
         //高亮线路id集合
-        List<String> highLightedFlowIds = getHighLightedFlows(bpmnModel, historicActivityInstances);
+//        List<String> highLightedFlowIds = getHighLightedFlows(bpmnModel, historicActivityInstances);
+        List<String> highLightedFlowIds = getHighLine(bpmnModel, historicActivityInstances,finished);
         DefaultProcessDiagramGenerator generator = new DefaultProcessDiagramGenerator();
 
 //     生成流程图
@@ -834,4 +836,74 @@ public class TApproveDangerController extends BaseController {
         }
         return highLightedFlowIds;
     }
+
+    private List<String> getHighLine(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances, List<HistoricActivityInstance> finishedActivityInstances) {
+
+        // 高亮流程已发生流转的线id集合
+        List<String> highLightedFlowIds = new ArrayList<>();
+        // 全部活动节点
+        List<FlowNode> historicActivityNodes = new ArrayList<>();
+
+        //1、拿到所有的活动节点定义
+        for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
+            FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
+            historicActivityNodes.add(flowNode);
+        }
+
+        FlowNode currentFlowNode;
+        FlowNode targetFlowNode;
+        // 2、遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的
+        for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) {
+            // 获得当前活动对应的节点信息及outgoingFlows信息
+            currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
+            List<SequenceFlow> outgoingFlows = currentFlowNode.getOutgoingFlows();
+
+            /*
+             * 遍历outgoingFlows并找到已流转的 满足如下条件认为已已流转:
+             * 1.当前节点是并行网关或包含网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转
+             * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的开始时间最早的流转节点视为有效流转
+             */
+            String activityType = currentActivityInstance.getActivityType();
+
+            if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
+                // 遍历历史活动节点,找到匹配流程目标节点的
+                for (SequenceFlow sequenceFlow : outgoingFlows) {
+                    targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
+                    if (historicActivityNodes.contains(targetFlowNode)) {
+                        highLightedFlowIds.add(targetFlowNode.getId());
+                    }
+                }
+                continue;
+            }
+
+            //1、拿到所有的TargetRef
+            List<String> targetRefList = outgoingFlows.stream()
+                    .map(SequenceFlow::getTargetRef)
+                    .collect(Collectors.toList());
+
+            //2、拿到ActivityId == TargetRef的所有 HistoricActivityInstance
+            List<HistoricActivityInstance> historicActivityInstanceList = historicActivityInstances.stream()
+                    .filter((HistoricActivityInstance instance) -> targetRefList.contains(instance.getActivityId()))
+                    .collect(Collectors.toList());
+
+            //3、开始时间>=当前节点结束时间的第一个 HistoricActivityInstance
+            List<HistoricActivityInstance> historicActivityInstanceResultList = historicActivityInstanceList.stream()
+                    .filter(historicActivityInstance -> historicActivityInstance.getStartTime()
+                            .compareTo(currentActivityInstance.getEndTime()) >= 0)
+                    .sorted(Comparator.comparing(HistoricActivityInstance::getStartTime))
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(historicActivityInstanceResultList)) {
+                continue;
+            }
+
+            HistoricActivityInstance historicActivityInstanceResult = historicActivityInstanceResultList.get(0);
+
+            //4、HistoricActivityInstance拿到flowid
+            List<SequenceFlow> sequenceFlowList = outgoingFlows.stream()
+                    .filter(sequenceFlow -> sequenceFlow.getTargetRef().equals(historicActivityInstanceResult.getActivityId()))
+                    .collect(Collectors.toList());
+            highLightedFlowIds.addAll(sequenceFlowList.stream().map(e->e.getId()).collect(Collectors.toList()));
+        }
+        return highLightedFlowIds;
+    }
 }