1. 程式人生 > 實用技巧 >springboot2.2 整合 activity6 請假完整示例

springboot2.2 整合 activity6 請假完整示例

新手學習記錄。寫在springboot test 示例 示例程式碼地址看結尾。後面有帶頁面的示例。

SpringBoot Test無頁面簡單示例

員工請假流程

  1. 員工發起申請,附帶請假資訊(請假幾天)
  2. 單位領導審批,如果通過,交付經理審批,不通過,重新申請
  3. 經理審批,如果請假天數不超過三天,經理1審批
  4. 如果請假天數在3-5天,經理3審批
  5. 超過5天,經理2審批
  6. 經理審批通過,流程結束,經理審批不通過,員工重新申請

流程圖

程式碼

activiti.cfg.xml為必須檔案且資料庫連線正確,否則ProcessEngines.getDefaultProcessEngine()會報空指標。

<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Activity 的引擎配置管理器 --> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!-- 指定資料來源 --> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activity?serverTimezone=UTC&amp;characterEncoding=UTF-8" /> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="111111" /> <property name="databaseSchemaUpdate" value="true" /> </bean> </beans>

測試類

三個方法可合併在一起執行,拆開是自己為了方便檢視程式碼步驟。

1. 先執行deploymentProcess()部署一個流程。

2. 執行startLeaveProcess() 開啟流程。

3. 執行getTaskAndComplete()走流程。迴圈一次性整個流程走完。

package com.blackcat.activity;
 
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.HashMap; import java.util.Map; /** * @Title 申請測試 * @Description * @author zhanghui * @date 2020年07月17日 15:06 * @version V1.0 * @see * @link https://blog.csdn.net/fly_fly_fly_pig/article/details/81700820 參考該部落格 * @since V1.0 */ @SpringBootTest class LeaveProcessTest { // 獲取預設的流程引擎 private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 例項流程id,用來記錄流程,以便獲取當前任務 private String processInstanceId; // 部署一個流程 @Test void deploymentProcess(){ RepositoryService rs = engine.getRepositoryService(); Deployment deploy = rs.createDeployment().addClasspathResource("processes/LeaveProcess.bpmn").deploy(); rs.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); } // 開啟流程 @Test void startLeaveProcess(){ // 獲取runtimeservice物件 RuntimeService runtimeService = engine.getRuntimeService(); // 根據流程key值,獲取流程 String processKey = "leaveProcess"; // 將資訊加入map,以便傳入流程中 Map<String, Object> variables = new HashMap<>(); variables.put("employeeName", "張三"); variables.put("day",10); // 開啟流程 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, variables); // 將得到的例項流程id值賦給之前設定的變數 processInstanceId = processInstance.getId(); System.out.println("流程開啟成功.......例項流程id:"+processInstanceId); } // 開始走流程 // 1.獲取當前任務,並且完成 @Test void getTaskAndComplete(){ // processInstanceId = "12501"; // 獲取taskservice例項 TaskService taskService = engine.getTaskService(); // 開始進行流程 while(engine.getRuntimeService() .createProcessInstanceQuery()// 獲取查詢物件 .processInstanceId(processInstanceId)// 根據id查詢流程例項 .singleResult()// 獲取查詢結果,如果為空,說明這個流程已經執行完畢,否則,獲取任務並執行 !=null){ Task task = taskService.createTaskQuery()// 建立查詢物件 .processInstanceId(processInstanceId)// 通過流程例項id來查詢當前任務 .singleResult();// 獲取單個查詢結果 String taskName = task.getName(); if(taskName.equals("發起申請")){// 職員節點 completeEmployeeTask(task); }else if(taskName.equals("領導審批")){// 領導節點 completeLeaderTask(task); }else{// 經理節點 completeJingliTask(task); } } System.out.println("稽核結束.........."); } // 職員提交申請 void completeEmployeeTask(Task task){ // 獲取任務id String taskId = task.getId(); // 完成任務 engine.getTaskService().complete(taskId); System.out.println("職員已經提交申請......."); } // 領導審批 void completeLeaderTask(Task task){ // 獲取任務id String taskId = task.getId(); // 領導意見 Map<String, Object> variables = new HashMap<>(); variables.put("leaderResult", 1); // 完成任務 engine.getTaskService().complete(taskId, variables); System.out.println("領導稽核完畢........"); } // 經理審批 void completeJingliTask(Task task){ // 獲取任務id String taskId = task.getId(); String name = task.getName(); // 經理意見 // 領導意見和經理意見,用0和1表示,0表示未通過,1表示通過 // 任一環節設定不同意,陷入死迴圈 Map<String, Object> variables = new HashMap<>(); variables.put("result", 1); // 完成任務 engine.getTaskService().complete(taskId, variables); System.out.println("經理稽核完畢........,稽核經理:"+name); } }

參考部落格:https://blog.csdn.net/fly_fly_fly_pig/article/details/81700820

原始碼地址:https://gitee.com/kylin_lawliet/springboot-demos/tree/master/springboot-activity3

SpringBoot含頁面完整示例

流程方面與上方示例程式碼差不多,加了頁面與mybatis plus。就不貼上程式碼,直接放示例程式碼吧。

流程圖

效果圖

原始碼地址:https://gitee.com/kylin_lawliet/springboot-demos/tree/master/springboot-activity4