新手学习记录。写在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

springboot2.2 集成 activity6 请假完整示例的更多相关文章

  1. eclipse 创建maven 项目 动态web工程完整示例

    需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...

  2. SpringBoot2.0集成FastDFS

    SpringBoot2.0集成FastDFS 前两篇整体上介绍了通过 Nginx 和 FastDFS 的整合来实现文件服务器.但是,在实际开发中对图片或文件的操作都是通过应用程序来完成的,因此,本篇将 ...

  3. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  4. Springboot2.x集成Redis集群模式

    Springboot2.x集成Redis集群模式 说明 Redis集群模式是Redis高可用方案的一种实现方式,通过集群模式可以实现Redis数据多处存储,以及自动的故障转移.如果想了解更多集群模式的 ...

  5. Springboot2.x集成Redis哨兵模式

    Springboot2.x集成Redis哨兵模式 说明 Redis哨兵模式是Redis高可用方案的一种实现方式,通过哨兵来自动实现故障转移,从而保证高可用. 准备条件 pom.xml中引入相关jar ...

  6. Springboot2.x集成单节点Redis

    Springboot2.x集成单节点Redis 说明 在Springboot 1.x版本中,默认使用Jedis客户端来操作Redis,而在Springboot 2.x 版本中,默认使用Lettuce客 ...

  7. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. WCF服务开发与调用的完整示例

    WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...

  9. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

随机推荐

  1. P3879 阅读理解

    都这么大了,you这些怎么能算生词呢,难道三年级以前就有人做蓝题了吗(是我不配) 我觉得这道题出难一点点的话,可以整行读入什么的(口嗨怪).先看题目,对于每个生词,输出他出现在了哪些文章(需要排序). ...

  2. 高可用服务注册中心(Eureka-Cluster)

    在实际生产中,我们需要高可用的集群方案,本章就是基于SpringBoot1.5.4 Cloud(Dalston.SR2) 的高可用Eureka Cluster,以及生产中需要注意的事项… - Eure ...

  3. ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程

    多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导入 多个不同格式的Sheet数据导入 ...

  4. Apache DolphinScheduler(海豚调度) - 1.3 系列核心表结构剖析

    Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用. 近日 ...

  5. Instrction Arrangement UDH 4109 拓扑排序 or 最长路

    题目描述 Ali has taken the Computer Organization and Architecture course this term. He learned that ther ...

  6. dotnet core 在 MIPS 下的移值进度

    本文仍处于修订中 写在开始前 我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab i ...

  7. Elasticsearch 内存配置应用案例

    Elasticsearch 内存配置 有三个可选项: 你主要做全文检索吗?考虑给 Elasticsearch 4 - 32 GB 的内存, 让 Lucene 通过操作系统文件缓存来利用余下的内存.那些 ...

  8. Beautiful Soup 4 方法便捷查询

    目录 BS4便捷查询 属性 子节点 父节点 兄弟节点 格式化输出 搜索文档树 修改文档树 BS4便捷查询 准备 : import requests, re from bs4 import Beauti ...

  9. 如何写一个自己的HashMap

    想必很多Java工程师出去面试的时候都会被问到HashMap的底层实现原理,很多人觉得没什么必要,反正我会用就行,就我的感觉而言,在初期确实没什么必要,但是站在公司角度想,如果面试者连底层实现都搞定了 ...

  10. Java数组倒置

    Java数组之    -- 数组倒置 方法一 :  package mytest; public class test2 { public static void main(String[] args ...