Activiti工作流框架學習(十四)

Activiti獲取下一個節點信息


在實際的工作流業務開發中, 當用戶完成當前用戶任務時, 需要指定下一個用戶任務的審覈人。此時我們需要獲取下一個節點的一些信息, 來確定下一個用戶任務的審覈人有哪些。

      

      在實際工作流程中, 當前用戶任務後的節點可能爲用戶任務, 也可能爲網關。如果下一個節點爲網關我們需要判斷流程線路。

 

      

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.     }  

發佈了436 篇原創文章 · 獲贊 121 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章