完成這個功能以前,我負責公司的流程管理模板,在衆多的解決方案當中,我選擇了Activiti 緣由有:css
Springboot已經成爲開發後端不可缺乏的一部分,它是如此完美,如此優秀!html
1.官方文檔:https://www.activiti.org/userguide/java
2.下載一份官方準備的demo:https://www.activiti.org/get-started 選擇5.X downloadmysql
這裏選擇舊版本的緣由是:新的版本會若是忽然出現一些不知名的錯誤,或者是版本問題,會讓你頭皮發麻不知道怎麼解決,網上新版本這一類的錯誤博客也不多,很浪費時間!git
打開wars文件夾,複製war文件包到tomcat,利用tomcat對war包進行一個解壓,咱們也能夠不着急,能夠登陸官方的demo進行嘗試一把spring
放置到tomcat啓動後產生的文件夾sql
地址:htpp://localhost:你的端口號/activiti-explorer數據庫
用戶名:kermit 密碼:kermitapache
<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 依賴 就是這麼方便canvas
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
複製咱們剛纔放到tomcat解壓後的文件,選擇如下文件夾和文件複製到springboot static文件夾下
複製這三個文件到任意包下,而且爲這三個文件加入註解:@RequestMapping("/service")
修改editor-app/app-cfg.js文件,修改其請求路徑 和剛纔修改的請求路徑保持一致
@SpringBootApplication(exclude = { org.activiti.spring.boot.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class })
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 查看更詳細的表結構介紹
@Configuration @EnableWebMvc public class StaticResourceConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } }
建立模型呢可謂是流程管理的第一項,建立一個模型,咱們呢須要在這個模型上進行流程圖的設計與修改,首先把模型建立好
這裏只展現部分代碼,展現主要的功能,其餘的具體內容,在文章尾部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 }
一個最簡單的請假流程 開始---》人事部審批----》總經理審批------》結束
這張圖表示在這個流程開始時候須要填寫的一些表單屬性 這些都是能夠動態加載的!
任務派遣:就表示的意思是:這個任務究竟是指派給誰去執行? 我這裏指派給張三去執行 當有人提交這個流程的時候 提交的內容填寫完 就會有一個信息到張三這兒!
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 }
部署後的流程定義會顯示部署ID 這個時候 模板就變成了流程定義
記住這個單詞 後面用到的地方特別多!!!!
這裏給解釋一下這兩個詞的意思
開啓流程的時候 咱們須要一個頁面展現這個流程須要填寫的字段等 而後提交進行流程的下一步操做
啓動一個流程,這裏加載的是咱們在畫流程圖時候輸入的表單,這裏的提交人就是當前登陸的用戶(我這裏沒有整合安全框架 隨便寫了一個作測試!)
這裏是派遣給張三的任務,剛纔提交的任務如今到張三的下面 進行一個審覈,而後把這個任務提交到下一級(總經理審覈)
這裏須要張三進行流程的審批。咱們填寫表單後,進行提交,如今打開總經理(李四)的任務列表,發現有一個須要待處理的任務!
這裏咱們既能夠看到人事部審覈的意見,也能夠看到流程開始時候用戶提交的內容。流程圖也作了相應的更新。
做爲一個剛接觸流程的小白,第一次打開這個流程啥都不懂,也慢慢摸索一些,從網上關於流程Activiti的資料不多。
總的來講就是:
這是博主最近才接觸到的一個國內的流程開源版本,整體來講比國外這款Activiti好用,簡潔 Api較多,簡易
也不能說Activiti人家很差,就是說白了有點複雜,小白一會兒上手不了,推薦從這款開源版本開始學習
http://www.javashuo.com/article/p-cqmwlyeh-eg.html
http://www.javashuo.com/article/p-fmbzvrtl-mk.html
https://www.jianshu.com/p/701056e672a4
http://www.javashuo.com/article/p-cineuvbi-ex.html
解決方案:建立這個processes文件夾到resources下 隨便丟個文件進去
解決方案:剔除啓動校驗問題,向上看第六點
解決方案:
依賴文件引入缺乏問題 引入一下便可
<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>