【Flowable】 10-候选人组讲解
【Flowable】 10-候选人组讲解
Metadata
title: 【Flowable】 10-候选人组讲解
date: 2023-01-23 17:19
tags:
- 行动阶段/完成
- 主题场景/组件
- 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
- 细化主题/Module/Flowable
categories:
- Flowable
keywords:
- Flowable
description: 【Flowable】 10-候选人组讲解
【Flowable】 10-候选人组讲解
当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。
1 管理用户和组
1.1 用户管理
通过act_id_user
表维护用户
/**
* 维护用户
*/
@Test
public void createUser() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过 IdentityService 完成相关的用户和组的管理
IdentityService identityService = processEngine.getIdentityService();
User user = null;
for (int i = 1; i <= 3; i++) {
user = identityService.newUser("员工" + i);
user.setFirstName(i+"");
user.setEmail(i+"@qq.com");
identityService.saveUser(user);
}
}
1.2 用户组管理
通过act_id_group
表维护
/**
* 维护用户组
*/
@Test
public void createGroup() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过 IdentityService 完成相关的用户和组的管理
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.newGroup("group1");
group.setName("研发部");
group.setType("1");
identityService.saveGroup(group);
}
1.3 用户和用户组关联
通过act_id_membership
表维护
/**
* 用户和用户组关联
*/
@Test
public void userGroup() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
IdentityService identityService = processEngine.getIdentityService();
// 根据组的编号找到对应的Group对象
Group group = identityService.createGroupQuery().groupId("group1").singleResult();
//找到用户
List<User> users = identityService.createUserQuery().list();
for (User user : users) {
//用户分配给用户组
identityService.createMembership(user.getId(), group.getId());
}
}
2 候选人组应用
用户和用户组的创建及关联搞清楚后,就可以使用候选人组实现流程任务分配了
2.2.1 设计流程
设计一个新的流程。
2.2 部署流程和启动流程实例
/**
* 部署流程
*/
@Test
public void deployment() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment().addClasspathResource("flowable-5.bpmn20.xml").name("候选人组流程").deploy();
}
/**
* 启动流程
*/
@Test
public void startProcess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
//查询到用户组
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupId("group1").singleResult();
//然后给流程设计里面的${group1}流程变量赋值
Map<String, Object> variables = new HashMap<>();
variables.put("group1", group.getId());
runtimeService.startProcessInstanceById("flowable-5:1:32504", variables);
}
act_ru_identitylink
表中可以看到流程任务绑定的候选人组
2.3 任务的拾取和完成
/**
* 查询候选人组任务
*/
@Test
public void queryTaskCandidateGroup() {
//获取ProcessEngine引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//根据用户获取候选组
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupMember("员工1").singleResult();
//获取组任务
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
.processInstanceId("35001")
.taskCandidateGroup(group.getId())
.list();
for (Task task : taskList) {
System.out.println("task.getId() = " + task.getId());
System.out.println("task.getName() = " + task.getName());
}
}
/**
* 拾取组任务
* 就是通过候选组绑定查询出来的任务,然后拾取,和普通的流程任务操作一样
* 正常业务开发下,该组下的任务只能由该组人员拾取
* 拾取之后,不想操作的话也可以退还或者交接给他人
*/
@Test
public void claimTaskCandidate() {
//获取ProcessEngine引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//根据用户获取候选组
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupMember("员工1").singleResult();
//获取组任务
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
.processInstanceId("35001")
.taskCandidateGroup(group.getId())
.list();
for (Task task : taskList) {
System.out.println("task.getId() = " + task.getId());
System.out.println("task.getName() = " + task.getName());
//拾取
taskService.claim(task.getId(), "员工1");
System.out.println("任务:"+task.getName()+"拾取成功");
}
}
/**
* 完成组任务
* 就是完成正常的一个流程任务
*/
@Test
public void completeTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processInstanceId("35001").taskAssignee("员工1").singleResult();
Assert.assertNotNull(task);
//流程设计的时候有个assignee0流程变量,这里需要设置下
Map<String, Object> variables = new HashMap<>();
variables.put("assignee0", "经理");
taskService.complete(task.getId(), variables);
}
启动流程实例之后,查询当前任务执行表:
select * from act_ru_task;
记录了当前执行的任务,由于该任务是组任务,assignee_
字段值是 null,让拾取任务之后该字段才会有拾取用户的信息。
查询任务参与者:
select * from act_ru_identitylink
记录了参与任务用户或组,当前任务如果设置了候选人,就会向该表插入候选人记录,有几个候选人就插入几条记录,与act_ru_identitylink
对应的还有一张历史表act_hi_identitylink
,向act_ru_identitylink
插入记录的同时也会向act_hi_identitylink
插入记录。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 蝶梦庄生!
评论