天天看點

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

目錄

  • ​​前言​​
  • ​​flowable6.4.2 不足之處​​
  • 并行網關跳轉駁回BUG
  • 多執行個體加簽減簽BUG
  • ​​解決之法​​
  • 說明
  • 用法

前言

flowable 優秀的工作流流程引擎架構,前身Activity

為什麼要用工作流?

主要是應對:

  • 流程可能随時變更
  • 步驟處理人可能變更
  • 并行任務處理
  • 分支任務處理
  • 駁回處理
  • 等等

如果你不用類似于flowable工作流,久而久之你要麼自己建立一套工作流架構,要麼用flowable,這是必然發展之路。

有現車的成熟工作流架構為何不用?

flowable6.4.2 不足之處

即便如 flowable這樣優秀的架構,也比較難對付中國的特色工作流。

你會遇到下面的業務需求:

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

【任務3】的處理人稽核不通過後 要駁回給 【并行任務2-1-1】和【并行任務2-3-3】有可能就這兩步處理人填寫的内容有問題。

甚至還會遇到特事特辦,提前跳轉下面的步驟

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

還有遇到 并行網關 和 多執行個體綜合場景, 某一步驟跳轉至串行多執行個體場景。

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

雖然flowable 相較于Activity已經有很多改進之處,flowable的作者也意識到中國的特色工作流需求,也提供了不少跳轉之類的接口。

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

但一般用過的應該發現,針對并行網關的跳轉,實際上是有BUG的

例如下面的場景:

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

T5 要駁回給T2-2 和 T4-2 , 發現最後怎麼也沒辦法流轉到T5, 原因就是少了一條 T3-2的送出完成記錄。

檢視 act_ru_execution 表中記錄

SELECT a.* FROM  act_ru_execution a 
WHERE a.PROC_INST_ID_ = @PROC_INST_ID_
ORDER BY a.START_TIME_ DESC 
      
flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

首先表act_ru_execution 記錄中必須存在三條記錄,表示并行網關的三條分支,其次走完條,字段 IS_ACTIVE_ 的值為0,然後flowable6.4.2版本跳轉後并沒有為并行網關生成所有的分支execution。

還有更加複雜的嵌套并行網關駁回處理:

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

請問 T7 駁回至T5 要怎麼跳轉 ????

如何在act_ru_execution 補齊所有的并行網關的分支execution記錄??

在業務需求上 T7 作為稽核員,他發現就T5送出的有問題,難不成要全部駁回至其實任務步驟? 是以不能說這樣的需求是變态需求,無法實作。

解決諸如上面所述的各類并行網關的需求,一個看下流程是否可以變通,通過分支網關+表達式來優化,另外隻能擴充flowable的接口業務邏輯了

flowable 提供了人性化的多執行個體任務 減簽加簽接口

flowable6.4 并行網關 駁回 跳轉 回退 多執行個體加簽減簽

網上也有很多部落格例子,但你會發現他們大多數測試的是并行多執行個體下的業務場景,而且大多數隻是測試了加簽,并沒有測試減簽。

當你測試串行多執行個體加簽減簽時,你會遇到一些BUG,總之你會發現多執行個體核心變量數值一直有問題,而且串行多執行個體減簽會變成兩個任務等異常BUG發生。

  • nrOfInstances 目前任務總數
  • nrOfCompletedInstances 已完成任務總數 串行多執行個體BUG
  • nrOfActiveInstances 目前活動任務總數 該值加簽後并未更新

解決之法

自定義flowable BPM2流程引擎接口封裝元件

bpm2-spring-boot-starter

裡面包含了跳轉、加減簽、輸出流程圖自定義高亮節點顔色等方法。

由于代碼過多,無法在部落格裡面貼出,請移步下面的github或碼雲

碼雲

​​https://gitee.com/banana6/bpm2-boot-starter/tree/main/bpm2-spring-boot-starter​​

github

​​https://github.com/dwhgygzt/bpm2-boot-starter/tree/main/bpm2-spring-boot-starter​​

  1. 該元件專門針對BPM流程引擎常用接口進行封裝
  2. 目标是為了開發團隊統一使用規範
  3. 封裝整理了常用的流程操作接口(檢視流程定義、啟動流程)
  4. 封裝整理常用的任務操作接口(送出、跳轉、駁回到并行網關中的某幾條分支)
  5. 暫不支援子流程相關操作,一般沒有涉及這方面的業務場景

  1. pom.xml 檔案引入如下配置
<!-- 對象存儲通用接口 -->
<dependency>
<groupId>com.middol</groupId>
<artifactId>bpm2-spring-boot-starter</artifactId>
<version>最新版本号</version>
</dependency>

      
  1. application.yml 增加如下配置,假設簡單配置如下:
##########################redisclent##############################
middol:
  bpm2:
    new-process-engine-config: true
    database-schema-update: true
    async-executor-activate: false
##################################################################

      
  • 參數 new-process-engine-config
true: 業務系統目前沒有任何flowable相關的配置,引入本配置将新配置一個流程引擎

false: 業務系統本身已經有flowable相關的配置(例如:flowable-spring-boot-starter),不想重複配置流程引擎
      
  • 當 new-process-engine-config 為 fasle
async-executor-activate 和 database-schema-update 無需配置

這兩個參數意思:
database-schema-update: true = flowable引擎自動建立表
async-executor-activate: true =在流程引擎啟動就激活AsyncExecutor
      
  1. 業務代碼中引入service
@Service
public class MyBusinessServiceImpl {
// 使用者任務相關接口
@Resource
private BpmUserTaskService bpmUserTaskService;

// 流程部署查詢操作接口
@Resource
private BpmProcessService bpmProcessService;

}

      
  1. 針對駁回到并行網關上的某幾個分支節點
  • 先調用bpmUserTaskService查詢目前任務之前流轉過的任務節點
/**
* 【本任務節點】的上一步【曆史任務節點】清單
*
* @param query ignore
* @return ignore
*/
List<BpmTaskModelEntity> listBackTaskModel(BpmBackTaskModelQuery query);

/**
* 【本任務節點】之前的【曆史任務節點】清單
*
* @param query ignore
* @return ignore
*/
List<BpmTaskModelEntity> listAllBackTaskModel(BpmBackTaskModelQuery query);
      

到底調用哪一個,根據自身業務需求決定。

另外檢視 BpmTaskModelEntity 類可以看出,裡面有标志位:是否多執行個體,是否并行網關上節點,歸屬的并行網關id

這裡查詢的清單沒有做排序,業務系統可根據節點編号進行自行排序,另外可以将相同并行網關id的 歸屬到一個集合裡面。

  • 調用bpmUserTaskService跳轉接口
void jump(BpmJumpForm form);
      

檢視 BpmJumpForm 參數對象如下:

/**
* 流程跳轉(适用于選擇曆史任務步驟駁回場景,跳轉指定任務,并行網關跳轉)
*
* @author <a href="mailto:[email protected]">guzhongtao</a>
*/
public class BpmJumpForm extends BpmBaseParam {

private static final long serialVersionUID = 1L;

/**
* 目前任務節點
*/
private String taskId;

/**
* 目标任務節點key
*/
private List<String> targetTaskDefineKes;

/**
* 需要設定的全局相關參數,全局變量
*/
private Map<String, Object> variables;

// ......  省略部分代碼.......
}
      
  • taskId : 目前執行駁回跳轉的任務id
  • targetTaskDefineKes: 表示你要跳轉到的任務節點,該值是你在畫流程圖時指定的任務ID編号, 該值從BpmTaskModelEntity 對象中可以取到。 說明: 如果為多個,則裡面的任務必須全部都是并行網關上的任務節點。
  1. 針對多執行個體加簽減簽

    調用 bpmUserTaskService

/**
* 多執行個體-加簽
*
* @param form ignore
*/
void addMultiInstanceExecution(BpmMultInstAddForm form);

/**
* 多執行個體-減簽
*
* @param form ignore
*/
void deleteMultiInstanceExecution(BpmMultInstDeleteForm form);

      

這裡說明一下,加簽減簽是 多執行個體裡面的任務處理者進行操作的,如果還沒有到達多執行個體任務節點,則不存在多執行個體加簽減簽業務。

是以請看 BpmMultInstAddForm 和 BpmMultInstDeleteForm

裡面有一個共同參數: multiInstanceTaskId(目前操作的任務id)

在減簽的時候,需要調用查詢接口,查詢可以減簽的人員清單,當然不包含自己。

/**
* 擷取目前多執行個體任務除自己外的其他使用者資訊清單,
* 用于 減簽 業務場景
*
* @param multiInstanceTaskId 目前多執行個體使用者任務id
* @return List
*/
List<MultiInstanceUserDTO> getOtherMultiInstanceUsers(String multiInstanceTaskId);

      
上一篇: web試題
下一篇: react

繼續閱讀