工作流引擎 Activiti 中获取下一节点

转载来自:http://cheen.iteye.com/blog/1591900

最近公司需要使用工作流引擎,选用了activiti。需求中提到的流程比较简单,也就3级审核,送审时需要选择下一节点的用户,所以必须在流程中需要获取当前节点的下一个节点。代码如下: 

      
Java代码   收藏代码
  1. /** 
  2.      * 根据实例编号查找下一个任务节点 
  3.      * @param String procInstId :实例编号 
  4.      * @return 
  5.      */  
  6.     public TaskDefinition nextTaskDefinition(String procInstId){  
  7.         //流程标示  
  8.         String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId).singleResult().getProcessDefinitionId();  
  9.           
  10.         ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(processDefinitionId);  
  11.         //执行实例  
  12.         ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(procInstId).singleResult();  
  13.         //当前实例的执行到哪个节点  
  14.         String activitiId = execution.getActivityId();  
  15.         //获得当前任务的所有节点  
  16.         List<ActivityImpl> activitiList = def.getActivities();  
  17.         String id = null;  
  18.         for(ActivityImpl activityImpl:activitiList){    
  19.             id = activityImpl.getId();   
  20.             if(activitiId.equals(id)){  
  21.                 System.out.println("当前任务:"+activityImpl.getProperty("name"));  
  22.                 return nextTaskDefinition(activityImpl, activityImpl.getId(),"${iscorrect==1}");  
  23. //              System.out.println(taskDefinition.getCandidateGroupIdExpressions().toArray()[0]);  
  24. //              return taskDefinition;  
  25.             }  
  26.         }  
  27.         return null;  
  28.     }  
  29.       
  30.     /** 
  31.      * 下一个任务节点 
  32.      * @param activityImpl 
  33.      * @param activityId 
  34.      * @param elString 
  35.      * @return 
  36.      */  
  37.     private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString){  
  38.             if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){  
  39.                 TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();  
  40. //              taskDefinition.getCandidateGroupIdExpressions().toArray();  
  41.                 return taskDefinition;  
  42.             }else{  
  43.                 List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();  
  44.                 List<PvmTransition> outTransitionsTemp = null;  
  45.                 for(PvmTransition tr:outTransitions){    
  46.                     PvmActivity ac = tr.getDestination(); //获取线路的终点节点    
  47.                     if("exclusiveGateway".equals(ac.getProperty("type"))){  
  48.                         outTransitionsTemp = ac.getOutgoingTransitions();  
  49.                         if(outTransitionsTemp.size() == 1){  
  50.                             return nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId, elString);  
  51.                         }else if(outTransitionsTemp.size() > 1){  
  52.                             for(PvmTransition tr1 : outTransitionsTemp){  
  53.                                 Object s = tr1.getProperty("conditionText");  
  54.                                 if(elString.equals(StrUtils.trim(s.toString()))){  
  55.                                     return nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId, elString);  
  56.                                 }  
  57.                             }  
  58.                         }  
  59.                     }else if("userTask".equals(ac.getProperty("type"))){  
  60.                         return ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();  
  61.                     }else{  
  62.                         logger.debug(ac.getProperty("type"));  
  63.                     }  
  64.                 }   
  65.             return null;  
  66.         }  
  67.     }  

思路是通过实例ID获取当前节点,然后查找当前节点后后面所有的活动,主要查找的活动是exclusiveGateway和userTask,如果exclusiveGateway中的条件符合${iscorrect==1}就直接查找exclusiveGateway后的活动,直到找到userTask为止。如果当前节点后的活动是userTask,说明这个userTask就是你想要的。 


代码中${iscorrect==1}表达式是流程中定义,表示审核通过。当时对于在java中解析表达式遇到困难,所以使用字符串来比较,代码
Java代码   收藏代码
  1. if(elString.equals(StrUtils.trim(s.toString())))  
就是用于判断表达式。后来发现可以通说juel来解析,以下是解析的代码: 
Java代码   收藏代码
  1. ExpressionFactory factory = new ExpressionFactoryImpl();  
  2.         SimpleContext context = new SimpleContext();  
  3.         context.setVariable("count", factory.createValueExpression(10000, String.class));  
  4.         ValueExpression e = factory.createValueExpression(context, "${count>=1000}"boolean.class);  
  5.         System.out.println(e.getValue(context));  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值