Activiti——组任务

1.组任务

同一个任务,一组人都可以查看,其中只有一个人可以申请到该任务进行处理(其他人员看不到该任务),如果过程中不想处理了, 可以将任务退回,这样组内其他人员可再次看到该任务,进行任务申请 在流程图当中,每一个任务环节都有一个Candidate users任务候选人属性,在此属性内,指定执行该任务的一组人,每一个人用 "," 号分割

流程部署

启动流程实例

2.组任务代办任务流程:

2.1 查询组任务,但是不能执行

/**

* 查询组任务

*/

@Test

public void getGroupTask() {

//获取ProcessEngine对象

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//获取TaskService对象

TaskService taskService = processEngine.getTaskService();

//查询组任务

List 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 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议不要这样使用)