springboot2.2 集成 activity6 请假完整示例
新手学习记录。写在springboot test 示例 示例代码地址看结尾。后面有带页面的示例。
SpringBoot Test无页面简单示例
员工请假流程
- 员工发起申请,附带请假信息(请假几天)
- 单位领导审批,如果通过,交付经理审批,不通过,重新申请
- 经理审批,如果请假天数不超过三天,经理1审批
- 如果请假天数在3-5天,经理3审批
- 超过5天,经理2审批
- 经理审批通过,流程结束,经理审批不通过,员工重新申请
流程图

代码
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&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
springboot2.2 集成 activity6 请假完整示例的更多相关文章
- eclipse 创建maven 项目 动态web工程完整示例
需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...
- SpringBoot2.0集成FastDFS
SpringBoot2.0集成FastDFS 前两篇整体上介绍了通过 Nginx 和 FastDFS 的整合来实现文件服务器.但是,在实际开发中对图片或文件的操作都是通过应用程序来完成的,因此,本篇将 ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- Springboot2.x集成Redis集群模式
Springboot2.x集成Redis集群模式 说明 Redis集群模式是Redis高可用方案的一种实现方式,通过集群模式可以实现Redis数据多处存储,以及自动的故障转移.如果想了解更多集群模式的 ...
- Springboot2.x集成Redis哨兵模式
Springboot2.x集成Redis哨兵模式 说明 Redis哨兵模式是Redis高可用方案的一种实现方式,通过哨兵来自动实现故障转移,从而保证高可用. 准备条件 pom.xml中引入相关jar ...
- Springboot2.x集成单节点Redis
Springboot2.x集成单节点Redis 说明 在Springboot 1.x版本中,默认使用Jedis客户端来操作Redis,而在Springboot 2.x 版本中,默认使用Lettuce客 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- WCF服务开发与调用的完整示例
WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...
- springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...
随机推荐
- P3879 阅读理解
都这么大了,you这些怎么能算生词呢,难道三年级以前就有人做蓝题了吗(是我不配) 我觉得这道题出难一点点的话,可以整行读入什么的(口嗨怪).先看题目,对于每个生词,输出他出现在了哪些文章(需要排序). ...
- 高可用服务注册中心(Eureka-Cluster)
在实际生产中,我们需要高可用的集群方案,本章就是基于SpringBoot1.5.4 Cloud(Dalston.SR2) 的高可用Eureka Cluster,以及生产中需要注意的事项… - Eure ...
- ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程
多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导入 多个不同格式的Sheet数据导入 ...
- Apache DolphinScheduler(海豚调度) - 1.3 系列核心表结构剖析
Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用. 近日 ...
- Instrction Arrangement UDH 4109 拓扑排序 or 最长路
题目描述 Ali has taken the Computer Organization and Architecture course this term. He learned that ther ...
- dotnet core 在 MIPS 下的移值进度
本文仍处于修订中 写在开始前 我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab i ...
- Elasticsearch 内存配置应用案例
Elasticsearch 内存配置 有三个可选项: 你主要做全文检索吗?考虑给 Elasticsearch 4 - 32 GB 的内存, 让 Lucene 通过操作系统文件缓存来利用余下的内存.那些 ...
- Beautiful Soup 4 方法便捷查询
目录 BS4便捷查询 属性 子节点 父节点 兄弟节点 格式化输出 搜索文档树 修改文档树 BS4便捷查询 准备 : import requests, re from bs4 import Beauti ...
- 如何写一个自己的HashMap
想必很多Java工程师出去面试的时候都会被问到HashMap的底层实现原理,很多人觉得没什么必要,反正我会用就行,就我的感觉而言,在初期确实没什么必要,但是站在公司角度想,如果面试者连底层实现都搞定了 ...
- Java数组倒置
Java数组之 -- 数组倒置 方法一 : package mytest; public class test2 { public static void main(String[] args ...