例如有这样一个需求:你的上司也就是经理有两个或多个以上,那么你需要提交申请到他们手上,主要有一个认领了该任务,然后审批通过即可,具体实现如下:
1) 在原有基础上继续修改流程图:
2) 部署流程,启动流程
3) 申请人发起申请任务:
@Test
publicvoid completeTask(){
Map<String,Object> map= newHashMap<String,Object>();
Taskform taskform = new Taskform(3, "事假", "今天老子");
map.put("users", "a,b,c");
map.put("day",taskform.getDay());
String taskId = "155005";
processEngine.getTaskService().setVariable(taskId,"taskform",taskform);
processEngine.getTaskService().complete(taskId,map);//完成任务
System.out.println("完成任务,任务ID"+taskId);
}
补充:map.put("users","a,b,c");“users”对应流程图中的candidate #{users},多人用“,”分割
运行后查看数据表act_hi_identitylink:
Act_ru_task表中:assignee字段是空的
4) 查询下组参与人员的任务:
@Test
publicvoid findMyPersonTask(){
String assignee = "a";
List<Task>taskList = processEngine.getTaskService()//获取任务service
.createTaskQuery()//创建查询对象
//.taskAssignee(assignee)//指定查询人
.taskCandidateUser(assignee)//参与者,组任务查询
.list();
if(taskList.size()>0){
for (Task task : taskList) {
System.out.println("代办任务ID:"+task.getId());
System.out.println("代办任务name:"+task.getName());
System.out.println("代办任务创建时间:"+task.getCreateTime());
System.out.println("代办任务办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
}
}
}
注意:查询用的是.taskCandidateUser(assignee)
5) 认领任务:
@Test
publicvoid claim(){
//任务ID
String taskId = "122502";
//个人任务的办理人
String userId = "a";
processEngine.getTaskService()//
.claim(taskId,userId);
}
补充:claim与setAssignee区别在于claim领取之后别人不可以再领取不然会报错而setAssignee则不然
认领之后其他人员再查询时则不存在,而act_ru_task表中assignee字段为认领人‘a’,认领之后其他操作和一起都一样
6) 补充点:
1. 被认领之后的任务可再扯回组任务(前提:之前这个任务是组任务),其他人员则还可以认领:
@Test
publicvoid setAssignee(){
//任务ID
String taskId = "157507";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
2. 组任务可以继续添加组参与人员:
@Test
publicvoid addGroupUser(){
//任务ID
String taskId = "157507";
//新增组任务的成员
String userId = "c";
processEngine.getTaskService()//
.addCandidateUser(taskId, userId);
}
3. 组任务可以删除参与人员:
@Test
publicvoid deleteGroupUser(){
//任务ID
String taskId = "157507";
//新增组任务的成员
String userId = "cai";
processEngine.getTaskService()//
.deleteCandidateUser(taskId, userId);
}
4. 查询正在执行的组任务列表:
@Test
publicvoid findGroupCandidate(){
//任务ID
String taskId = "157507";
List<IdentityLink>list = processEngine.getTaskService()//
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(IdentityLinkidentityLink:list){
System.out.println("任务ID:"+identityLink.getTaskId());
System.out.println("用户ID:"+identityLink.getUserId());
System.out.println("-----------------------------------");
}
}
}
运行结果:
5. 组任务像前面讲的个人任务一样可以用监听器或写死方式,监听器notify()方法里用delegateTask.addCandidateUser()来设值