并行网关
并行网关的流程图
需求背景
要求:需要实现A驳回到B;C驳回到D,同时消掉AB段的待办,E驳回到D
要求:B->A;C/D->H 并且消除A/B的待办;E到H,并消除A/B的待办;F/G->H
java代码实现
// 驳回操作
List<ActivityImpl> listAct = findBackAvtivity(task.getId());
if (listAct != null && listAct.size() > 0) {
String backActId = listAct.get(listAct.size()-1).getId();
String type1 = (String)listAct.get(listAct.size()-1).getOutgoingTransitions().get(0).getDestination().getProperty("type");
if ("parallelGateway".equals(listAct.get(listAct.size()-1).getOutgoingTransitions().get(0).getDestination().getProperty("type"))) {
for (ActivityImpl act : listAct) {
String type = (String) act.getOutgoingTransitions().get(0).getDestination().getProperty("type");
if ("parallelGateway".equals(type)) {
// 并行路线
String gatewayId=act.getOutgoingTransitions().get(0).getDestination().getId();//并行网关的前一节点判断,并行网关id必须以_start结尾
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("START")){
backActId = act.getId();
variables.put("gatType", "parallelGateway");//对于并行网关第一个节点退回做判断参数
}
}else{
type = (String) act.getIncomingTransitions().get(0).getDestination().getProperty("type");
if ("parallelGateway".equals(type)) {
// 并行路线
String gatewayId=act.getIncomingTransitions().get(0).getDestination().getId();//并行网关的后一节点判断,如果网关已经结束,则退回上一节点
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("END")){
backActId = listAct.get(listAct.size()-1).getId();
}
}
}
}
}else if("inclusiveGateway".equals(listAct.get(listAct.size()-1).getOutgoingTransitions().get(0).getDestination().getProperty("type"))){
for (ActivityImpl act : listAct) {
String type = (String) act.getOutgoingTransitions().get(0).getDestination().getProperty("type");
List<PvmTransition> outgoingTransitions = act.getOutgoingTransitions().get(0).getDestination().getOutgoingTransitions();
//包含网关里含有并行网关
for(PvmTransition transition : outgoingTransitions){
if("inclusiveGateway".equals(transition.getDestination().getProperty("type"))){
type = "inclusiveGateway";break;
}
}
if ("inclusiveGateway".equals(type)) {
// 并行路线
String gatewayId=act.getOutgoingTransitions().get(0).getDestination().getId();//包含网关的前一节点判断,并行网关id必须以_start结尾
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("START")){
backActId = act.getId();
variables.put("gatType", "inclusiveGateway");//对于包含网关第一个节点退回做判断参数
}
}else if("inclusiveGateway".equals(type)){
variables.put("gatType", "inclusiveGateway");//对于包含网关第一个节点退回做判断参数
}else{
type = (String) act.getIncomingTransitions().get(0).getDestination().getProperty("type");
if ("inclusiveGateway".equals(type)) {
// 并行路线
String gatewayId=act.getIncomingTransitions().get(0).getDestination().getId();//包含网关的后一节点判断,如果网关已经结束,则退回上一节点
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("END")){
backActId = listAct.get(listAct.size()-1).getId();
}
}
}
}
}
this.backProcess(taskId, backActId, variables);
} else {
this.backProcess(taskId, lastActKey, variables);
}
/**
* 根据当前任务ID,查询可以驳回的任务节点
*/
public List<ActivityImpl> findBackAvtivity(String taskId) throws Exception {
List<ActivityImpl> rtnList = null;
rtnList = iteratorBackActivity(taskId, findActivitiImpl(taskId, null), new ArrayList<ActivityImpl>(), new ArrayList<ActivityImpl>());
return reverList(rtnList);
}
/**
* 迭代循环流程树结构,查询当前节点可驳回的任务节点
*/
private List<ActivityImpl> iteratorBackActivity(String taskId,
ActivityImpl currActivity, List<ActivityImpl> rtnList,
List<ActivityImpl> tempList) throws Exception {
ProcessInstance processInstance = findProcessInstanceByTaskId(taskId);
List<PvmTransition> incomingTransitions = currActivity.getIncomingTransitions();
List<ActivityImpl> exclusiveGateways = new ArrayList<ActivityImpl>();
List<ActivityImpl> parallelGateways = new ArrayList<ActivityImpl>();
for (PvmTransition pvmTransition : incomingTransitions) {
TransitionImpl transitionImpl = (TransitionImpl) pvmTransition;
ActivityImpl activityImpl = transitionImpl.getSource();
String type = (String) activityImpl.getProperty("type");
List<PvmTransition> pvmTransitionList = activityImpl.getIncomingTransitions();
String floorType = pvmTransitionList.size() > 0 ? (String) pvmTransitionList.get(0).getSource().getProperty("type") : "";
if("parallelGateway".equals(floorType)){
String gatewayId = pvmTransitionList.get(0).getSource().getId();
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("START")) {// 并行起点,停止递归 改为暂存不停止
parallelGateways.add(activityImpl);break;
} else {// 并行终点,临时存储此节点,本次循环结束,迭代集合,查询对应的userTask节点
parallelGateways.add(activityImpl);
}
}else{
if ("parallelGateway".equals(type)) {// 并行路线
String gatewayId = activityImpl.getId();
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("START")) {// 并行起点,停止递归 改为暂存不停止
parallelGateways.add(activityImpl);
} else {// 并行终点,临时存储此节点,本次循环结束,迭代集合,查询对应的userTask节点
parallelGateways.add(activityImpl);
}
} else if ("startEvent".equals(type)) {// 开始节点,停止递归
return rtnList;
} else if ("userTask".equals(type)) {// 用户任务
tempList.add(activityImpl);
} else if ("exclusiveGateway".equals(type)) {// 分支路线,临时存储此节点,本次循环结束,迭代集合,查询对应的userTask节点
currActivity = transitionImpl.getSource();
exclusiveGateways.add(currActivity);
}else if("inclusiveGateway".equals(type)){// 包含路线
String gatewayId = activityImpl.getId();
String gatewayType = gatewayId.substring(gatewayId.lastIndexOf("_") + 1);
if (gatewayType.toUpperCase().contains("START")) {// 并行起点,停止递归 改为暂存不停止
parallelGateways.add(activityImpl);
} else {// 并行终点,临时存储此节点,本次循环结束,迭代集合,查询对应的userTask节点
parallelGateways.add(activityImpl);
}
}
}
}
for (ActivityImpl activityImpl : exclusiveGateways) {
iteratorBackActivity(taskId, activityImpl, rtnList, tempList);
}
for (ActivityImpl activityImpl : parallelGateways) {
iteratorBackActivity(taskId, activityImpl, rtnList, tempList);
}
currActivity = filterNewestActivity(processInstance, tempList);
if (currActivity != null) {
String id = findParallelGatewayId(currActivity);
if (StringUtils.isEmpty(id)) {// 并行起点ID为空,此节点流向不是并行终点,符合驳回条件,存储此节点
rtnList.add(currActivity);
} else {// 根据并行起点ID查询当前节点,然后迭代查询其对应的userTask任务节点
currActivity = findActivitiImpl(taskId, id);
}
tempList.clear();
iteratorBackActivity(taskId, currActivity, rtnList, tempList);
}
return rtnList;
}
/**
* 根据当前节点,查询输出流向是否为并行终点,如果为并行终点,则拼装对应的并行起点ID
*/
private String findParallelGatewayId(ActivityImpl activityImpl) {
List<PvmTransition> incomingTransitions = activityImpl
.getOutgoingTransitions();
for (PvmTransition pvmTransition : incomingTransitions) {
TransitionImpl transitionImpl = (TransitionImpl) pvmTransition;
activityImpl = transitionImpl.getDestination();
String type = (String) activityImpl.getProperty("type");
if ("parallelGateway".equals(type)) {// 并行路线
String gatewayId = activityImpl.getId();
String gatewayType = gatewayId.substring(gatewayId
.lastIndexOf("_") + 1);
if ("END".equals(gatewayType.toUpperCase())) {
return gatewayId.substring(0, gatewayId.lastIndexOf("_"))
+ "_start";
}
}
}
return null;
}
小结:第一次写这个,没什么经验,网上有关这个的资料不多,大家多多关照