From ff602015f3a596bb9aca6e83c6e25c6c993b6503 Mon Sep 17 00:00:00 2001 From: pengqiang Date: Thu, 18 Nov 2021 10:53:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=85=AC=E5=85=B1=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work/service/ActProcInsService.java | 86 ++++++++----------- .../java/cn/palmte/work/utils/ActUtil.java | 12 ++- .../templates/admin/act_proc_def_list.ftl | 14 ++- 3 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java index b65bf49..78cd47d 100644 --- a/src/main/java/cn/palmte/work/service/ActProcInsService.java +++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java @@ -9,6 +9,7 @@ import cn.palmte.work.utils.ActUtil; import cn.palmte.work.utils.InterfaceUtil; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.FlowNode; +import org.activiti.bpmn.model.Process; import org.activiti.bpmn.model.SequenceFlow; import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; @@ -25,8 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; import top.jfunc.common.db.QueryHelper; import top.jfunc.common.db.bean.Page; import top.jfunc.common.db.utils.Pagination; @@ -35,6 +34,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; @Service @@ -163,49 +163,39 @@ 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 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); + //开始和结束事件 + List startEndEventList = new ArrayList<>(); + List activityInstanceList = new ArrayList<>(); + + if (hai != null && !hai.isEmpty()) { + for (HistoricActivityInstance historicActivityInstance : hai) { String activityType = historicActivityInstance.getActivityType(); + if (activityType.equals("startEvent") || activityType.equals("endEvent")) { - newHisActInstanceList.add(historicActivityInstance); + startEndEventList.add(historicActivityInstance); } else if (activityType.equals("serviceTask") || activityType.equals("userTask") || activityType.equals("exclusiveGateway") || activityType.equals("parallelGateway")) { - 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); + List collect = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList()); + if (collect.contains(historicActivityInstance.getActivityId())) { + //情况已经执行任务 处理驳回的情况 + activityInstanceList.clear(); } + + activityInstanceList.add(historicActivityInstance); } } } - for (int i = 0; i < newHisActInstanceList.size(); i++) { - HistoricActivityInstance historicActivityInstance = newHisActInstanceList.get(i); - newHisTaskInstanceList.add(historicActivityInstance); - } - List executedActivityIdList = new ArrayList(); // 构造已执行的节点ID集合 - for (HistoricActivityInstance activityInstance : newHisTaskInstanceList) { - executedActivityIdList.add(activityInstance.getActivityId()); - } + activityInstanceList.addAll(startEndEventList); + BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取bpmnModel - List flowIds = this.getExecutedFlows(bpmnModel, newHisTaskInstanceList); // 获取流程已发生流转的线ID集合 - actUtil.responsePng(response, bpmnModel, executedActivityIdList, flowIds); + List flowIds = this.getExecutedFlows(bpmnModel, activityInstanceList); // 获取流程已发生流转的线ID集合 + + List idList = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList()); + actUtil.responsePng(response, bpmnModel, idList, flowIds); } catch (Exception e) { logger.error("an exception happens in try catch statement", e); } @@ -213,35 +203,31 @@ 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) { - historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true)); + FlowNode flowElement = (FlowNode) mainProcess.getFlowElement(historicActivityInstance.getActivityId(), true); + historicFlowNodeList.add(flowElement); + 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) && ("userTask".equals(activityType) - || "serviceTask".equals(activityType) - || "endEvent".equals(activityType) - || "exclusiveGateway".equals(activityType) - || "parallelGateway".equals(activityType))) { + if (!list.contains(activityId)) { list.add(activityId); } } + /**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/ FlowNode currentFlowNode = null; for (HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) { /**获得当前活动对应的节点信息及outgoingFlows信息*/ - currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true); + currentFlowNode = (FlowNode) mainProcess.getFlowElement(currentActivityInstance.getActivityId(), true); List sequenceFlowList = currentFlowNode.getOutgoingFlows(); /** * 遍历outgoingFlows并找到已流转的 @@ -250,17 +236,15 @@ 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) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true); + targetFlowNode = (FlowNode) mainProcess.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在审批顺序 @@ -287,9 +271,9 @@ public class ActProcInsService { flowId = map.get("flowId"); flowIdList.add(flowId); } - } } + return flowIdList; } } diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java index 341aa57..b54b9cc 100644 --- a/src/main/java/cn/palmte/work/utils/ActUtil.java +++ b/src/main/java/cn/palmte/work/utils/ActUtil.java @@ -29,6 +29,7 @@ import top.jfunc.common.utils.IoUtil; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; @@ -180,7 +181,9 @@ public class ActUtil { */ public void responseXml(HttpServletResponse response, String deploymentId) throws IOException { try (InputStream inputStream = getXmlStreamByDeploymentId(deploymentId)) { + IoUtil.copy(new ByteArrayInputStream("".getBytes()), response.getOutputStream()); IoUtil.copy(inputStream, response.getOutputStream()); + IoUtil.copy(new ByteArrayInputStream("".getBytes()), response.getOutputStream()); } } @@ -268,13 +271,8 @@ public class ActUtil { * @throws IOException */ private InputStream getXmlStreamByDeploymentId(String deploymentId) throws IOException { - List names = repositoryService.getDeploymentResourceNames(deploymentId); - for (String name : names) { - if (name.contains("xml")) { - return repositoryService.getResourceAsStream(deploymentId, name); - } - } - return null; + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); + return repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName()); } diff --git a/src/main/resources/templates/admin/act_proc_def_list.ftl b/src/main/resources/templates/admin/act_proc_def_list.ftl index ff15939..38a084b 100644 --- a/src/main/resources/templates/admin/act_proc_def_list.ftl +++ b/src/main/resources/templates/admin/act_proc_def_list.ftl @@ -86,10 +86,11 @@ +
@@ -280,4 +281,15 @@ }); }; + var xmlView = function (id) { + layer.open({ + type: 2, + title: '', + shadeClose: true, + shade: 0.8, + area: ['90%', '90%'], + content: '${base}/actProcDef/xml/' + id, + }); + }; + \ No newline at end of file