activiti 实现驳回功能

原创 2018年04月16日 18:06:51

activiti功能上很多时候需要驳回,如请假单领导不同意驳回重写。有多种方式可以实现。

一、流程图上任务节点使用assigness或者candidate users动态的指定用户如使用变量${inputuser}如下图所示:



在部门审批时判断是不同意,自动回到发起人那里,因为发起人就一个人。如果到部门主管(假设可以多个)一级审核完成后,到总经理审批,总经理审批后不同意回退到部门主管,无法确定是哪一个,因为candidate有可能多个。

可以在经理审批的时候根据经理的审批判断条件是否驳回,然后根据此task找到此前执行这个任务的人回退给他,就是审批的时候带上${inputuser}。但是这样写不通用,每个task都要写各自的提交。

如果使用监听器,我的代码中是这样实现回退的功能的。

1、流程图

 


如上所示,显示提交到此任务和回退到此任务实现了两个流程监听器。指向此节点Task的连线监听器中寻找提交请假单人的部门主管。

回退到此Task连线监听器实现驳回后找到原来提交这步骤的人。任务上不要监听器只要指定assigness为${inputuser}。代码如下:

//正向流程
public class LeaveExecutionListener implements ExecutionListener {
	Expression type;
	private static final long serialVersionUID = 1L;
	@Override
	public void notify(DelegateExecution execution) throws Exception {
		String value = (String) type.getValue(execution);        // 获取到传递过来的参数
		ExecutionEntity entity=(ExecutionEntity)execution;  
              
		TransitionImpl transitionImpl=(TransitionImpl)entity.getEventSource();
		ActivityImpl actimpl=transitionImpl.getDestination();     //获取到流程的目的地
		String name=(String) actimpl.getProperties().get("name"); //获取目的地的名称
	                                                   
		Subject subject = SecurityUtils.getSubject();             //获取shiro
		ShiroUser  shiroUser=(ShiroUser) subject.getPrincipal();
		long userId = 0L;
		long deptId = 0L;
		if(shiroUser!=null){                                     //如果用户,不存在就跳转到登录界面
			userId=shiroUser.getId();
			deptId=shiroUser.getDeptID();
		}else{                        
			throw  new ExceptionUtil("process can find  userid or  dept info");
		}
		String positionName=StringTools.getPosition(name);      //获取到领导职称
		List<String> userNameList=TransmitType.valueOf(value).exec(positionName,userId,deptId);
		//根据树形查找任务分发的人
		execution.setVariable(IBaseFlow.SEND_DOC_INPUTUSER, userNameList);
	}
}
//驳回功能
public class RejectExecutionListener implements ExecutionListener {
	private static final long serialVersionUID = 1L;
	@Override
	public void notify(DelegateExecution execution) throws Exception {
		EngineServices services = execution.getEngineServices();
		ExecutionEntity entity = (ExecutionEntity) execution;
		String  processInstId=entity.getProcessInstanceId();          //流程实例Id
		TransitionImpl transitionImpl = (TransitionImpl) entity.getEventSource();
		ActivityImpl actimpl = transitionImpl.getDestination();
		String   taskDefKey= actimpl.getId();                          //task1
		List<HistoricTaskInstance>  list=services.getHistoryService().createHistoricTaskInstanceQuery().orderByTaskCreateTime().desc()
				.processInstanceId(processInstId)
				.taskDefinitionKey(taskDefKey)
				.list();
		if(list!=null){
			String user=list.get(0).getAssignee(); //获取最新的一个责任人信息回退给他
			execution.setVariable(IBaseFlow.SEND_DOC_INPUTUSER, user);
		}
	}
}
自此流程正向找到我的部门主管。当流程被总经理驳回。找到是谁办理了此任务,然后重新把任务给此人zhenjing。


Activiti 任意驳回

参考:http://blog.csdn.net/qq_30739519/article/details/51248516 本文基于分享牛(http://blog.csdn.net/qq_307395...
  • ZHAOXUSHENG
  • ZHAOXUSHENG
  • 2017-11-24 18:59:36
  • 986

activiti工作流的驳回等功能的封装

中国人的流程习惯是有来有往,能审批通过就应该能驳回。即可驳回到流程线上任意一节点,而国外的流程引擎思想这点与国内差别很大,为了满足国内的项目需要,就必须对这些流程引擎进行封装或改造。 我们采用的是a...
  • x9x9x9x9
  • x9x9x9x9
  • 2013-06-28 23:16:38
  • 13059

activiti工作流,驳回问题详细解析(尤其会签的驳回问题)

最近因为项目需要,所以研究了一下工作流,然而,我们都知道,国外的工作流框架,是不支持驳回问题的!这是其一!第二!项目的工作流要实现任意节点的流转,这也是国外工作流框架所不具备的!因此,国外的工作流框架...
  • zhangpan_soft
  • zhangpan_soft
  • 2017-12-09 21:45:56
  • 1882

activiti灵活跳转驳回回退操作动态修改流程

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExcept...
  • u011277123
  • u011277123
  • 2017-08-17 17:48:21
  • 1071

activiti之并行网关,驳回

并行网关并不能实现驳回功能
  • u013026207
  • u013026207
  • 2016-11-28 18:03:59
  • 3497

Activiti 驳回代码尝试修改

activiti 驳回代码尝试修改(备忘)       之前根据jbpm改过来的驳回代码是 把当前的任务直接改变成驳回到任务 ,偶以为相当的不妥 , 以后就没办法对驳回进行追踪,应该新建驳回的任务比...
  • nlwangxin
  • nlwangxin
  • 2014-06-03 20:44:23
  • 2790

Activiti 5.22.0 之自由驳回任务实现(亲测)

上篇博文,我们完成一个任务SKIP的实现,说好要给各位看官带来驳回实现的现在,就奉上具体实现和讲解。(其实我感觉我的注释写的已经非常清楚了,哈哈) 依旧是,先说我们的需求和思路。 PS: 从6....
  • yuanzhenwei521
  • yuanzhenwei521
  • 2018-01-20 17:50:24
  • 331

Activiti灵活跳转驳回回退操作动态修改流程

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExcept...
  • artaganan8
  • artaganan8
  • 2017-09-04 14:50:47
  • 629

Activiti 部署 启动 查询 驳回

此文以简单的宝马广告申请流程为示例 一 创建Activiti工作流所需要的23张表 二 部署、删除流程定义 三 启动流程 四 查询流程 五 流程驳回...
  • u013292160
  • u013292160
  • 2017-03-27 16:40:44
  • 2854

关于activiti驳回到任意节点的实现

我也是从网上找的,然后进行了简化和研究,固定驳回到draft节点,直接上代码,带注解的: @Override public void rejectTask(String procInstId, St...
  • sarck3
  • sarck3
  • 2013-09-17 17:17:04
  • 4174
收藏助手
不良信息举报
您举报文章:activiti 实现驳回功能
举报原因:
原因补充:

(最多只允许输入30个字)