一、Candidate-users候选人
1、需求
在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参数者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差;
针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务;
2、设置任务候选人
在流程图中任务节点的配置中设置candidate-users(候选人)多个候选人之间用逗号分开;
查看bpmn文件:
可以看到部门经理的审批人已经设置为zhangsan,lisi这样的一组候选人,可以使用activiti:candiateUsers=“用户1,用户2,用户3”这样的方式来设置一组候选人;
3、办理组任务
(1)查询组任务
指定候选人,查询该候选人当前的代办任务;
(2)拾取任务
该组任务的所有候选人都能拾取;
将候选人的组任务,变成个人任务;原来候选人就变成了该任务的负责人;
如果不想办理该任务,需要将已经拾取的个人任务归还给组里,将个人任务变成组任务;
(3)查询个人任务
查询方式同个人任务部分,根据assignee查询用户负责的个人任务;
(4)办理个人任务
二、实例展示
1、创建请假流程图
2、流程部署
package com.zn; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Test; public class ActivitiGroup { /** * 流程部署 */ @Test public void deployment() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RepositoryService对象进行流程部署 RepositoryService repositoryService = processEngine.getRepositoryService(); //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bmpnfiles/holidayGroup.bpmn") //加载流程文件 .addClasspathResource("bmpnfiles/holidayGroup.png") .name("请假流程-组任务") //设置流程名称 .key("holiday") .deploy(); //部署 //输出部署信息 System.out.println("流程名称:" + deployment.getName()); System.out.println("流程ID:" + deployment.getId()); System.out.println("流程Key:" + deployment.getKey()); } }
数据库展示:
3、启动流程实例
package com.zn; import com.zn.entity.Holiday; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test; import java.util.HashMap; import java.util.Map; public class ActivitiGroup { /** * 启动流程实例 */ @Test public void getInstance() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //设置流程变量 启动流程时设置 Holiday holiday=new Holiday(); holiday.setNum(3); //定义一个map集合,存放assignee的值 Map<String ,Object> assMap=new HashMap<>(); assMap.put("holiday",holiday); //启动一个流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayGroup", assMap); System.out.println("流程启动成功~"); } }
数据库展示:
4、提交任务
package com.zn; import com.zn.entity.Holiday; 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.Test; import java.util.HashMap; import java.util.Map; public class ActivitiGroup { /* *任务处理 */ @Test public void completeTask(){ //获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询到自己的任务,然后通过任务ID进行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("xiaowang").singleResult(); //任务处理 taskService.complete(task.getId()); } }
数据库展示:
5、用户查询组任务
package com.zn; import com.zn.entity.Holiday; 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.Test; import java.util.HashMap; import java.util.List; import java.util.Map; public class ActivitiGroup { /** * 查询组任务 */ @Test public void getGroupTask(){ //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询组任务 List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("zhangsan").list(); for (Task task:list) { System.out.println("任务ID:"+task.getId()); //如果当前不是此任务处理人则处理不了该任务 /*taskService.complete(task.getId());*/ System.out.println("任务名称:"+task.getName()); System.out.println("任务处理人:"+task.getAssignee()); //Null代表 没有处理人说明当前任务没有人拾取 } } }
数据库:
6、用户拾取组任务
package com.zn; import com.zn.entity.Holiday; 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.Test; import java.util.HashMap; import java.util.List; import java.util.Map; public class ActivitiGroup { /** * 拾取任务 */ @Test public void claimTask() { //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //获取组任务 String candidateUser="zhangsan"; Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult(); //不等于Null代表能够获取到该任务 if(task!=null){ //拾取任务 任务ID,任务执行人 taskService.claim(task.getId(),candidateUser); System.out.println("任务被:"+candidateUser+"拾取~"); } } }
数据库:
说明:
即使该用户不是候选人也能拾取,建议拾取时校验是否有资格组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务
7、用户查询处理个人代办任务
package com.zn; import com.zn.entity.Holiday; 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.Test; import java.util.HashMap; import java.util.List; import java.util.Map; public class ActivitiGroup { /** * 查看任务 */ @Test public void getTask() { //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询到自己的任务,然后通过任务ID进行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("zhangsan").singleResult(); //处理任务 if(task!=null){ taskService.complete(task.getId()); System.out.println("任务处理完毕"); } } }
数据库:
8、归还组任务
package com.zn; import com.zn.entity.Holiday; 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.Test; import java.util.HashMap; import java.util.List; import java.util.Map; public class ActivitiGroup { /** * 流程部署 */ @Test public void deployment() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RepositoryService对象进行流程部署 RepositoryService repositoryService = processEngine.getRepositoryService(); //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bmpnfiles/holidayGroup.bpmn") //加载流程文件 .addClasspathResource("bmpnfiles/holidayGroup.png") .name("请假流程-组任务") //设置流程名称 .key("holiday") .deploy(); //部署 //输出部署信息 System.out.println("流程名称:" + deployment.getName()); System.out.println("流程ID:" + deployment.getId()); System.out.println("流程Key:" + deployment.getKey()); } /** * 启动流程实例 */ @Test public void getInstance() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //设置流程变量 启动流程时设置 Holiday holiday=new Holiday(); holiday.setNum(3); //定义一个map集合,存放assignee的值 Map<String ,Object> assMap=new HashMap<>(); assMap.put("holiday",holiday); //启动一个流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayGroup", assMap); System.out.println("流程启动成功~"); } /* *任务处理 */ @Test public void completeTask(){ //获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询到自己的任务,然后通过任务ID进行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("xiaowang").singleResult(); //任务处理 taskService.complete(task.getId()); } /** * 查询组任务 */ @Test public void getGroupTask(){ //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询组任务 List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("zhangsan").list(); for (Task task:list) { System.out.println("任务ID:"+task.getId()); //如果当前不是此任务处理人则处理不了该任务 /*taskService.complete(task.getId());*/ System.out.println("任务名称:"+task.getName()); System.out.println("任务处理人:"+task.getAssignee()); //Null代表 没有处理人说明当前任务没有人拾取 } } /** * 拾取任务 */ @Test public void claimTask() { //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //获取组任务 String candidateUser="zhangsan"; Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult(); //不等于Null代表能够获取到该任务 if(task!=null){ //拾取任务 任务ID,任务执行人 taskService.claim(task.getId(),candidateUser); System.out.println("任务被:"+candidateUser+"拾取~"); } } /** * 任务退回/交接 */ @Test public void taskReturn(){ //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询到自己的任务,然后通过任务ID进行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("zhangsan").singleResult(); if(task!=null){ //任务退回 任务ID null代表没有处理人执行,需要后续再次拾取任务 //任务交接 任务ID 如果第二个参数,处理人不为空代表将该任务交给次处理人 taskService.setAssignee(task.getId(),null); System.out.println("任务退回"); } } }
数据库:
9、任务交接
package com.zn; import com.zn.entity.Holiday; 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.Test; import java.util.HashMap; import java.util.List; import java.util.Map; public class ActivitiGroup { /** * 流程部署 */ @Test public void deployment() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RepositoryService对象进行流程部署 RepositoryService repositoryService = processEngine.getRepositoryService(); //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bmpnfiles/holidayGroup.bpmn") //加载流程文件 .addClasspathResource("bmpnfiles/holidayGroup.png") .name("请假流程-组任务") //设置流程名称 .key("holiday") .deploy(); //部署 //输出部署信息 System.out.println("流程名称:" + deployment.getName()); System.out.println("流程ID:" + deployment.getId()); System.out.println("流程Key:" + deployment.getKey()); } /** * 启动流程实例 */ @Test public void getInstance() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //设置流程变量 启动流程时设置 Holiday holiday=new Holiday(); holiday.setNum(3); //定义一个map集合,存放assignee的值 Map<String ,Object> assMap=new HashMap<>(); assMap.put("holiday",holiday); //启动一个流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayGroup", assMap); System.out.println("流程启动成功~"); } /* *任务处理 */ @Test public void completeTask(){ //获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询到自己的任务,然后通过任务ID进行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("xiaowang").singleResult(); //任务处理 taskService.complete(task.getId()); } /** * 查询组任务 */ @Test public void getGroupTask(){ //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询组任务 List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("zhangsan").list(); for (Task task:list) { System.out.println("任务ID:"+task.getId()); //如果当前不是此任务处理人则处理不了该任务 /*taskService.complete(task.getId());*/ System.out.println("任务名称:"+task.getName()); System.out.println("任务处理人:"+task.getAssignee()); //Null代表 没有处理人说明当前任务没有人拾取 } } /** * 拾取任务 */ @Test public void claimTask() { //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //获取组任务 String candidateUser="lisi"; Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult(); //不等于Null代表能够获取到该任务 if(task!=null){ //拾取任务 任务ID,任务执行人 taskService.claim(task.getId(),candidateUser); System.out.println("任务被:"+candidateUser+"拾取~"); } } /** * 任务交接 */ @Test public void taskReturnAll(){ //获取ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询到自己的任务,然后通过任务ID进行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("lisi").singleResult(); if(task!=null){ //任务退回 任务ID null代表没有处理人执行,需要后续再次拾取任务 //任务交接 任务ID 如果第二个参数,处理人不为空代表将该任务交给次处理人 taskService.setAssignee(task.getId(),"zhangsan"); System.out.println("任务交接成功!"); } } }
数据库: