前面文正有寫過根據當前節點獲取下一個UseTask節點,有需要了解的可以去看這篇博客根據當前節點獲取下一個UseTask節點,,但是現在需求又發生了該表,如果在一個節點下需要獲取排他網關下所有的userTask怎么辦?
這里還需要將需求分成兩種
1、排他網關后面只有userTask,如下圖所示
這種情況,當到達財務審批時,需要財務選擇需要通過財務總監還是直接到發貨,由于財務后面的排他網關后面直接跟著兩個userTask,這時要獲取排他網關后面的userTask可以通過下面的代碼實現。
/*** 獲取排他網關的所有下一個UserTask* * @param activityImpl* @param processInstanceId* @return*/public Map<String, CandidateTaskInfo>
getGateWayNextTaskInfo(String processInstanceId) {ProcessDefinitionEntity processDefinitionEntity =
null;String id =
null;String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();String activitiId = execution.getActivityId();List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();Map<String, CandidateTaskInfo> map =
null;
for (ActivityImpl activityImpl : activitiList) {id = activityImpl.getId();
if (activitiId.equals(id)) {map = getGateWay(activityImpl);
break;}}
return map;}
/*** 獲取排他網關的所有分支信息* @param activityImpl* @return*/public Map<String, CandidateTaskInfo>
getGateWay(ActivityImpl activityImpl) {Map<String, CandidateTaskInfo> maps =
new HashMap<String, CandidateTaskInfo>();List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();List<PvmTransition> 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,
"\"")) {maps.put(str.substring(
1, str.length()-
2),
new CandidateTaskInfo(name, taskId));}
else {maps.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"))) {List<PvmTransition> 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");
if (isCondition(activityImpl.getId(), StringUtils.trim(s.toString()), elString)) {
return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,processInstanceId);}}}}
else {List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();List<PvmTransition> 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");
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<String, CandidateTaskInfo>
getGateWayNextTaskInfo(String processInstanceId) {ProcessDefinitionEntity processDefinitionEntity =
null;String id =
null;String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();String activitiId = execution.getActivityId();List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();Map<String, CandidateTaskInfo> 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<String, CandidateTaskInfo>
getGateWay(ActivityImpl activityImpl,String processInstanceId,String activityId) {Map<String, CandidateTaskInfo> maps =
new HashMap<String, CandidateTaskInfo>();List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();List<PvmTransition> 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"))){activityId = ((ActivityImpl) tr1.getDestination()).getId();TaskDefinition taskDefinition = nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, s, processInstanceId);
if(
null != taskDefinition){name = taskDefinition.getNameExpression().getExpressionText();taskId = taskDefinition.getKey();}
else {name=
"結束";taskId=ActivityUtil.getEndActivitiId(processInstanceId);}}
if(StringUtils.contains(str,
"\'")||StringUtils.contains(str,
"\"")) {maps.put(str.substring(
1, str.length()-
2),
new CandidateTaskInfo(name, taskId));}
else {maps.put(str.substring(
0, str.length()-
1),
new CandidateTaskInfo(name, taskId));}}}}}
return maps;}
雖然方案一可以解決一部分問題,但是還是推薦使用方案二。
總結
以上是生活随笔為你收集整理的怎么获取排他网关下的所有userTask?的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。