SpringBoot系列——Activiti7工作流引擎


  前言

  工作流程是我們日常開發項目中常見的功能,本文記錄springboot整合activiti7。

 

  Activiti介紹

  官網:https://www.activiti.org

 

  數據庫表

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM