1.Candidate-users候选人
1.1 需求
在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参数者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差;
针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务;
1.2 设置任务候选人
在流程图中任务节点的配置中设置candidate-users(候选人)多个候选人之间用逗号分开;
查看bpmn文件:
可以看到部门经理的审批人已经设置为zhangsan,lisi这样的一组候选人,可以使用activiti:candiateUsers=“用户1,用户2,用户3”这样的方式来设置一组候选人;
1.3 办理组任务
(1)查询组任务
指定候选人,查询该候选人当前的代办任务;
(2)拾取任务
该组任务的所有候选人都能拾取;
将候选人的组任务,变成个人任务;原来候选人就变成了该任务的负责人;
如果不想办理该任务,需要将已经拾取的个人任务归还给组里,将个人任务变成组任务;
(3)查询个人任务
查询方式同个人任务部分,根据assignee查询用户负责的个人任务;
(4)办理个人任务
2.案例
2.1 创建请假流程图
2.2 部署流程
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
/*流程部署*/
public class Deployment {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
org.activiti.engine.repository.Deployment deployment= repositoryService.createDeployment()
.addClasspathResource("bpmnfile/hoildayGroup.bpmn") //加载流程文件
.addClasspathResource("bpmnfile/hoildayGroup.png")
.name("请假流程-组任务审批") //设置流程名称
.key("hoildayGroup-Key")
.deploy();//部署
//输出部署信息
System.out.println("流程名称:"+deployment.getName());
System.out.println("流程ID:"+deployment.getId());
System.out.println("流程key:"+deployment.getKey());
}
}
2.3 启动流程实例
package com.wn.group;
import com.wn.entity.Hoilday;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import java.util.HashMap;
import java.util.Map;
/*启动流程实例*/
/*设置流程变量的值*/
public class StartInstance {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量 启动流程时设置
Hoilday hoilday=new Hoilday();
hoilday.setNum(3);
//定义一个map集合,存放assignee的值
Map<String ,Object> assMap=new HashMap<>();
assMap.put("hoilday",hoilday);
//启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("hoildayGroup", assMap);
System.out.println("流程实例ID:"+processInstance.getId());
}
}
、
2.4 提交任务
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
/*提交任务*/
public class CommitTask {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskAssignee("ting").singleResult();
//任务处理
taskService.complete(task.getId());
}
}
2.5 用户查询组任务
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import java.util.List;
/*查询组任务*/
public class GetGroupTask {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskCandidateUser("yuan").list();
for (Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
//没有处理人说明当前任务没有人拾取
System.out.println("任务处理人:"+task.getAssignee());
}
}
}
2.6 用户拾取组任务
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
/*拾取任务*/
public class ClaimTask {
public static void main(String[] args) {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取组任务
String candidateUser="yuan";
Task task = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskCandidateUser(candidateUser).singleResult();
//不等于Null代表能够获取到该任务
if(task!=null){
//拾取任务 任务ID,任务执行人
taskService.claim(task.getId(),candidateUser);
System.out.println("任务被:"+candidateUser+"拾取~");
}
}
}
如果给拾取后,其他候选人是看不见的该任务的;
2.7 用户查询个人代办任务
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
/*任务处理*/
public class GetTask {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取到组任务
Task task = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskAssignee("yuan").singleResult();
System.out.println(task.getId());
System.out.println(task.getName());
}
}
2.8 用户办理个人任务
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
/*任务处理*/
public class GetTask {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取到组任务
Task task = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskAssignee("yuan").singleResult();
//处理任务
if (task!=null){
taskService.complete(task.getId());
System.out.println("任务处理成功!");
}
/* System.out.println(task.getId());
System.out.println(task.getName());*/
}
}
2.9 归还组任务
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
/*任务退回*/
public class TaskReturn {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取到组任务
String candUser="yuan";
Task task = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskAssignee(candUser).singleResult();
//不等于NULL代表能够获取到该任务
if (task!=null){
//任务退回 任务ID NULL代表没有人处理,需要后续再次拾取任务
taskService.setAssignee(task.getId(),null);
System.out.println("任务退回成功!");
}
}
}
2.10 任务交接
package com.wn.group;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
/*任务交接*/
public class TaskReturn {
public static void main(String[] args) {
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取到组任务
String candUser="yuan";
Task task = taskService.createTaskQuery().processDefinitionKey("hoildayGroup").taskAssignee(candUser).singleResult();
//不等于NULL代表能够获取到该任务
if (task!=null){//指定任务交接的人
taskService.setAssignee(task.getId(),"zhu");
System.out.println("任务交接成功!");
}
}
}