对于activity引擎的并行流程的驳回问题

并行网关

并行网关的流程图

需求背景

在这里插入图片描述
要求:需要实现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;  
}

小结:第一次写这个,没什么经验,网上有关这个的资料不多,大家多多关照

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值