Springboot 整合Activiti流程設計器 完成一個簡單的請假流程


1.前言

完成這個功能之前,我負責公司的流程管理模板,在眾多的解決方案當中,我選擇了Activiti 原因有:

  1. 開源、免費
  2. 整合Springboot較容易

Springboot已經成為開發后端不可缺少的一部分,它是如此完美,如此優秀!

2.准備

1.官方文檔:https://www.activiti.org/userguide/

2.下載一份官方准備的demo:https://www.activiti.org/get-started 選擇5.X download

這里選擇舊版本的原因是:新的版本會如果突然出現一些不知名的錯誤,或者是版本問題,會讓你頭皮發麻不知道怎么解決,網上新版本這一類的錯誤博客也很少,很浪費時間!

3.下載解壓

打開wars文件夾,復制war文件包到tomcat,利用tomcat對war包進行一個解壓,我們也可以不着急,可以登錄官方的demo進行嘗試一把

 

 放置到tomcat啟動后產生的文件夾

 

地址:htpp://localhost:你的端口號/activiti-explorer

 

 

用戶名:kermit 密碼:kermit

4.開始整合 mysql + activiti + thymeleaf

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>

按照官網文檔的指示,我們引入springboot-starter 依賴 就是這么方便

2.配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

##每次應用啟動不檢查Activiti數據表是否存在及版本號是否匹配 第一次設置為true 會自動創建表結構,之后即可設置為false 提高運行速度
spring.activiti.database-schema-update=true

 

3.復制文件

復制我們剛才放到tomcat解壓后的文件,選擇以下文件夾和文件復制到springboot static文件夾下

  •  diagram-viewer 文件夾
  •  editor-app 文件夾
  •  modeler.html

 

4.加入控制器

復制這三個文件到任意包下,並且為這三個文件加入注解:@RequestMapping("/service")

5.修改配置文件

修改editor-app/app-cfg.js文件,修改其請求路徑 和剛才修改的請求路徑保持一致

 

6.剔除啟動類里面的安全校驗

@SpringBootApplication(exclude = {
org.activiti.spring.boot.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})

 

 

7.項目啟動完畢,查看數據庫

25張表結構創建完畢,我簡單引用一下別人的博客內容如下:

u  ACT_GE_* : “GE”代表“General”(通用),用在各種情況下;

u  ACT_HI_* : “HI”代表“History”(歷史),這些表中保存的都是歷史數據,比如執行過的流程實例、變量、任務,等等。Activit默認提供了4種歷史級別:

Ø  none: 不保存任何歷史記錄,可以提高系統性能;

Ø  activity:保存所有的流程實例、任務、活動信息;

Ø  audit:也是Activiti的默認級別,保存所有的流程實例、任務、活動、表單屬性;

Ø  full:最完整的歷史記錄,除了包含audit級別的信息之外還能保存詳細,例如:流程變量。

這位大神的鏈接地址:https://www.cnblogs.com/telwanggs/p/7491564.html 查看更詳細的表結構介紹 

 

8.訪問靜態資源被攔截問題--》加入資源處理器

@Configuration
@EnableWebMvc
public class StaticResourceConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

}

 

開始流程代碼以及邏輯

1.首先是創建模型

創建模型呢可謂是流程管理的第一項,創建一個模型,我們呢需要在這個模型上進行流程圖的設計與修改,首先把模型創建好

這里只展示部分代碼,展示主要的功能,其他的具體內容,在文章尾部clone項目后進行查看

 1  @RequestMapping("createModel")
 2     public String createModel(HttpServletRequest request, HttpServletResponse response){
 3 
 4         String name  = "請假流程";
 5         String description = "這是一個請假流程";
 6 
 7         String id = null;
 8         try {
 9             Model model = repositoryService.newModel();
10             String key = name;
11             //版本號
12             String revision = "1";
13             ObjectNode modelNode = objectMapper.createObjectNode();
14             modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
15             modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
16             modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);
17 
18             model.setName(name);
19             model.setKey(key);
20             //模型分類 結合自己的業務邏輯
21             //model.setCategory(category);
22 
23             model.setMetaInfo(modelNode.toString());
24 
25             repositoryService.saveModel(model);
26             id = model.getId();
27 
28             //完善ModelEditorSource
29             ObjectNode editorNode = objectMapper.createObjectNode();
30             editorNode.put("id", "canvas");
31             editorNode.put("resourceId", "canvas");
32             ObjectNode stencilSetNode = objectMapper.createObjectNode();
33             stencilSetNode.put("namespace",
34                     "http://b3mn.org/stencilset/bpmn2.0#");
35             editorNode.put("stencilset", stencilSetNode);
36             repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8"));
37 
38             response.sendRedirect(request.getContextPath() + "/static/modeler.html?modelId=" + id);
39         } catch (Exception e) {
40             e.printStackTrace();
41         }
42 
43         return "index";
44     }
View Code

 

 

 

PS 模型建好了肯定要進行畫模型 我對流程設計器進行了漢化,這樣操作起來方便多了 我簡單畫一個

一個最簡單的請假流程 開始---》人事部審批----》總經理審批------》結束

 

這張圖表示在這個流程開始時候需要填寫的一些表單屬性 這些都是可以動態加載的!

 

任務派遣:就表示的意思是:這個任務到底是指派給誰去執行? 我這里指派給張三去執行 當有人提交這個流程的時候 提交的內容填寫完 就會有一個信息到張三這兒!

 

2.模型創建完畢,需要把模型發布為可用的流程定義(Process definition) 需要進行部署

 

 

 1 @RequestMapping("deploymentModel")
 2     @ResponseBody
 3     public JSONObject deploymentModel(String id) throws Exception {
 4 
 5         //獲取模型
 6         Model modelData = repositoryService.getModel(id);
 7         byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
 8 
 9         if (bytes == null) {
10             return JsonUtil.getFailJson("模型數據為空,請先設計流程並成功保存,再進行發布。");
11         }
12         JsonNode modelNode = modelNode = new ObjectMapper().readTree(bytes);
13 
14         BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
15         if (model.getProcesses().size() == 0) {
16             return JsonUtil.getFailJson("數據模型不符要求,請至少設計一條主線流程。");
17         }
18         byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
19 
20         //發布流程
21         String processName = modelData.getName() + ".bpmn20.xml";
22         Deployment deployment = repositoryService.createDeployment()
23                 .name(modelData.getName())
24                 .addString(processName, new String(bpmnBytes, "UTF-8"))
25                 .deploy();
26         modelData.setDeploymentId(deployment.getId());
27         repositoryService.saveModel(modelData);
28         return JsonUtil.getSuccessJson("流程發布成功");
29     }
View Code

 

部署后的流程定義會顯示部署ID  這個時候 模板就變成了流程定義

 

 

 

記住這個單詞 后面用到的地方特別多!!!!

這里給解釋一下這兩個詞的意思

  • 流程定義:可以理解為畫好的流程,已經發布過的,可以拿來用的一個模板
  • 流程實例:流程實例是流程定義由某個用戶啟動后,它存在於系統當中,它是一個實例; 

 

3.發布后的模型稱之為流程定義,開啟流程操作 

開啟流程的時候 我們需要一個頁面展示這個流程需要填寫的字段等 然后提交進行流程的下一步操作

 

 啟動一個流程,這里加載的是我們在畫流程圖時候輸入的表單,這里的提交人就是當前登錄的用戶(我這里沒有整合安全框架 隨便寫了一個做測試!)

審核人界面進行審批/駁回(暫時未有這個功能)

 

 這里是派遣給張三的任務,剛才提交的任務現在到張三的下面 進行一個審核,然后把這個任務提交到下一級(總經理審核)

 

 這里需要張三進行流程的審批。我們填寫表單后,進行提交,現在打開總經理(李四)的任務列表,發現有一個需要待處理的任務!

 

 

 

 這里我們既可以看到人事部審核的意見,也可以看到流程開始時候用戶提交的內容。流程圖也做了相應的更新。

 

寫在最后

作為一個剛接觸流程的小白,第一次打開這個流程啥都不懂,也慢慢摸索一些,從網上關於流程Activiti的資料很少。

總的來說就是:

  • 雜亂,沒有一個較好的學習資料可以參考
  • 這一方面的博客/文章較少

 

推薦學習:http://www.agilebpm.cn/

這是博主最近才接觸到的一個國內的流程開源版本,總體來說比國外這款Activiti好用,簡潔 Api較多,簡易

也不能說Activiti人家不好,就是說白了有點復雜,小白一下子上手不了,推薦從這款開源版本開始學習

 

參考:

https://www.cnblogs.com/zhouyun-yx/p/10410274.html

https://blog.csdn.net/sdufexsh/article/details/83111965#%E8%8E%B7%E5%8F%96UserTask%E4%B8%8A%E5%AE%9A%E4%B9%89%E7%9A%84%E5%8A%A8%E6%80%81%E8%A1%A8%E5%8D%95

https://www.jianshu.com/p/701056e672a4

https://www.cnblogs.com/telwanggs/p/7491564.html

 

錯誤解決:

class path resource [processes/] cannot be resolved to URL because it does not exist

解決方案:創建這個processes文件夾到resources下 隨便丟個文件進去

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

解決方案:剔除啟動校驗問題,向上看第六點

Could not write PNG file because no WriteAdapter is availble

解決方案:

依賴文件引入缺少問題 引入一下即可

<dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-codec</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-css</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-svg-dom</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-svggen</artifactId>
            <version>1.7</version>
        </dependency>
View Code

 

 

 

代碼實例開源:

碼雲:https://gitee.com/mrc1999/activiti

 


免責聲明!

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



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