1. 程式人生 > 程式設計 >springboot2.2 整合 activity6實現請假完整流程示例詳解

springboot2.2 整合 activity6實現請假完整流程示例詳解

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

SpringBoot Test無頁面簡單示例

員工請假流程

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

流程圖

springboot2.2 整合 activity6實現請假完整流程示例詳解

程式碼

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",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。就不貼上程式碼,直接放示例程式碼吧。

流程圖

springboot2.2 整合 activity6實現請假完整流程示例詳解

效果圖

springboot2.2 整合 activity6實現請假完整流程示例詳解

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

到此這篇關於springboot2.2 整合 activity6實現請假完整流程示例詳解的文章就介紹到這了,更多相關springboot2.2整合activity6請假內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!