流程公共模块优化
parent
dd127896e8
commit
ff602015f3
|
@ -9,6 +9,7 @@ import cn.palmte.work.utils.ActUtil;
|
||||||
import cn.palmte.work.utils.InterfaceUtil;
|
import cn.palmte.work.utils.InterfaceUtil;
|
||||||
import org.activiti.bpmn.model.BpmnModel;
|
import org.activiti.bpmn.model.BpmnModel;
|
||||||
import org.activiti.bpmn.model.FlowNode;
|
import org.activiti.bpmn.model.FlowNode;
|
||||||
|
import org.activiti.bpmn.model.Process;
|
||||||
import org.activiti.bpmn.model.SequenceFlow;
|
import org.activiti.bpmn.model.SequenceFlow;
|
||||||
import org.activiti.engine.HistoryService;
|
import org.activiti.engine.HistoryService;
|
||||||
import org.activiti.engine.RepositoryService;
|
import org.activiti.engine.RepositoryService;
|
||||||
|
@ -25,8 +26,6 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
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.QueryHelper;
|
||||||
import top.jfunc.common.db.bean.Page;
|
import top.jfunc.common.db.bean.Page;
|
||||||
import top.jfunc.common.db.utils.Pagination;
|
import top.jfunc.common.db.utils.Pagination;
|
||||||
|
@ -35,6 +34,7 @@ import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
@ -163,49 +163,39 @@ public class ActProcInsService {
|
||||||
|
|
||||||
public void createProcInsPng(HttpServletResponse response, String procInsId) throws IOException {
|
public void createProcInsPng(HttpServletResponse response, String procInsId) throws IOException {
|
||||||
try {
|
try {
|
||||||
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult(); //获取历史流程实例
|
//获取历史流程实例
|
||||||
|
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult();
|
||||||
//获取流程中已经执行的节点,按照执行先后顺序排序
|
//获取流程中已经执行的节点,按照执行先后顺序排序
|
||||||
List<HistoricActivityInstance> hai = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).orderByHistoricActivityInstanceStartTime().asc().list();
|
List<HistoricActivityInstance> hai = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).orderByHistoricActivityInstanceStartTime().asc().list();
|
||||||
// 历史流程节点中
|
//开始和结束事件
|
||||||
List<HistoricActivityInstance> newHisActInstanceList = new ArrayList<HistoricActivityInstance>();
|
List<HistoricActivityInstance> startEndEventList = new ArrayList<>();
|
||||||
List<HistoricActivityInstance> newHisTaskInstanceList = new ArrayList<HistoricActivityInstance>();
|
List<HistoricActivityInstance> activityInstanceList = new ArrayList<>();
|
||||||
if (hai != null && hai.size() > 0) {
|
|
||||||
for (int i = 0; i < hai.size(); i++) {
|
if (hai != null && !hai.isEmpty()) {
|
||||||
HistoricActivityInstance historicActivityInstance = hai.get(i);
|
for (HistoricActivityInstance historicActivityInstance : hai) {
|
||||||
String activityType = historicActivityInstance.getActivityType();
|
String activityType = historicActivityInstance.getActivityType();
|
||||||
|
|
||||||
if (activityType.equals("startEvent") || activityType.equals("endEvent")) {
|
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")) {
|
} else if (activityType.equals("serviceTask") || activityType.equals("userTask") || activityType.equals("exclusiveGateway") || activityType.equals("parallelGateway")) {
|
||||||
if (newHisTaskInstanceList.size() > 0) {
|
List<String> collect = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList());
|
||||||
for (int j = 0; j < newHisTaskInstanceList.size(); j++) {
|
if (collect.contains(historicActivityInstance.getActivityId())) {
|
||||||
HistoricActivityInstance historicTaskInstance = newHisTaskInstanceList.get(j);
|
//情况已经执行任务 处理驳回的情况
|
||||||
if (historicTaskInstance.getActivityId().equals(historicActivityInstance.getActivityId())) { //如果列表中已包括
|
activityInstanceList.clear();
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> executedActivityIdList = new ArrayList<String>(); // 构造已执行的节点ID集合
|
activityInstanceList.addAll(startEndEventList);
|
||||||
for (HistoricActivityInstance activityInstance : newHisTaskInstanceList) {
|
|
||||||
executedActivityIdList.add(activityInstance.getActivityId());
|
|
||||||
}
|
|
||||||
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取bpmnModel
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取bpmnModel
|
||||||
List<String> flowIds = this.getExecutedFlows(bpmnModel, newHisTaskInstanceList); // 获取流程已发生流转的线ID集合
|
List<String> flowIds = this.getExecutedFlows(bpmnModel, activityInstanceList); // 获取流程已发生流转的线ID集合
|
||||||
actUtil.responsePng(response, bpmnModel, executedActivityIdList, flowIds);
|
|
||||||
|
List<String> idList = activityInstanceList.stream().map(HistoricActivityInstance::getActivityId).collect(Collectors.toList());
|
||||||
|
actUtil.responsePng(response, bpmnModel, idList, flowIds);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("an exception happens in try catch statement", e);
|
logger.error("an exception happens in try catch statement", e);
|
||||||
}
|
}
|
||||||
|
@ -213,35 +203,31 @@ public class ActProcInsService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {
|
public List<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {
|
||||||
List<String> flowIdList = new ArrayList<String>(); //流转线ID集合
|
List<String> flowIdList = new ArrayList<String>(); //流转线ID集合
|
||||||
List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>(); //全部活动实例
|
List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>(); //全部活动实例
|
||||||
List<HistoricActivityInstance> finishedActivityInstanceList = new LinkedList<HistoricActivityInstance>(); //已完成的历史活动节点
|
List<HistoricActivityInstance> finishedActivityInstanceList = new LinkedList<HistoricActivityInstance>(); //已完成的历史活动节点
|
||||||
List list = new ArrayList();
|
List list = new ArrayList();
|
||||||
|
|
||||||
|
Process mainProcess = bpmnModel.getMainProcess();
|
||||||
for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
|
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) {
|
if (historicActivityInstance.getEndTime() != null) {
|
||||||
finishedActivityInstanceList.add(historicActivityInstance);
|
finishedActivityInstanceList.add(historicActivityInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
for (int x = 0; x < historicActivityInstances.size(); x++) {
|
|
||||||
HistoricActivityInstance historicActivityInstance = historicActivityInstances.get(x);
|
|
||||||
String activityType = historicActivityInstance.getActivityType();
|
|
||||||
String activityId = historicActivityInstance.getActivityId();
|
String activityId = historicActivityInstance.getActivityId();
|
||||||
if (!list.contains(activityId) && ("userTask".equals(activityType)
|
if (!list.contains(activityId)) {
|
||||||
|| "serviceTask".equals(activityType)
|
|
||||||
|| "endEvent".equals(activityType)
|
|
||||||
|| "exclusiveGateway".equals(activityType)
|
|
||||||
|| "parallelGateway".equals(activityType))) {
|
|
||||||
list.add(activityId);
|
list.add(activityId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/
|
/**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/
|
||||||
FlowNode currentFlowNode = null;
|
FlowNode currentFlowNode = null;
|
||||||
for (HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) {
|
for (HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) {
|
||||||
/**获得当前活动对应的节点信息及outgoingFlows信息*/
|
/**获得当前活动对应的节点信息及outgoingFlows信息*/
|
||||||
currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
|
currentFlowNode = (FlowNode) mainProcess.getFlowElement(currentActivityInstance.getActivityId(), true);
|
||||||
List<SequenceFlow> sequenceFlowList = currentFlowNode.getOutgoingFlows();
|
List<SequenceFlow> sequenceFlowList = currentFlowNode.getOutgoingFlows();
|
||||||
/**
|
/**
|
||||||
* 遍历outgoingFlows并找到已流转的
|
* 遍历outgoingFlows并找到已流转的
|
||||||
|
@ -250,17 +236,15 @@ public class ActProcInsService {
|
||||||
* 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转
|
* 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转
|
||||||
*/
|
*/
|
||||||
FlowNode targetFlowNode = null;
|
FlowNode targetFlowNode = null;
|
||||||
if ("parallelGateway".equals(currentActivityInstance.getActivityType())
|
if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
|
||||||
|| "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
|
|
||||||
for (SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
|
for (SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
|
||||||
targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
|
targetFlowNode = (FlowNode) mainProcess.getFlowElement(sequenceFlow.getTargetRef(), true);
|
||||||
if (historicFlowNodeList.contains(targetFlowNode)) {
|
if (historicFlowNodeList.contains(targetFlowNode)) {
|
||||||
flowIdList.add(sequenceFlow.getId());
|
flowIdList.add(sequenceFlow.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
List<Map<String, String>> tempMapList = new LinkedList<Map<String, String>>();
|
List<Map<String, String>> tempMapList = new LinkedList<Map<String, String>>();
|
||||||
// for(SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
|
|
||||||
for (int i = 0; i < sequenceFlowList.size(); i++) { //遍历历史活动节点,找到匹配Flow目标节点的
|
for (int i = 0; i < sequenceFlowList.size(); i++) { //遍历历史活动节点,找到匹配Flow目标节点的
|
||||||
SequenceFlow sequenceFlow = sequenceFlowList.get(i);
|
SequenceFlow sequenceFlow = sequenceFlowList.get(i);
|
||||||
int taskSeq = list.indexOf(sequenceFlow.getSourceRef()); // 获取当前flow目标节点key在审批顺序
|
int taskSeq = list.indexOf(sequenceFlow.getSourceRef()); // 获取当前flow目标节点key在审批顺序
|
||||||
|
@ -287,9 +271,9 @@ public class ActProcInsService {
|
||||||
flowId = map.get("flowId");
|
flowId = map.get("flowId");
|
||||||
flowIdList.add(flowId);
|
flowIdList.add(flowId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return flowIdList;
|
return flowIdList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import top.jfunc.common.utils.IoUtil;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
@ -180,7 +181,9 @@ public class ActUtil {
|
||||||
*/
|
*/
|
||||||
public void responseXml(HttpServletResponse response, String deploymentId) throws IOException {
|
public void responseXml(HttpServletResponse response, String deploymentId) throws IOException {
|
||||||
try (InputStream inputStream = getXmlStreamByDeploymentId(deploymentId)) {
|
try (InputStream inputStream = getXmlStreamByDeploymentId(deploymentId)) {
|
||||||
|
IoUtil.copy(new ByteArrayInputStream("<xmp>".getBytes()), response.getOutputStream());
|
||||||
IoUtil.copy(inputStream, response.getOutputStream());
|
IoUtil.copy(inputStream, response.getOutputStream());
|
||||||
|
IoUtil.copy(new ByteArrayInputStream("</xmp>".getBytes()), response.getOutputStream());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,13 +271,8 @@ public class ActUtil {
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private InputStream getXmlStreamByDeploymentId(String deploymentId) throws IOException {
|
private InputStream getXmlStreamByDeploymentId(String deploymentId) throws IOException {
|
||||||
List<String> names = repositoryService.getDeploymentResourceNames(deploymentId);
|
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
|
||||||
for (String name : names) {
|
return repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
|
||||||
if (name.contains("xml")) {
|
|
||||||
return repositoryService.getResourceAsStream(deploymentId, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -86,10 +86,11 @@
|
||||||
|
|
||||||
<button type="button"
|
<button type="button"
|
||||||
class="am-btn am-btn-default am-btn-xs am-text-secondary"
|
class="am-btn am-btn-default am-btn-xs am-text-secondary"
|
||||||
onclick="window.open('${base}/actProcDef/xml/${list.deploymentId!}')">
|
onclick="xmlView('${list.deploymentId!}')">
|
||||||
<span class="am-icon-pencil-square-o"></span>
|
<span class="am-icon-pencil-square-o"></span>
|
||||||
流程xml
|
流程xml
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="switch-button">
|
<div class="switch-button">
|
||||||
|
@ -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,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
</script>
|
</script>
|
Loading…
Reference in New Issue