Activiti——组任务
1.组任务
同一个任务,一组人都可以查看,其中只有一个人可以申请到该任务进行处理(其他人员看不到该任务),如果过程中不想处理了,
可以将任务退回,这样组内其他人员可再次看到该任务,进行任务申请
在流程图当中,每一个任务环节都有一个Candidate users任务候选人属性,在此属性内,指定执行该任务的一组人,每一个人用 "," 号分割
流程部署
启动流程实例
2.组任务代办任务流程:
2.1 查询组任务,但是不能执行
/**
* 查询组任务
*/
@Test
public void getGroupTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("lisi").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代表 没有处理人说明当前任务没有人拾取
}
}
没有人拾取时的执行效果:
2.2 拾取(claim)任务
一旦其中一个人拾取了任务,其他人就看不到该任务了
/**
* 拾取任务
*/
@Test
public void claimTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取组任务
String candidateUser="huaixin";
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult();
//不等于Null代表能够获取到该任务
if(task!=null){
//拾取任务 任务ID,任务执行人
taskService.claim(task.getId(),candidateUser);
System.out.println("任务被:"+candidateUser+"拾取~");
}
}
说明:即使该用户不是候选人也能拾取,建议拾取时校验是否有资格组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务
2.3 查询个人任务并执行
/**
* 查看任务
*/
@Test
public void getTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("huaixin").singleResult();
//处理任务
if(task!=null){
taskService.complete(task.getId());
System.out.println("任务处理完毕");
}
}
2.4 任务退回/交接
如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人
/**
* 任务退回/交接
*/
@Test
public void taskReturn(){
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("huaixin").singleResult();
if(task!=null){
//任务退回 任务ID null代表没有处理人执行,需要后续再次拾取任务
//任务交接 任务ID 如果第二个参数,处理人不为空代表将该任务交给次处理人
taskService.setAssignee(task.getId(),null);
System.out.println("任务退回");
/*taskService.setAssignee(task.getId(),"lisi");
System.out.println("任务交接");*/
}
}
退回后再次查询组任务,执行人就都可以看到此任务了
说明:建议归还任务前校验该用户是否是该任务的负责人
也可以通过setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议不要这样使用)