1. 程式人生 > >擴充套件Activiti-5.12輕鬆實現流程節點間自由跳轉和任意駁回/撤回

擴充套件Activiti-5.12輕鬆實現流程節點間自由跳轉和任意駁回/撤回

由於專案需要,最近對開源工作流引擎Activiti-5.12的功能做了一下擴充套件,實現了以下功能: 
1.自由流(流程節點間自由跳轉和任意駁回/撤回) 
2.流程會籤任務串並行模式切換 

一、自由流
在已有流程模型的的基礎上,每個流程例項當前任務可以任意駁回/撤回或者向後續節點任意跳轉而無需在相關的兩個節點之間顯示地畫跳轉路徑(也就是所謂的“中國式”自由流),通過在Activiti的流程元件TaskService介面中增加以下兩個方法來達到上述目的: 
public void complateTask(String taskid,String destTaskKey) 
public void complateTask(String taskid,Map<String,Object> vars,String destTaskKey) 


這兩個方法和以下原始方法相比較就是多了一個destTaskKey引數: 
public void complateTask(String taskid) 
public void complateTask(String taskid,Map<String,Object> vars) 

destTaskKey引數告訴流程引擎在結束taskID任務後直接跳轉到destTaskKey對應的任務節點,目前可以實現簡單人工任務和會籤人工任務的駁回/撤回或者向後連跳n個節點,暫不支援子流程任務和流程呼叫任務。 

注意:我們只是對activiti進行了功能擴充套件,因此activiti原來所有功能沒有受到任何影響,該怎麼用還是怎麼用,只是如果流程中臨時有任意駁回/撤回需求或者任意跳轉需求時(為了避免在流程圖中畫N X N條路徑,同時也不想修改流程模型),就可以通過上述兩個擴充套件介面輕鬆搞定。 


另外在TaskService介面中增加了駁回到上個環節的預設介面: 
/** 
   * 將當前任務駁回到上一個任務處理人處,並更新流程變數引數 
   * @param taskId 
   * @param variables 
   */ 
  void rejecttoPreTask(String taskId, Map<String, Object> variables); 

  /** 
   * 將當前任務駁回到上一個任務處理人處 
   * @param taskId 
   */ 
  void rejecttoPreTask(String taskId); 

2.流程會籤任務串並行模式切換
如果流程中存在多例項任務(會籤任務),那麼可以通過流程變數在處理任務時或者在發起流程例項的時候設定多例項任務執行的方式為序列還是並行。 

切換方式一 在發起流程時設定對應的會籤任務的是序列還是並行模式: 
Java程式碼  收藏程式碼
  1. Map variables= new HashMap();  
  2.             variables.put("usertask1_user", Arrays.asList("user1".split(",")));  
  3.             variables.put("usertask2_user", Arrays.asList("user2,user22,user23".split(",")));  
  4.             variables.put("usertask3_user", Arrays.asList("user3,user32".split(",")));  
  5.             variables.put("usertask4_user", Arrays.asList("user4,user42".split(",")));  
  6.             params.put("usertask5_user", Arrays.asList("user5".split(",")));  
  7.             variables.put("businessType""test");  
  8.             /** 
  9.              * 會籤任務usertask2流程模型中被定義並行模式,這裡在流程例項啟動時通過流程變數將會籤任務usertask2的並行模式改為序列模式 
  10.              * 然後該流程例項的對應會籤任務usertask2將以序列方式執行 
  11.              */  
  12.             variables.put("usertask2"+MultiInstanceActivityBehavior.multiInstanceMode_variable_const, MultiInstanceActivityBehavior.multiInstanceMode_sequential);  
  13. ProcessInstance processInstance = runtimeService  
  14.                 .startProcessInstanceByKey(process_key, businessKey, map);  


切換方式二 在完成任務時設定後續會籤任務的是序列還是並行模式: 
Java程式碼  收藏程式碼
  1. /** 
  2.                      * 會籤任務usertask2在對應的流程例項啟動時已經被切換為序列模式,這裡在完成usertask1任務時通過流程變數將會籤任務usertask2的序列模式再改為並行模式 
  3.                      * 然後該流程例項的對應會籤任務usertask2將以並行方式執行 
  4.                      */  
  5. Map variables= new HashMap();                   variables.put("usertask2"+MultiInstanceActivityBehavior.multiInstanceMode_variable_const, MultiInstanceActivityBehavior.multiInstanceMode_parallel);  
  6. taskService.claim(taskId, username);//領取任務  
  7. taskService.complete(taskId, variables);//完成任務並設定後續會籤任務的執行模式  


變數的命名規範為: 
   * taskkey.bpmn.behavior.multiInstance.mode 
   * 取值範圍為: 
   * parallel 對應於常量MultiInstanceActivityBehavior.multiInstanceMode_parallel 
   * sequential MultiInstanceActivityBehavior.multiInstanceMode_sequential 
   * 說明:taskkey為對應的任務的定義id,根據具體的會籤任務來取值,.bpmn.behavior.multiInstance.mode部分是固定值,對應常量MultiInstanceActivityBehavior.multiInstanceMode_variable_const 
   * 
   * 會籤多例項任務執行模式可以在設計流程時統一配置,在任務處理時每個例項中的會籤任務都可以通過變數設定和改變串並行模式,變數可以啟動流程例項時動態設定,也可以在上個活動任務完成時設定。 

3.小花絮
為了在任務歷史表act_hi_taskinst表delete_reason_欄位的值更加具體和詳細,特意為activiti增加了一個全域性元件: 
org.activiti.engine.impl.identity.UserInfoMap 
Java程式碼  收藏程式碼
  1. public interface UserInfoMap {  
  2.     String getUserName(String userAccount);//根據賬號獲取使用者中文名稱  
  3.     Object getUserAttribute(String userAccount,String userAttribute);//根據賬號獲取使用者的屬性值  
  4.     Object getUserAttributeByID(String userID,String userAttribute);//根據ID獲取使用者的屬性值  
  5. }  


UserInfoMap用來為流程引擎中的相關功能提供獲取流程處理人各種和業務相關的屬性的方法。通過在流程全域性配置檔案activiti.cfg.xml中為流程引擎配置UserInfoMap元件: 
Xml程式碼  收藏程式碼
  1. <property name="userInfoMap" class="com.frameworkset.platform.sysmgrcore.purviewmanager.PDPUserInfoMapImpl"/>  


具體配置請檢視案例檔案:activiti.cfg.xml

org.activiti.engine.impl.identity.UserInfoMapImpl是UserInfoMap元件的預設實現。 

以下是應用UserInfoMap元件後act_hi_taskinst表delete_reason_欄位的幾個值內容例項: 
[提交-usertask1]任務被[張三-zhangsan]完成 
[會籤並行-usertask2]任務被[李四-lisi]轉到節點[提交-usertask1] 
[提交-usertask1]任務被[張三-zhangsan]完成 
[會籤並行-usertask2]任務被[張三-zhangsan]完成 
[會籤並行-usertask2]任務被[李四-lisi]完成 
[會籤並行-usertask2]任務被[王五-wangwu]完成 
[駁回測試-usertask5]任務被[阿甘-agan]完成 
[審批校驗-usertask6]任務被[歐巴馬-oubama]完成


4.後記

本次改造是基於bboss 3.6.2分支和Activiti 5.12.0版本,都是目前兩個開源專案的最新版本或者較新版本(activiti最新小版本為5.12.1)。