activiti实现员工请假流程解析

 更新时间:2020年07月28日 10:09:43   作者:fly_fly_fly_pig  
这篇文章主要介绍了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请假流程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis-plus如何在xml中传入自定义的SQL语句

    Mybatis-plus如何在xml中传入自定义的SQL语句

    这篇文章主要介绍了Mybatis-plus如何在xml中传入自定义的SQL语句问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • C++实现扫雷游戏示例讲解

    C++实现扫雷游戏示例讲解

    这篇文章主要介绍了C++实现扫雷游戏示例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发

    SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列re

    这篇文章主要介绍了SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发 的相关资料,需要的朋友可以参考下
    2016-02-02
  • java实现LFU算法的示例代码

    java实现LFU算法的示例代码

    LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”,本文为大家整理了Java实现LFU算法的示例代码,需要的可以参考下
    2023-11-11
  • Jmeter参数化实现方法及应用实例

    Jmeter参数化实现方法及应用实例

    这篇文章主要介绍了Jmeter参数化实现方法及应用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 浅谈Java开发中的安全编码问题

    浅谈Java开发中的安全编码问题

    这篇文章主要介绍了浅谈Java开发中的安全编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java设计模式(实战)-责任链模式

    java设计模式(实战)-责任链模式

    这篇文章主要介绍了java设计模式(实战)-责任链模式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java字符串数字左右补全0的四种方式

    Java字符串数字左右补全0的四种方式

    这篇文章主要给大家介绍了关于Java字符串数字左右补全0的四种方式,在编程中有时候我们需要对一个字符串进行字符填充,以满足某些特定的要求,其中补全0是一种常见的需求,需要的朋友可以参考下
    2023-08-08
  • mybatis配置mapper-locations的坑及解决

    mybatis配置mapper-locations的坑及解决

    这篇文章主要介绍了mybatis配置mapper-locations的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot整合Quartz实现定时任务详解

    SpringBoot整合Quartz实现定时任务详解

    这篇文章主要介绍了Java 任务调度框架 Quartz,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。,下面我们来学习一下关于 Quartz更多的详细内容,需要的朋友可以参考一下
    2022-08-08

最新评论