activiti工作流引擎入門教程

activiti簡介

Activiti項目是一項新的基於Apache許可的開源BPM平臺,從基礎開始構建,旨在提供支持新的BPMN 2.0標準。
Activiti是一種輕量級,可嵌入的BPM引擎,而且還設計適用於可擴展的雲架構。 Activiti將提供寬鬆的Apache許可2.0,同時促進Activiti BPM引擎和BPMN 2.0的匹配。

activiti的7大馬車

1.RepositoryService:提供一系列管理流程部署和流程定義的API。
2.RuntimeService:在流程運行時對流程實例進行管理與控制。
3.TaskService:對流程任務進行管理,例如任務提醒、任務完成和創建任務等。
4.IdentityService:提供對流程角色數據進行管理的API,這些角色數據包括用戶組、用戶及它們之間的關係。
5.ManagementService:提供對流程引擎進行管理和維護的服務。
6.HistoryService:對流程的歷史數據進行操作,包括查詢、刪除這些歷史數據。
7.FormService:表單服務。

activiti應用場景

多人協作的(或者需要動態變動)的業務流程場景。

正文

本文將通過搭建一個簡單的請假流程系統來進行講解。

如你所知,activiti工作流引擎多運用於流程性很強的業務系統。所以運用的第一步是創建.bpmn文件(我稱之爲activiti認識的流程圖)

 

activiti流程圖

 

.bpmn文件我們可以通過編輯軟件打開

 

,bpmn文件


可以簡單的認爲就是一個xml文件,activiti去解析這個文件,瞭解我們到底想幹什麼事。
畫完流程圖之後,就是我上面提到的activiti七架馬車。它們就是activiti對外提供的接口。通過它們就可以很方便的操作到activiti生產的數據,以及操作它在適當的節點做想讓它做的事。

我這邊是通過springboot搭建。所以需要把那七大馬車注入(也不一定要全部注入),交給spring管理。這樣就可以隨便用了。
以下是注入馬車代碼

package com.ysh.activiti.config;

import javax.sql.DataSource;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActivitiConfog {
  @Autowired
  private DataSource dataSource;

  @Bean
  public StandaloneProcessEngineConfiguration processEngineConfiguration() {
      StandaloneProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
      configuration.setDataSource(dataSource);
      >configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
      configuration.setAsyncExecutorActivate(false);
      return configuration;
  }

  @Bean
  public ProcessEngine processEngine() {
      return processEngineConfiguration().buildProcessEngine();
  }

  @Bean
  public RepositoryService repositoryService() {
      return processEngine().getRepositoryService();
  }

  @Bean
  public RuntimeService runtimeService() {
      return processEngine().getRuntimeService();
  }

  @Bean
  public TaskService taskService() {
      return processEngine().getTaskService();
  }
  @Bean
  public HistoryService historyService() {
      return processEngine().getHistoryService();
  }
}

當然我這邊並沒有注入所有的馬車,用到的是時候再加都是可以的。這兒也隨帶對activiti做了基本的配置。
配置了數據源,自動建表,是否激活AsyncExecutor。剛剛介紹了其他馬車,忘了activiti 最重要的ProcessEngine(流程引擎對象),馬車都是由它管理。
配置好這些,運行代碼就會產生activiti的內置表。

 

activiti內置表

 

上圖已act開頭的都是,總共28張。每張表含義以及表裏的字段含義,我這裏就不在累贅,大家網上都能找到資料。我就這點一哈我認爲比較重要的表
1.act_ru_execution 執行對象表
2.act_ru_task 用戶任務表
3.act_hi_actinst 活動節點歷史表
4.act_hi_procinst 流程實例歷史表
5.act_hi_taskinst 歷史任務表
下面就說怎麼去啓動一個流程

Deployment deploy = >repositoryService.createDeployment().addClasspathResource("processes/leave.bpmn").deploy();
// 獲取流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
              .deploymentId(deploy.getId()).singleResult();
// 啓動流程定義,返回流程實例
ProcessInstance pi = runtimeService.startProcessInstanceById(processDefinition.getId());

到此,入門就算結束了。

搭建的注意點

我搭建時考慮的問題:
1.activiti流程怎麼和自己的業務表,如請假詳細信息表,審批信息表關聯起來?
2.activiti如何知道那些任務該由誰處理?
3.駁回,撤銷(目前未搞撤銷功能,文章還會持續更新)怎麼實現?
解決方式 :
1.問題一,網上說的可以把流程與業務通過activiti的businesss_key關聯起來。後來我發現好像這個值一次流程只能設置一次(也有可能是我操作不對),最終我選擇了在業務表存儲流程實例的id來進行關聯。
問題二:指定任務候選人方式解決。指定候選人的時候,我一開始採用監聽的方式,因爲我這邊設計的是某個角色下的人都會有某個流程節點的審批權限,通過監聽的方式,我一開始又直接選擇監聽類,具體操作如下:

 

直接選擇監聽類

 

發現這種方式不能獲取到spring管理的bean。
後面嘗試使用expression。這種方式可以獲取到bean。由於我要操作數據庫查詢數據,所以注入了JpaRepository。然後神奇的爆了序列化問題。
最後我選擇了傳參的方式指定候選人。

 

變量指定候選人


3.駁回:使用排他網關實現,只需要指定通過條件

流程線指定條件


由於代碼量還是有點多,後面我code review之後(現在寫的還是有點糙)會放到github上。有興趣的朋友可以持續關注。

系統展示

系統用戶角色表設計

 

系統角色劃分

 

用戶的信息

 

用戶與角色關係

 

當然大家從名字也能大致猜出對應角色。

 

系統登錄頁

 

普通員工登錄界面

 

發佈申請

 

填寫之後

 

查看流程

 

通過上文流程圖,可以知道請假不大於五天都是部門經理審批。
上文的黑色,表示已經提交到經理審覈,但是經理還未處理。

 

申請6天

 

大於五天,總監審批

 

部門經理yshManager審批

 

部門經理YshManager2審批


同一個任務,身爲部門經理的人都能進行審批。說明傳參的方式制定審覈人事沒有問題的。

部門經理yshManager2審批之後的流程


我這邊審覈任務設置的是一個人審批過後,就算審批通過,不需要所有人審批通過。當時一個部門經理審批過後,其他部門經理就不能審覈這個任務,同時我這邊也設計的是無法再進行查看這個請假任務具體情況。
人事審覈同理。

人事順利審批

 

一次性走完流程的流程進度

 

審批拒絕


我就不挨着截圖了,直接展示一個多次遭拒絕的情況截圖。

image.png

 

這兒就是多次審批遭拒,然後重新申請的情況。這兒就會有一個問題,我開始申請請假是6天。被總監拒絕。我改爲5天,被人力資源拒絕。後面改3天,審批通過。由於我申請審批一直是操作的同一條申請請假數據。導致前面的數據記錄丟失。(bug後續更新解決)

結語

我對activiti也是剛接觸的小白。如有不正確之處,請不吝賜教。後面還會持續更新。有興趣的朋友可以持續關注。



作者:帥哥哥寫代碼
鏈接:https://www.jianshu.com/p/972613558ba1
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章