Activiti7工作流程引擎之组任务

目录

流程设计

流程部署,启动及前两个环节处理

候选人任务设置

用户查询组任务

用户拾取组任务

用户查询个人待办任务

归还组任务

任务交接

用户办理个人任务


 

流程设计

注:此时总经理审批环节不设定具体的负责人,而是采用用户组的方式(即这三个人都有权限审批)

流程部署,启动及前两个环节处理

 
package org.wxy.com.activiti;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.wxy.com.model.Holiday;

//组任务测试
public class CandidateUserTest {
	
	
	//第一步:流程部署
	@Test
	public  void testprocessdeploy(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		
		//通过流程架构知道所有的service都是通过ProcessEngine调用的
		//创建部署对象
		RepositoryService  repositoryService  = processEngine.getRepositoryService();
		//流程部署
		repositoryService.createDeployment().addClasspathResource("leveldef.bpmn")
		                                     .addClasspathResource("leveldef.png")
		                                     .name("请假审批流程")
		                                     .activateProcessDefinitionsOn(new Date())
		                                     .deploy();
		
     }
	
	//第二步:流程实例的启动
	@Test
	public  void testprocessstart(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		//流程定义key
		String  processDefinitionKey  = "myProcess";
		//流程定义激活即有效
		RepositoryService  repositoryService  = processEngine.getRepositoryService();
		repositoryService.activateProcessDefinitionByKey(processDefinitionKey);
		
		//流程定义终止即无效
		//repositoryService.suspendProcessDefinitionByKey("myProcess");
		//创建流程启动对象
		RuntimeService runtimeService = processEngine.getRuntimeService();
		//业务id
		String  businessKey = "2";
		//在启动流程实例时设置流程变量
		Map<String, Object> variables = new HashMap<String, Object>();
		//员工王五填写请假申请
		variables.put("staff", "王五");
		//设置部门领导审批负责人
		variables.put("divManager", "张三");
		//总经理审批环节采用组任务处理
		
		//分支变量控制
		Holiday holiday = new Holiday(); 
		holiday.setNum(4);
		//员工填写申请当
		variables.put("holiday", holiday);
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey, variables);
		System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
     	System.out.println("流程实例id:"+processInstance.getProcessInstanceId());
	}
	

	//第三步:员工王五填写请假单处理
	@Test
	public  void testStaffHandler(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		//流程定义key
		//创建流程启动对象
		String  processDefinitionKey  = "myProcess";
		TaskService taskService = processEngine.getTaskService();
		//查询当前用户的任务
		Task task = taskService.createTaskQuery().
				processDefinitionKey(processDefinitionKey).
				taskAssignee("王五").singleResult();
		
		if(task != null){
			String  taskId  = task.getId();
			taskService.complete(taskId);
		}
    }
	
	

	//第四步:部门领导审批
	@Test
	public  void testDeptHandler(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		//流程定义key
		//创建流程启动对象
		String  processDefinitionKey  = "myProcess";
		TaskService taskService = processEngine.getTaskService();
		//查询当前用户的任务
		Task task = taskService.createTaskQuery().
				processDefinitionKey(processDefinitionKey).
				taskAssignee("张三").singleResult();
		if(task != null){
			String  taskId  = task.getId();
			taskService.complete(taskId);
		}
    }
	
	
	
}

此时任务进入到总经理审批环节设置候选人为张飞,张三,张忠三个人,在act_ru_tack表中显示ASSIGEE字段为null(在流程定义是故意未设定),

 
候选人设置中文问题
 
流程定义中在总经理审批环节设置候选人为中文 张三,张飞,张忠时 ,在总经理审批环节发现当前参与的用户participant为一条数据
 
而流程定义中在总经理审批环节设置候选人为英文 zhangsan,zhangfei,zhangzhong 时,在总经理审批环节发现当前参与的用户participant为三个用户
 
 
流程定义中在总经理审批环节设置候选人为中文 张三,张飞,张忠时查询候选人任务是查不到数据?
 
	@Test
	public void findGroupTaskList() {
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		// 流程定义key
		String processDefinitionKey = "myProcess";
		// 任务候选人
		String candidateUser = "张三";
		// 创建TaskService
		TaskService taskService = processEngine.getTaskService();
		//查询组任务
		List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
		//根据候选人查询
		for (Task task : list) {
		System.out.println("----------------------------");
		System.out.println("流程实例id:" + task.getProcessInstanceId());
		System.out.println("任务id:" + task.getId());
		System.out.println("任务负责人:" + task.getAssignee());
		System.out.println("任务名称:" + task.getName());
		}
	}
因此在中文情况下程序是将张三,张飞,张忠看成了一个用户参与者,因此会查不到数据。

候选人任务设置

 
 

用户查询组任务

 
候选人设置成英文,根据候选人查询用户组任务
 
	@Test
	public void findGroupTaskList() {
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		// 流程定义key
		String processDefinitionKey = "myProcess";
		// 任务候选人
		String candidateUser = "zhangsan";
		// 创建TaskService
		TaskService taskService = processEngine.getTaskService();
		//查询组任务
		List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
		//根据候选人查询
		for (Task task : list) {
		System.out.println("----------------------------");
		System.out.println("流程实例id:" + task.getProcessInstanceId());
		System.out.println("任务id:" + task.getId());
		System.out.println("任务负责人:" + task.getAssignee());
		System.out.println("任务名称:" + task.getName());
		}
	}
	

 通过设置的总经理审批候选人zhangsan查询用户组任务如下

注:因为设置的是候选之人,没有具体分配负责人因此任务负责人为nul,符合预期结果。
 
 

用户拾取组任务

 
候选人查询出任务,然后拾取任务为个人任务
 
	//候选人拾取任务
	@Test
	public void claimTask(){
		//获取流程引擎
		ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
		// 流程定义key
		String processDefinitionKey = "myProcess";
		TaskService taskService = processEngine.getTaskService();
		//要拾取的任务id
		//任务候选人
		String candidateUser = "zhangsan";
		//拾取任务
		//即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
		//校验该用户有没有拾取任务的资格
		Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
				     taskCandidateUser(candidateUser).singleResult();
		if(task!=null){
			taskService.claim(task.getId(), candidateUser);
			System.out.println("任务拾取成功");
		} 
	}

注:1.拾取任务方法    taskService.claim(task.getId(), candidateUser)  其他代码和候选人查询用户组任务都一样。

         2.候选人拾取任务就是将候选人变成该环节具体负责人的过程

select * from act_ru_task; ##记录运行中的流程实例即将要执行的任务

select *from act_hi_actinst;

此时总经理审批环节,就有具体的负责人为zhangsan

用户查询个人待办任务

 
	    //第六步查询自己的任务
			@Test
			public void queryAssignTask(){
				//获取流程引擎
				ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
				// 流程定义key
				String processDefinitionKey = "myProcess";
				TaskService taskService = processEngine.getTaskService();
				//任务负责人
				String assignee = "zhangsan";
				//查询自己的任务
				List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
						taskAssignee(assignee).list();
				
				if(taskList != null && taskList.size()>0){
					for (Task task : taskList) {
						System.out.println("----------------------------");
						System.out.println("流程实例id:" + task.getProcessInstanceId());
						System.out.println("任务id:" + task.getId());
						System.out.println("任务负责人:" + task.getAssignee());
						System.out.println("任务名称:" + task.getName());
					}
				}
			}
	

此时总经理审批环节具体负责人,就变成了zhangsan

归还组任务

场景:候选人zhangsan拾取任务后,又想退回任务(前提是该任务zhangsan未执行,如果执行完了自动进入到下一个环节了)

	       //任务归还
			@Test
			public void discardTask(){
				//获取流程引擎
				ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
				// 流程定义key
				String processDefinitionKey = "myProcess";
				TaskService taskService = processEngine.getTaskService();
				//任务候选人
				String assignee = "zhangsan";
				//拾取任务
				//即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
				//校验该用户有没有拾取任务的资格
				Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
						taskAssignee(assignee).singleResult();
				if(task!=null){
					taskService.setAssignee(task.getId(),null);
					System.out.println("归还组任务成功");
				} 
			}

 注:这里张三已经成为审批的负责人,因此使用taskAssign()查询的

				Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
						taskAssignee(assignee).singleResult();

 这里张三已经成为审批的负责人,如果再用候选人查询是无任务的

		Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
				     taskCandidateUser(candidateUser).singleResult();

归还组任务只需该任务的负责人为null 即可taskService.setAssignee(task.getId(),null);

注:

说明:建议归还任务前校验该用户是否是该任务的负责人
也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议
不要这样使用)

任务交接

	@Test//任务交接
			public void handoverTask(){
				//获取流程引擎
				ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
				// 流程定义key
				String processDefinitionKey = "myProcess";
				TaskService taskService = processEngine.getTaskService();
				//任务负责人
				String assignee = "zhangsan";
				
				String candidateUser = "zhangfei";
				//查询自己的任务
				List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
						taskAssignee(assignee).list();
				if(taskList != null && taskList.size()>0){
					for (Task task : taskList) {
						taskService.setAssignee(task.getId(),candidateUser);
						System.out.println("zhangsan将任务交给候选人zhangfei");
					}
				}
			}

 

用户办理个人任务


	    //第七步处理任务
		@Test
		public void handlerTask(){
			//获取流程引擎
			ProcessEngine  processEngine = ProcessEngines.getDefaultProcessEngine();
			// 流程定义key
			String processDefinitionKey = "myProcess";
			TaskService taskService = processEngine.getTaskService();
			//任务负责人
			String assignee = "zhangfei";
			//查询自己的任务
			List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
					taskAssignee(assignee).list();
			if(taskList != null && taskList.size()>0){
				for (Task task : taskList) {
					taskService.complete(task.getId());
				}
			}
		}

此时审批进入下一个环节人事存档

 
 
 
 
 
 
####部署后涉及三张表
select * from act_re_deployment; ##部署信息
select * from act_re_procdef; ##流程定义信息
SELECT * from act_ge_bytearray;##流程定义的资源信息bpmn文件和png

###启动时涉及到的表
select * from act_hi_procinst; ##启动时创建流程实例生成实例id
select * from act_ru_task; ##记录运行中的流程实例即将要执行的任务

select *from act_hi_actinst; ##历史活动实例表 包括开始事件即流程实例中已经执行的各个环节
select * from act_hi_taskinst; ##历史任务实例表不包含开始任务即流程实例中已经执行的各个环节

select * from act_ru_variable ## 启动过程中设置了gloabl变量
select * from act_ge_bytearray; ##启动时设置pojo对象
select * from act_ru_execution; ##运行中的流程实例的执行记录

select * from act_hi_identitylink; ##启动时设置员工填写请假单,因此关联员工
select * from act_ru_identitylink; ##当前运行中的流程实例中参与关联的用户
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值