流程中的某个任务由指定的group来完成,其中group由多个user组成。
一、直接指定办理组
1、流程图
2、部署和启动流程
//部署流程
@Test
public void bushu() {
InputStream inputStream = this.getClass().getResourceAsStream("GroupTask.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment().name("请假流程")
.addZipInputStream(zipInputStream).deploy();
System.out.println("部署成功:部署ID"+deploy.getId());
}
//启动流程
@Test
public void startProcess() {
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
System.out.println("流程启动成功,流程实例ID为:"+processInstance.getId());
}
流程启动之后,任务表中的办理人为空,存放流程办理人的信息表中有八条数据,每个人既是参与者,又是申请者:
3、查询组任务
此处的张三,可以是李四,王五或者赵六,得到的结果一样,每个人都可以看到此任务。
//查询组任务
@Test
public void findGroupTask() {
TaskService taskService = this.processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().taskCandidateUser("张三").list();
if (null != list && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
}
}
}
4、任务拾取
任务拾取后组任务变成个人任务。
//任务拾取
@Test
public void claim() {
String taskId="2504";
TaskService taskService = this.processEngine.getTaskService();
taskService.claim(taskId, "张三");
System.out.println("任务拾取成功");
}
5、任务回退(设置办理人为空)
// 任务回退
@Test
public void claimBack() {
String taskId="2504";
TaskService taskService = this.processEngine.getTaskService();
taskService.setAssignee(taskId, null);
System.out.println("任务回退成功");
}
在实际开发中:由主任务办理人去设置组任务的办理人,设置时应将组任务办理人查出进行选择。目的就是让组任务变成个人任务。
6、查询组任务成员列表
// 查询组任务成员列表
@Test
public void findGroupUser(){
String taskId = "2504";
List<IdentityLink> list = processEngine.getTaskService()//
.getIdentityLinksForTask(taskId);
//List<IdentityLink> list = processEngine.getRuntimeService()//
// .getIdentityLinksForProcessInstance(instanceId);
for(IdentityLink identityLink:list ){
System.out.println("userId="+identityLink.getUserId());
System.out.println("taskId="+identityLink.getTaskId());
System.out.println("piId="+identityLink.getProcessInstanceId());
System.out.println("TYPE="+identityLink.getType());
System.out.println("######################");
}
}
二、使用流程变量指定办理组
1、流程图
2、在启动时设置办理人
//启动流程
@Test
public void startProcess() {
RuntimeService runtimeService = this.processEngine.getRuntimeService();
String processDefinitionKey = "myProcess";
Map<String,Object> variables=new HashMap<>();
variables.put("usernames", "张三,李四,王五,赵六");
runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
System.out.println("流程启动成功");
}
三、使用监听器指定办理组
指定步骤与个人任务指定一致。
四、总结
组任务及三种分配方式,
1,在taskProcess.bpmn中直接写 candidate-users=“小A,小B,小C,小D"
2,在taskProcess.bpmn中写 candidate-users =“#{userIDs}”,变量的值要是String的。
使用流程变量指定办理人
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userIDs", "大大,小小,中中");
3,使用TaskListener接口,使用类实现该接口,在类中定义,
//添加组任务的用户
delegateTask.addCandidateUser(userId1);
delegateTask.addCandidateUser(userId2);
组任务分配给个人任务(认领任务),
processEngine.getTaskService().claim(taskId, userId);
个人任务分配给组任务,
processEngine.getTaskService(). setAssignee(taskId, null);
向组任务添加人员,
processEngine.getTaskService().addCandidateUser(taskId, userId);
向组任务删除人员,
processEngine.getTaskService().deleteCandidateUser(taskId, userId);
个人任务和组任务存放办理人对应的表,
act_ru_identitylink表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务
act_hi_identitylink表存放任务的办理人,包括个人任务和组任务,表示历史任务
区别在于,如果是个人任务TYPE的类型表示participant(参与者)
如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)
10组任务
原文:https://www.cnblogs.com/Guorisy/p/12099285.html