activiti实现员工请假流程解析

源码下载:

http://xiazai.jb51.net/202007/yuanma/FirstActiviti_jb51.rar

链接: https://pan.baidu.com/s/1tCN7SDAdEUerZxcTr_9cqA

提取码: twmp

在开始之前,先说一下刚开始学习工作流的时候遇到的问题,感觉比较困惑,经过这两天的学习,也算有所收获

1.部署了多个流程变量,如何准确开启特定的流程
2. 在一个流程的执行过程中,怎么确定执行到哪一步,即执行到哪个任务了
3. 在有多种情况的条件下,怎么判断要去的方向

先不急着解决,来看看我的工程

工程模拟情况

员工请假流程

  • 员工发起申请,附带请假信息(请假几天)单位领导审批,如果通过,交付经理审批,不通过,重新申请经理审批,如果请假天数不超过三天,经理1审批
  • 如果请假天数在3-5天,经理3审批
  • 超过5天,经理2审批经理审批通过,流程结束,经理审批不通过,员工重新申请

流程图

领导意见和经理意见,用0和1表示,0表示未通过,1表示通过

多种执行情况

一.不超过3天,经理1审批,同意申请

二.3-5天,经理3审批,同意申请

三. 5天以上,经理2审批,同意申请

四. 任一环节设置不同意,陷入死循环
情况:请假天数超过5天,领导同意申请,经理2审批,且不同意申请

我的流程中,是一次执行完所有任务,直到流程结束,刚开始学习的小伙伴肯定很苦恼于这个问题,怎么让流程自己执行下去,我前两天一直在想这个问题

要解决这个问题,随之而来的第一个问题是,怎么获取当前任务,换句话说,就是怎么跟踪流程

每个流程运行时,都会产生一个进程实例.这是一个ProcessInstance对象,相当于一个实体类,在数据库中有他的信息,而且在这个流程执行完之前,这个实例流程会一直存在,并且id值不会变.

那么,我们可不可以在每次启动流程时都将这个ProcessInstance对象保存记录下来,然后再通过他的id值来查询当前任务,也就是来跟踪流程的执行情况
给出获取代码

//开启流程
		ProcessInstance processInstance = runtimeService
		.startProcessInstanceByKey(processKey, variables);
		processInstanceId = processInstance.getId();

然后,通过id值来获取当前任务

Task task = taskService.createTaskQuery()//创建查询对象
				.processInstanceId(processInstanceId)//通过流程实例id来查询当前任务
				.singleResult();//获取单个查询结果

这样就可以跟踪流程啦!!!

这时候,问题又来了,怎么确定流程执行完了呢?怎么让程序自己找下一个任务?

还是用到ProcessInstance对象,前面说过,这个进程实例对象在流程执行完之前会一直存在,也就是说,流程执行完,这个对象就消失了,数据库自动就给他删除了.所以可以根据processInstanceId来查询ProcessInstance对象,如果为空,说明流程已经走完了,否则,没有走完

获取ProcessInstance对象的代码

this.processEngine.getRuntimeService()
				.createProcessInstanceQuery()//获取查询对象
				.processInstanceId(processInstanceId)//根据id查询流程实例
				.singleResult();//获取查询结果,如果为空,说明这个流程已经执行完毕,否则,获取任务并执行

这样就可以判断流程是否结束了

那么,接下来,就是如何让流程自己找下一个任务,这里我用了一个while循环来解决,直接给出我的代码

//开始进行流程
		while(this.processEngine.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);
			}
		}

我的处理是把每个任务的完成,都封装成一个方法,要完成该任务时直接调用该方法就行,传入的参数是当前的任务的Task对象.

任务完成函数

//职员提交申请
	public void completeEmployeeTask(Task task){
		//获取任务id
		String taskId = task.getId();

		//完成任务
		this.processEngine.getTaskService().complete(taskId);
		System.out.println("职员已经提交申请.......");

	}
	//领导审批
	public void completeLeaderTask(Task task){
		//获取任务id
		String taskId = task.getId();

		//领导意见
		Map<String, Object> variables = new HashMap<String, Object>();
		//variables.put("day",4);
		variables.put("leaderResult", 1);
		//完成任务
		this.processEngine.getTaskService().complete(taskId, variables);
		System.out.println("领导审核完毕........");

	}
	//经理审批
	public void completeJingliTask(Task task){
		//获取任务id
		String taskId = task.getId();
		String name = task.getName();
		//经理意见
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("result", 0);
		//完成任务
		this.processEngine.getTaskService().complete(taskId, variables);
		System.out.println("经理审核完毕........,审核经理:"+name);

	}

有的小伙伴就要问,明明经理审核时有三个经理,为什么只写了一个经理审批函数呢?

在经理审核之前,是一个排他网关,网关后面出来的连接线中可以设置筛选条件,满足谁就去谁那里,设置见图

这里的变量是在领导审批这个任务完成之后传过来的,参数传递方法见上篇博文:https://www.jb51.net/article/182226.htm

这样,就实现了这个流程的基本运转啦!!

哦,对,还有一个问题,部署了多个流程变量,如何准确开启特定的流程
每个流程在定义的时候,都有一个id值,启动时便通过这个id值来启动,所以记住你设置的id值就可以啦!!!

到此这篇关于activiti实现员工请假流程解析的文章就介绍到这了,更多相关activiti请假流程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现Activities之间进行数据传递的方法

    本文实例讲述了Android实现Activities之间进行数据传递的方法.分享给大家供大家参考.具体分析如下: 首先,先说明一下Activity的启动及关闭: 1. startActivity(Intent intent);  启动Activity        finish();  结束当前Activity 2. startActivityForResult(Intent intent, int requestCode);  以指定的请求码requestCode启动Activity fini

  • spring boot activiti工作流的搭建与简单使用

    前言 最近一直研究springboot,根据工作需求,工作流需要作为一个单独的微服务工程来提供给其他服务调用,现在简单的写下工作流(使用的activiti)微服务的搭建与简单使用 jdk:1.8 数据库:mysql  5.7 IDE:eclipse springboot:1.5.8 activiti:6.0.0 1.新建空白的maven微服务架构 新建maven项目的流程不在阐述,这里添加上activiti.myslq连接的依赖,只贴主要代码 pox.xml <project xmlns="

  • 解决Springboot2.1.x配置Activiti7单独数据源问题

    1|1简介 最近基于最新的Activiti7配置了SpringBoot2. 简单上手使用了一番.发现市面上解决Activiti7的教程很少,采坑也比较多,在Activiti6配置数据源和Activiti7有所区别,基于Activiti6在Activiti7里是无法正常使用的.接下来让我们看下区别. 1|2问题 Activiti6多数据源配置 6的配置比较简单点. 先加入配置: # activiti 数据源 spring.datasource.activiti.driver=com.mysql.j

  • Activiti流程图查看实例

    本文实例展示了Activiti流程图查看的实现方法,具体步骤如下所示: 1.测试用例查看图片代码如下: public void viewImage() throws Exception { // 创建仓库服务对对象 RepositoryService repositoryService = processEngine.getRepositoryService(); // 从仓库中找需要展示的文件 String deploymentId = "701"; List<String&g

  • SpringBoot2整合activiti6环境搭建过程解析

    这篇文章主要介绍了SpringBoot2整合activiti6环境搭建过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </d

  • activiti获取流程图实例

    本文实例讲述了activiti获取流程图的方法,具体操作步骤如下: 1.发布流程代码如下: repositoryService.createDeployment() .name("expense-process.bar") .addClasspathResource("org/activiti/expenseProcess.bpmn20.xml") .addClasspathResource("org/activiti/expenseProcess.png

  • Android开发之activiti节点跳转

    activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业务非常的复杂,比如一个简单的采购流程:流程如下: 供应商上新商品的时候,提交商务审核,商务审核通过提交运营审核,审核失败退回供应商. 运营审核成功提交合同签订.交运营审核审核失败退回商务审核或者直接退回供应商. 合同签订审核通过结束,合同签订审核不通过返回运营审核或者退回商务审核,或者退回供应商. 上面的流程就出现了一个问题,什么问题呢? 我们来观察一下退回线的问题. 1.商务审核退回供应商上新. 2.运营审核可能退回商务审核,运

  • SpringBoot整合Activiti7的实现代码

    Activiti7发布正式版之后,它与SpringBoot2.x已经完全支持整合开发.我们可以将Activiti7与SpringBoot整合开发的坐标引入到工程中,从而达到SpringBoot支持Activti7整合. 1.使用IDEA创建SpringBoot项目 在工程的pom.xml文件中引入相关的依赖,具体依赖如下所示 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht

  • activiti实现员工请假流程解析

    源码下载: http://xiazai.jb51.net/202007/yuanma/FirstActiviti_jb51.rar 链接: https://pan.baidu.com/s/1tCN7SDAdEUerZxcTr_9cqA 提取码: twmp 在开始之前,先说一下刚开始学习工作流的时候遇到的问题,感觉比较困惑,经过这两天的学习,也算有所收获 1.部署了多个流程变量,如何准确开启特定的流程 2. 在一个流程的执行过程中,怎么确定执行到哪一步,即执行到哪个任务了 3. 在有多种情况的条件

  • springboot2.2 集成 activity6实现请假流程(示例详解)

    新手学习记录.写在springboot test 示例  示例代码地址看结尾.后面有带页面的示例. SpringBoot Test无页面简单示例 员工请假流程 员工发起申请,附带请假信息(请假几天) 单位领导审批,如果通过,交付经理审批,不通过,重新申请 经理审批,如果请假天数不超过三天,经理1审批 如果请假天数在3-5天,经理3审批 超过5天,经理2审批 经理审批通过,流程结束,经理审批不通过,员工重新申请 流程图 代码 activiti.cfg.xml为必须文件且数据库连接正确,否则Proc

  • python manage.py runserver流程解析

    这篇文章主要介绍了python manage.py runserver流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 版本 python27 django 1.0 搭建可运行的环境 创建python27 虚拟环境 github 下载 django-1.0.tar.gz(1.0 版本的django) 解压 可以看到,有个 demo 在 examples 目录 把 django 目录拷贝到 examples 下面,这样 example 可以

  • Android9.0 SystemUI 网络信号栏定制修改的流程解析

    前情提要 Android 8.1平台SystemUI 导航栏加载流程解析 9.0 改动点简要说明 1.新增 StatusBarMobileView 替代 SignalClusterView,用以控制信号栏显示 同时增加的还有 StatusBarIconView.StatusBarWifiView 2.整体流程和 8.1 类似 效果图 整体流程图 上代码 先来看初始赋值的地方 MobileSignalController.java,在 notifyListeners() 方法中进行我们对应的定制,

  • 采用React编写小程序的Remax框架的编译流程解析(推荐)

    Remax是蚂蚁开源的一个用React来开发小程序的框架,采用运行时无语法限制的方案.整体研究下来主要分为三大部分:运行时原理.模板渲染原理.编译流程:看了下现有大部分文章主要集中在Reamx的运行时和模板渲染原理上,而对整个React代码编译为小程序的流程介绍目前还没有看到,本文即是来补充这个空白. 关于模板渲染原理看这篇文章:https://www.jb51.net/article/132635.htm 关于remax运行时原理看这篇文章:https://www.jb51.net/artic

  • Openstack各组件逻辑关系及运行流程解析

    目录 各组件逻辑关系图 Openstack 新建云主机流程图 虚拟机启动过程 各组件逻辑关系图 Keystone:认证服务 Glance:镜像服务 Nova:计算服务 Neutron:网络服务 Cinder:存储服务 Horizon:web 界面 Cellometer:监控计费 Swit:对象存储 Heat:编排服务(通过剧本,批量部署虚拟机) Openstack 新建云主机流程图 keystone 身份认证 填写创建云主机的相关配置–> nova-api --> 将相关信息保存到 MySQL

  • Python可视化程序调用流程解析

    目录 引言 安装 graphviz 工具 实战 引言 今天我们来分享一个 Python 领域的神级第三方库 -- pycallgraph,通过该库并结合 graphviz 工具,就可以非常方便的完成 Python 应用程序调用流程的可视化工作 我们先来看下效果图 怎么样,很是惊艳吧~ 下面我们就来一起完成这个可视化过程 安装 graphviz 工具 生成图片的过程,是依赖工具 graphviz 的,我们先进行下载安装 下载地址 www.graphviz.org/download/ 详细对于 gr

  • Kubernetes Informer数据存储Index与Pod分配流程解析

    目录 确立目标 Process 查看消费的过程 Index 掌握Index数据结构 distribute 信息的分发distribute 理解一个pod的被调度的大致流程 Scheduler SchedulingQueue scheduleOne ScheduleResult 调度计算结果 Assume 初步推算 Bind 实际绑定 Update To Etcd Summary 确立目标 理解Informer的数据存储方式 大致理解Pod的分配流程 理解Informer的数据存储方式 代码在k8

  • Android Handler runWithScissors 梳理流程解析

    目录 前言 runWithScissors 梳理流程 存在的问题 总结 前言 看 WMS 代码的时候看到了 Handler.runWithScissors 方法,所以来恶补一下 public static WindowManagerService main(final Context context, final InputManagerService im,final boolean showBootMsgs, final boolean onlyCore, WindowManagerPoli

  • NodeJs Express中间件使用流程解析

    目录 1.调用流程 2.格式 3.next函数的作用 4.定义中间件函数 5.全局生效的中间件 6.中间件的作用 7.定义多个全局中间件 8.局部生效的中间件 9.定义多个局部中间件 10.了解中间件的注意事项 11.中间件的分类 1.应用级别的中间件 2.路由级别的中间件 3.错误级别的中间件 4.Express内置的中间件 5.第三方中间件 6.自定义中间件 中间件(Middleware),特指业务流程的中间处理环节 1.调用流程 当一个请求到达Express的服务器之后,可以连续调用多个中

随机推荐