diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java index 78cd47d..944d33b 100644 --- a/src/main/java/cn/palmte/work/service/ActProcInsService.java +++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java @@ -163,39 +163,49 @@ public class ActProcInsService { public void createProcInsPng(HttpServletResponse response, String procInsId) throws IOException { try { - //获取历史流程实例 - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult(); //获取历史流程实例 //获取流程中已经执行的节点,按照执行先后顺序排序 List hai = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).orderByHistoricActivityInstanceStartTime().asc().list(); - //开始和结束事件 - List startEndEventList = new ArrayList<>(); - List activityInstanceList = new ArrayList<>(); - - if (hai != null && !hai.isEmpty()) { - for (HistoricActivityInstance historicActivityInstance : hai) { + // 历史流程节点中 + List newHisActInstanceList = new ArrayList(); + List newHisTaskInstanceList = new ArrayList(); + if (hai != null && hai.size() > 0) { + for (int i = 0; i < hai.size(); i++) { + HistoricActivityInstance historicActivityInstance = hai.get(i); String activityType = historicActivityInstance.getActivityType(); - if (activityType.equals("startEvent") || activityType.equals("endEvent")) { - startEndEventList.add(historicActivityInstance); + newHisActInstanceList.add(historicActivityInstance); } else if (activityType.equals("serviceTask") || activityType.equals("userTask") || activityType.equals("exclusiveGateway") || activityType.equals("parallelGateway")) { - List collect = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList()); - if (collect.contains(historicActivityInstance.getActivityId())) { - //情况已经执行任务 处理驳回的情况 - activityInstanceList.clear(); + if (newHisTaskInstanceList.size() > 0) { + for (int j = 0; j < newHisTaskInstanceList.size(); j++) { + HistoricActivityInstance historicTaskInstance = newHisTaskInstanceList.get(j); + if (historicTaskInstance.getActivityId().equals(historicActivityInstance.getActivityId())) { //如果列表中已包括 + newHisTaskInstanceList.clear(); + newHisTaskInstanceList.add(historicActivityInstance); + break; + } else { + newHisTaskInstanceList.add(historicActivityInstance); + break; + } + } + } else { + newHisTaskInstanceList.add(historicActivityInstance); } - - activityInstanceList.add(historicActivityInstance); } } } + for (int i = 0; i < newHisActInstanceList.size(); i++) { + HistoricActivityInstance historicActivityInstance = newHisActInstanceList.get(i); + newHisTaskInstanceList.add(historicActivityInstance); + } - activityInstanceList.addAll(startEndEventList); - + List executedActivityIdList = new ArrayList(); // 构造已执行的节点ID集合 + for (HistoricActivityInstance activityInstance : newHisTaskInstanceList) { + executedActivityIdList.add(activityInstance.getActivityId()); + } BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取bpmnModel - List flowIds = this.getExecutedFlows(bpmnModel, activityInstanceList); // 获取流程已发生流转的线ID集合 - - List idList = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList()); - actUtil.responsePng(response, bpmnModel, idList, flowIds); + List flowIds = this.getExecutedFlows(bpmnModel, newHisTaskInstanceList); // 获取流程已发生流转的线ID集合 + actUtil.responsePng(response, bpmnModel, executedActivityIdList, flowIds); } catch (Exception e) { logger.error("an exception happens in try catch statement", e); } @@ -203,31 +213,35 @@ public class ActProcInsService { } public List getExecutedFlows(BpmnModel bpmnModel, List historicActivityInstances) { - List flowIdList = new ArrayList(); //流转线ID集合 + List flowIdList = new ArrayList(); //流转线ID集合 List historicFlowNodeList = new LinkedList(); //全部活动实例 List finishedActivityInstanceList = new LinkedList(); //已完成的历史活动节点 List list = new ArrayList(); - Process mainProcess = bpmnModel.getMainProcess(); for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) { - FlowNode flowElement = (FlowNode) mainProcess.getFlowElement(historicActivityInstance.getActivityId(), true); - historicFlowNodeList.add(flowElement); - + historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true)); if (historicActivityInstance.getEndTime() != null) { finishedActivityInstanceList.add(historicActivityInstance); } + } + for (int x = 0; x < historicActivityInstances.size(); x++) { + HistoricActivityInstance historicActivityInstance = historicActivityInstances.get(x); + String activityType = historicActivityInstance.getActivityType(); String activityId = historicActivityInstance.getActivityId(); - if (!list.contains(activityId)) { + if (!list.contains(activityId) && ("userTask".equals(activityType) + || "serviceTask".equals(activityType) + || "endEvent".equals(activityType) + || "exclusiveGateway".equals(activityType) + || "parallelGateway".equals(activityType))) { list.add(activityId); } } - /**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/ FlowNode currentFlowNode = null; for (HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) { /**获得当前活动对应的节点信息及outgoingFlows信息*/ - currentFlowNode = (FlowNode) mainProcess.getFlowElement(currentActivityInstance.getActivityId(), true); + currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true); List sequenceFlowList = currentFlowNode.getOutgoingFlows(); /** * 遍历outgoingFlows并找到已流转的 @@ -236,15 +250,17 @@ public class ActProcInsService { * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转 */ FlowNode targetFlowNode = null; - if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) { + if ("parallelGateway".equals(currentActivityInstance.getActivityType()) + || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) { for (SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的 - targetFlowNode = (FlowNode) mainProcess.getFlowElement(sequenceFlow.getTargetRef(), true); + targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true); if (historicFlowNodeList.contains(targetFlowNode)) { flowIdList.add(sequenceFlow.getId()); } } } else { List> tempMapList = new LinkedList>(); +// for(SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的 for (int i = 0; i < sequenceFlowList.size(); i++) { //遍历历史活动节点,找到匹配Flow目标节点的 SequenceFlow sequenceFlow = sequenceFlowList.get(i); int taskSeq = list.indexOf(sequenceFlow.getSourceRef()); // 获取当前flow目标节点key在审批顺序 @@ -271,9 +287,9 @@ public class ActProcInsService { flowId = map.get("flowId"); flowIdList.add(flowId); } + } } - return flowIdList; } }