怎么获取排他网关下的所有userTask?

前面文正有写过根据当前节点获取下一个UseTask节点,有需要了解的可以去看这篇博客根据当前节点获取下一个UseTask节点,,但是现在需求又发生了该表,如果在一个节点下需要获取排他网关下所有的userTask怎么办?
这里还需要将需求分成两种
1、排他网关后面只有userTask,如下图所示
这里写图片描述
这种情况,当到达财务审批时,需要财务选择需要通过财务总监还是直接到发货,由于财务后面的排他网关后面直接跟着两个userTask,这时要获取排他网关后面的userTask可以通过下面的代码实现。

/*** 获取排他网关的所有下一个UserTask* * @param activityImpl* @param processInstanceId* @return*/public Map getGateWayNextTaskInfo(String processInstanceId) {ProcessDefinitionEntity processDefinitionEntity = null;String id = null;// 获取流程发布Id信息String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();// 当前流程节点Id信息String activitiId = execution.getActivityId();// 获取流程所有节点信息List activitiList = processDefinitionEntity.getActivities();Map map = null;// 遍历所有节点信息for (ActivityImpl activityImpl : activitiList) {id = activityImpl.getId();if (activitiId.equals(id)) {map = getGateWay(activityImpl);break;}}return map;}/*** 获取排他网关的所有分支信息* @param activityImpl* @return*/public Map getGateWay(ActivityImpl activityImpl) {Map maps = new HashMap();// 获取节点所有流向线路信息List outTransitions = activityImpl.getOutgoingTransitions();List outTransitionsTemp = null;for (PvmTransition tr : outTransitions) {PvmActivity ac = tr.getDestination(); // 获取线路的终点节点// 如果流向线路为排他网关if ("exclusiveGateway".equals(ac.getProperty("type"))) {outTransitionsTemp = ac.getOutgoingTransitions();// 如果排他网关只有一条线路信息if (outTransitionsTemp.size() == 1) {String s = (String) outTransitions.get(0).getProperty("conditionText");String name = (String) outTransitions.get(0).getDestination().getProperty("name");String taskId = (String) outTransitions.get(0).getDestination().getId();maps.put(s, new CandidateTaskInfo(name, taskId));} else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息for (PvmTransition tr1 : outTransitionsTemp) {String s = (String)tr1.getProperty("conditionText");String name = (String) tr1.getDestination().getProperty("name");String taskId = (String) tr1.getDestination().getId();String str = s.split("==")[1];if(StringUtils.contains(str, "\'")||StringUtils.contains(str, "\"")) {// =='xxxx'或者=="xxxx"maps.put(str.substring(1, str.length()-2), new CandidateTaskInfo(name, taskId));}else {// == true or falsemaps.put(str.substring(0, str.length()-1), new CandidateTaskInfo(name, taskId));}}}}}return maps;}

第一种情形使用这种方法可以解决。
2、排他网关除了userTask还有排他网关,怎么正确获取当前节点后面的userTask?如下图所示:
这里写图片描述
这种情形就需要在方案一的条件下进行修改,当遇到排他网关是,在获取排他网关下一个userTask,参考前面的博文。
代码:

/*** 下一个任务节点信息,* * 如果下一个节点为用户任务则直接返回,* * 如果下一个节点为排他网关, 获取排他网关Id信息, 根据排他网关Id信息和execution获取流程实例排他网关Id为key的变量值,* 根据变量值分别执行排他网关后线路中的el表达式, 并找到el表达式通过的线路后的用户任务* * @param ActivityImpl*            activityImpl 流程节点信息* @param String*            activityId 当前流程节点Id信息* @param String*            elString 排他网关顺序流线段判断条件* @param String*            processInstanceId 流程实例Id信息* @return*/public TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString,String processInstanceId) {PvmActivity ac = null;Object s = null;// 如果遍历节点为用户任务并且节点不是当前节点信息if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {// 获取该节点下一个节点信息TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior()).getTaskDefinition();return taskDefinition;} else if ("exclusiveGateway".equals(activityImpl.getProperty("type"))) {// 当前节点为exclusiveGatewayList outTransitions = activityImpl.getOutgoingTransitions();// 获取流程启动时设置的网关判断条件信息elString = getGatewayCondition(activityImpl.getId(), processInstanceId);// 如果排他网关只有一条线路信息if (outTransitions.size() == 1) {return nextTaskDefinition((ActivityImpl) outTransitions.get(0).getDestination(), activityId, elString,processInstanceId);} else if (outTransitions.size() > 1) { // 如果排他网关有多条线路信息for (PvmTransition tr1 : outTransitions) {s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息// 判断el表达式是否成立if (isCondition(activityImpl.getId(), StringUtils.trim(s.toString()), elString)) {return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,processInstanceId);}}}} else {// 获取节点所有流向线路信息List outTransitions = activityImpl.getOutgoingTransitions();List outTransitionsTemp = null;for (PvmTransition tr : outTransitions) {ac = tr.getDestination(); // 获取线路的终点节点// 如果流向线路为排他网关if ("exclusiveGateway".equals(ac.getProperty("type"))) {outTransitionsTemp = ac.getOutgoingTransitions();// 如果网关路线判断条件为空信息if (StringUtils.isEmpty(elString)) {// 获取流程启动时设置的网关判断条件信息elString = getGatewayCondition(ac.getId(), processInstanceId);}// 如果排他网关只有一条线路信息if (outTransitionsTemp.size() == 1) {return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,elString, processInstanceId);} else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息for (PvmTransition tr1 : outTransitionsTemp) {s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息// 判断el表达式是否成立if (isCondition(ac.getId(), StringUtils.trim(s.toString()), elString)) {return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,processInstanceId);}}}} else if ("userTask".equals(ac.getProperty("type"))) {try {return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition();} catch (Exception e) {return null;}} else {}}return null;}return null;}/*** 查询流程启动时设置排他网关判断条件信息* * @param String*            gatewayId 排他网关Id信息, 流程启动时设置网关路线判断条件key为网关Id信息* @param String*            processInstanceId 流程实例Id信息* @return*/public String getGatewayCondition(String gatewayId, String processInstanceId) {Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();Object object = runtimeService.getVariable(execution.getId(), gatewayId);return object == null ? "" : object.toString();}/*** 根据key和value判断el表达式是否通过信息* * @param String*            key el表达式key信息* @param String*            el el表达式信息* @param String*            value el表达式传入值信息* @return*/public boolean isCondition(String key, String el, String value) {ExpressionFactory factory = new ExpressionFactoryImpl();SimpleContext context = new SimpleContext();context.setVariable(key, factory.createValueExpression(value, String.class));ValueExpression e = factory.createValueExpression(context, el, boolean.class);return (Boolean) e.getValue(context);}/*** 获取排他网关的所有下一个UserTask* * @param activityImpl* @param processInstanceId* @return*/public Map getGateWayNextTaskInfo(String processInstanceId) {ProcessDefinitionEntity processDefinitionEntity = null;String id = null;// 获取流程发布Id信息String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();// 当前流程节点Id信息String activitiId = execution.getActivityId();// 获取流程所有节点信息List activitiList = processDefinitionEntity.getActivities();Map map = null;// 遍历所有节点信息for (ActivityImpl activityImpl : activitiList) {id = activityImpl.getId();if (activitiId.equals(id)) {map = getGateWay(activityImpl,processInstanceId, activitiId);break;}}return map;}/*** 获取排他网关的所有分支信息* @param activityImpl* @return*/public Map getGateWay(ActivityImpl activityImpl,String processInstanceId,String activityId) {Map maps = new HashMap();// 获取节点所有流向线路信息List outTransitions = activityImpl.getOutgoingTransitions();List outTransitionsTemp = null;for (PvmTransition tr : outTransitions) {PvmActivity ac = tr.getDestination(); // 获取线路的终点节点// 如果流向线路为排他网关if ("exclusiveGateway".equals(ac.getProperty("type"))) {outTransitionsTemp = ac.getOutgoingTransitions();// 如果排他网关只有一条线路信息if (outTransitionsTemp.size() == 1) {String s = (String) outTransitions.get(0).getProperty("conditionText");String name = (String) outTransitions.get(0).getDestination().getProperty("name");String taskId = (String) outTransitions.get(0).getDestination().getId();maps.put(s, new CandidateTaskInfo(name, taskId));} else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息for (PvmTransition tr1 : outTransitionsTemp) {String s = (String)tr1.getProperty("conditionText");String str = s.split("==")[1];String name = (String) tr1.getDestination().getProperty("name");String taskId = (String) tr1.getDestination().getId();// 下一个还是排他网关if("exclusiveGateway".equals(tr1.getDestination().getProperty("type"))){// 获取下一个UserTaskactivityId = ((ActivityImpl) tr1.getDestination()).getId();TaskDefinition taskDefinition = nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, s, processInstanceId);if(null != taskDefinition){name = taskDefinition.getNameExpression().getExpressionText();taskId = taskDefinition.getKey();}else {// 流程后面不存在UserTask节点了name="结束";taskId=ActivityUtil.getEndActivitiId(processInstanceId);}}// 这里处理的是el表达式为=='xxxx'或者=="xxxx",也可以继续扩展其他方式if(StringUtils.contains(str, "\'")||StringUtils.contains(str, "\"")) {// maps.put(str.substring(1, str.length()-2), new CandidateTaskInfo(name, taskId));}else {// == true or falsemaps.put(str.substring(0, str.length()-1), new CandidateTaskInfo(name, taskId));}}}}}return maps;}

虽然方案一可以解决一部分问题,但是还是推荐使用方案二。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部