activiti拿取 当前任务的下一个节点

来源:互联网 发布:人工智能在线观看 编辑:程序博客网 时间:2024/06/05 17:50

  在实际的工作流业务开发中, 当用户完成当前用户任务时, 需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息, 来确定下一个用户任务的审核人有哪些。

      

      在实际工作流程中, 当前用户任务后的节点可能为用户任务, 也可能为网关。如果下一个节点为网关我们需要判断流程线路。

 

      

Java代码  收藏代码
  1. /** 
  2.      * 获取下一个用户任务用户组信息  
  3.      * @param String taskId     任务Id信息  
  4.      * @return  下一个用户任务用户组信息  
  5.      * @throws Exception 
  6.      */  
  7.     public Set<Expression> getNextTaskGroup(String taskId) throws Exception {  
  8.           
  9.         ProcessDefinitionEntity processDefinitionEntity = null;  
  10.           
  11.         String id = null;  
  12.           
  13.         TaskDefinition task = null;  
  14.           
  15.         //获取流程实例Id信息   
  16.         String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();  
  17.           
  18.         //获取流程发布Id信息   
  19.         String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();  
  20.           
  21.         processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)  
  22.                 .getDeployedProcessDefinition(definitionId);  
  23.           
  24.         ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();  
  25.           
  26.         //当前流程节点Id信息   
  27.         String activitiId = execution.getActivityId();    
  28.           
  29.         //获取流程所有节点信息   
  30.         List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();   
  31.           
  32.         //遍历所有节点信息   
  33.         for(ActivityImpl activityImpl : activitiList){      
  34.             id = activityImpl.getId();     
  35.               
  36.             // 找到当前节点信息  
  37.             if (activitiId.equals(id)) {  
  38.                   
  39.                 //获取下一个节点信息   
  40.                 task = nextTaskDefinition(activityImpl, activityImpl.getId(), null, processInstanceId);  
  41.   
  42.                 break;  
  43.             }  
  44.         }  
  45.           
  46.         return task.getCandidateGroupIdExpressions();  
  47.     }  
  48.       
  49.     /**  
  50.      * 下一个任务节点信息,  
  51.      *  
  52.      * 如果下一个节点为用户任务则直接返回,  
  53.      *  
  54.      * 如果下一个节点为排他网关, 获取排他网关Id信息, 根据排他网关Id信息和execution获取流程实例排他网关Id为key的变量值,  
  55.      * 根据变量值分别执行排他网关后线路中的el表达式, 并找到el表达式通过的线路后的用户任务信息  
  56.      * @param ActivityImpl activityImpl     流程节点信息  
  57.      * @param String activityId             当前流程节点Id信息  
  58.      * @param String elString               排他网关顺序流线段判断条件, 例如排他网关顺序留线段判断条件为${money>1000}, 若满足流程启动时设置variables中的money>1000, 则流程流向该顺序流信息  
  59.      * @param String processInstanceId      流程实例Id信息  
  60.      * @return  
  61.      */    
  62.     private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString, String processInstanceId){   
  63.               
  64.         PvmActivity ac = null;  
  65.           
  66.         Object s = null;  
  67.           
  68.         //如果遍历节点为用户任务并且节点不是当前节点信息   
  69.             if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){    
  70.                 //获取该节点下一个节点信息   
  71.                 TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();    
  72.                 return taskDefinition;    
  73.             }else{    
  74.                 //获取节点所有流向线路信息   
  75.                 List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();    
  76.                 List<PvmTransition> outTransitionsTemp = null;    
  77.                 for(PvmTransition tr : outTransitions){      
  78.                     ac = tr.getDestination(); //获取线路的终点节点      
  79.                     //如果流向线路为排他网关   
  80.                     if("exclusiveGateway".equals(ac.getProperty("type"))){    
  81.                         outTransitionsTemp = ac.getOutgoingTransitions();  
  82.                           
  83.                         //如果网关路线判断条件为空信息   
  84.                         if(StrUtils.isEmpty(elString)) {  
  85.                             //获取流程启动时设置的网关判断条件信息   
  86.                             elString = getGatewayCondition(ac.getId(), processInstanceId);  
  87.                         }  
  88.                           
  89.                         //如果排他网关只有一条线路信息   
  90.                         if(outTransitionsTemp.size() == 1){    
  91.                             return nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId, elString, processInstanceId);    
  92.                         }else if(outTransitionsTemp.size() > 1){  //如果排他网关有多条线路信息   
  93.                             for(PvmTransition tr1 : outTransitionsTemp){    
  94.                                 s = tr1.getProperty("conditionText");  //获取排他网关线路判断条件信息   
  95.                                 //判断el表达式是否成立   
  96.                                 if(isCondition(ac.getId(), StrUtils.trim(s.toString()), elString)){    
  97.                                     return nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId, elString, processInstanceId);    
  98.                                 }    
  99.                             }    
  100.                         }    
  101.                     }else if("userTask".equals(ac.getProperty("type"))){    
  102.                         return ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();    
  103.                     }else{    
  104.                     }    
  105.                 }     
  106.             return null;    
  107.         }    
  108.     }  
  109.       
  110.     /** 
  111.      * 查询流程启动时设置排他网关判断条件信息  
  112.      * @param String gatewayId          排他网关Id信息, 流程启动时设置网关路线判断条件key为网关Id信息  
  113.      * @param String processInstanceId  流程实例Id信息  
  114.      * @return 
  115.      */  
  116.     public String getGatewayCondition(String gatewayId, String processInstanceId) {  
  117.         Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();  
  118.         return runtimeService.getVariable(execution.getId(), gatewayId).toString();  
  119.     }  
  120.       
  121.     /** 
  122.      * 根据key和value判断el表达式是否通过信息  
  123.      * @param String key    el表达式key信息  
  124.      * @param String el     el表达式信息  
  125.      * @param String value  el表达式传入值信息  
  126.      * @return 
  127.      */  
  128.     public boolean isCondition(String key, String el, String value) {  
  129.         ExpressionFactory factory = new ExpressionFactoryImpl();    
  130.         SimpleContext context = new SimpleContext();    
  131.         context.setVariable(key, factory.createValueExpression(value, String.class));    
  132.         ValueExpression e = factory.createValueExpression(context, el, boolean.class);    
  133.         return (Boolean) e.getValue(context);  
  134.     }  
原创粉丝点击