前言
工作流程是我們日常開發項目中常見的功能,本文記錄springboot整合activiti7。
Activiti介紹
數據庫表
act_hi_*:'hi’表示 history,此前綴的表包含歷史數據,如歷史(結束)流程實例,變量,任務等等。
act_ge_*:'ge’表示 general,此前綴的表為通用數據,用於不同場景中。
act_evt_*:'evt’表示 event,此前綴的表為事件日志。
act_procdef_*:'procdef’表示 processdefine,此前綴的表為記錄流程定義信息。
act_re_*:'re’表示 repository,此前綴的表包含了流程定義和流程靜態資源(圖片,規則等等)。
act_ru_*:'ru’表示 runtime,此前綴的表是記錄運行時的數據,包含流程實例,任務,變量,異步任務等運行中的數據。Activiti只在流程實例執行過程中保存這些數據,在流程結束時就會刪除這些記錄。
表名 | 表注釋 |
act_ge_bytearray | 二進制數據表,存儲通用的流程定義和流程資源。 |
act_ge_property | 系統相關屬性,屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄。 |
act_re_deployment | 部署信息表 |
act_re_model | 流程設計模型部署表 |
act_re_procdef | 流程定義數據表 |
act_ru_deadletter_job | 作業死亡信息表,作業失敗超過重試次數 |
act_ru_event_subscr | 運行時事件表 |
act_ru_execution | 運行時流程執行實例表 |
act_ru_identitylink | 運行時用戶信息表 |
act_ru_integration | 運行時積分表 |
act_ru_job | 運行時作業信息表 |
act_ru_suspended_job | 運行時作業暫停表 |
act_ru_task | 運行時任務信息表 |
act_ru_timer_job | 運行時定時器作業表 |
act_ru_variable | 運行時變量信息表 |
act_hi_actinst | 歷史節點表 |
act_hi_attachment | 歷史附件表 |
act_hi_comment | 歷史意見表 |
act_hi_detail | 歷史詳情表,提供歷史變量的查詢 |
act_hi_identitylink | 歷史流程用戶信息表 |
act_hi_procinst | 歷史流程實例表 |
act_hi_taskinst | 歷史任務實例表 |
act_hi_varinst | 歷史變量表 |
act_evt_log | 流程引擎的通用事件日志記錄表 |
act_procdef_info | 流程定義的動態變更信息 |
BPM節點介紹
根據BPMN2.0規范的分類划分為以下部分:
1.啟動與結束事件(event)
2.順序流(Sequence Flow)
3.任務(Task)
4.網關(Gateway)
5.子流程(Subprocess)
6.邊界事件(Boundary Event)
7.中間事件(Intermediate Event)
8.監聽器(Listener)
Event
StartEvent,開始事件。
EndEvent,結束事件。
Task
UserTask,用戶任務,用戶任務用來設置必須由人員完成的工作。
屬性名稱 | 屬性說明 |
---|---|
Assignee | 指定用戶任務的處理人 |
Cadidate Users | 指定用戶任務的候選人,多個用逗號隔開 |
Cadidate Groups | 指定多個候選組,多個用逗號隔開 |
Due Date | 設置任務的到期日,通常用變量代替而不是設定一個具體的日期 |
Priority | 設定任務的優先級,取值區間[0,100] |
ScriptTask,腳本任務,腳本任務是一個自動節點,當流程到達腳本任務。
ServiceTask,服務任務
Gateway
ParallelGateway,並行網關,順序流沒有條件解析,且分支執行不分先后。例如下面流程,需要科任老師批准、班主任批准,請假流程才能結束。
ExclusiveGateway,排他網關,條件解析為true的順序流會被選中,流程往前走。例如下面流程,請假天數小於等於1天,科任老師老師批准,請假流程結束;請假天數大於1天,就需要班主任批准。
InclusiveGateway,包含網關,並行與排他的結合體,所有順序流的條件都會被解析,結果為true的順序會以並行方式繼續執行。例如下面流程,請假天數小於等於1天,科任老師老師批准,請假流程結束;請假天數大於1天,班主任批准,請假流程結束;請假天數大於三天,就需要班主任批准、校長批准,請假流程才能結束。
開發前准備
Idea安裝actiBPM插件,用於繪制流程圖
畫流程圖
創建bpmn文件,畫一個簡單的請假流程
代碼編寫
項目結構
引入依賴包
<!-- activiti --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M5</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-image-generator</artifactId> <version>7.1.0.M5</version> </dependency> <!--添加MySQL驅動依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- thymeleaf模板 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
springboot整合的activiti,默認自帶security框架,為了方便測試,我們直接用官方提供的config類
幾個默認賬號,選一個來登錄即可,可以選 admin/password
傳統項目分層:controller層、service層
為了擴展、豐富原生的流程圖生成器,創建自定義ProcessDiagramGenerator與ProcessDiagramCanvas
三個簡單頁面
1、流程發起,填寫業務表單,發起一個請假流程
2、任務待辦,查詢指定用戶的流程任務列表,並完成任務
3、查看流程,查詢指定用戶發起的流程列表,並查看實時流程圖
效果演示
自動建表
數據庫無相關表,啟動程序,就會自動創建相關的表,共25張
注:自動創建的表中,act_re_deployment少兩個字段,部署流程時報錯,補全即可(VERSION_、PROJECT_RELEASE_VERSION_)
流程部署
單元測試,部署剛才的請假流程
import org.activiti.engine.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringbootActiviti7ApplicationTests { @Autowired private RepositoryService repositoryService; /** * 流程部署 */ @Test public void test() { repositoryService.createDeployment() .addClasspathResource("bpm/askForLeaveBpm.bpmn") .name("請假流程") .key("ASK_FOR_LEAVE_ACT") .deploy(); System.out.println("流程部署成功!"); } }
流程發起
http://localhost:10010/activiti/index
發起兩個請假流程,一個1天、一個5天
查看流程
http://localhost:10010/activiti/getHistoricProcessInstanceByUserName?username=zhangsan
查看指定用戶發起的流程
任務待辦
http://localhost:10010/activiti/queryUserTaskByUserName?username=wangwu
查看任務待辦,項目經理:lisi、部門經理:wangwu,並完當前成流程節點,流程會自動推進直至流程結束
流程結束
key1,請假小於3天,項目經理李四審批后流程直接結束
key2,請假大於3天,項目經理審批后,到部門經理審批,然后流程才結束
代碼開源
代碼已經開源、托管到我的GitHub、碼雲:
GitHub:https://github.com/huanzi-qch/springBoot
碼雲:https://gitee.com/huanzi-qch/springBoot
后記
簡單的整合實例暫時先記錄到這,后續有空再補充。
更新
2021-08-13更新
整合Activti官方編輯器插件
pom文件引入
<activiti.modeler.version>5.23.0</activiti.modeler.version> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-modeler</artifactId> <version>${activiti.modeler.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-diagram-rest</artifactId> <version>${activiti.modeler.version}</version> </dependency>
插件GitHub地址:https://github.com/Activiti/Activiti/tree/5.x/modules/activiti-webapp-explorer2
首先把開源項目下載成壓縮包,方便拷貝東西:
1、這幾個靜態資源拷貝到我們項目里
Activiti-5.x\modules\activiti-webapp-explorer2\src\main\webapp
2、拷貝這三個Controller到我們的項目里
Activiti-5.x\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\main\StencilsetRestResource.java
Activiti-5.x\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelEditorJsonRestResource.java
Activiti-5.x\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelSaveRestResource.java
3、拷貝這個json文件到我們項目的resources文件夾
Activiti-5.x\modules\activiti-webapp-explorer2\src\main\resources\stencilset.json
中文漢化:stencilset.json、en.json,這些文件默認都是英文的,找一個中文的替換即可
代碼修改
editor-app/app-cfg.js
三個Controller,同時都加上:@RequestMapping(value = "/service")
另外,保存方法的接參要改一改
為了方便,我們配置一下Security框架配置,所有請求都不需要登錄了(前端調用保存方法總是403沒權限,很煩)
/** * Security框架配置 */ @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http // 關閉csrf防護 .csrf().disable() .headers().frameOptions().disable() .and() //定制url訪問權限 .authorizeRequests() //無限登錄即可訪問 .antMatchers("/**").permitAll() //需要特定權限 // .antMatchers("/sysUser/**","/sysAuthority/**").hasAnyAuthority("ROLE_ADMIN","ROLE_SA") //其他接口登錄才能訪問 // .anyRequest().authenticated() .and() ; } }
http://localhost:10010/modeler/index
寫個流程管理頁面,可以進行CRUD、發布流程模型,同時還可以刪除流程部署
一個簡單的請假流程
將之前的請假流程發起的流程部署小調整一下,改成發起我們剛剛畫的流程(修改key值)
流程圖效果(其他的步驟跟之前的一樣,就沒什么好說的了,主要是看生成的流程圖效果)
可以看到,使用在線編輯器不僅方便、流程圖還比之前的好看,nice!
注意項:activiti7強依賴security框架,如果使用默認配置,可能導致有些有些API調用報403,建議還是使用自己的Security配置
參考:https://www.jianshu.com/p/cf766a713a86
參考
https://www.cnblogs.com/xuweiweiwoaini/p/13660394.html
https://www.jianshu.com/nb/41785678
https://blog.csdn.net/zhouchenjun001/article/details/103629559