身份服务

在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组,可以从候选人中选择参与者来完成任务。
1.审批人
前面案例中直接指派审批的用户的处理
2.候选人
一个审批节点可能有多个人同时具有审批的权限。这时我们就可以通过候选人来处理。
2.1 绘制流程图
我们定义一个简单的审批流程图。如下:

人事审批中我们设置多个候选人来处理,分别是张三,李四,王五

在总经理的位置我们统一设置几个候选人来审批

创建的对应的流程图的xml文件中内容如下:

2.2 部署和启动流程
流程图设计好后我们就可以部署流程和启动流程实例了。
/**
* 流程部署操作
*/
@Test
public void test1(){
// 1.获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.完成流程的部署操作 需要通过RepositoryService来完成
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.完成部署操作
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("flow/test5.bpmn20.xml")
.name("候选人")
.deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
System.out.println(deploy.getId());
System.out.println(deploy.getName());
}
/**
* 发起一个流程
*/
@Test
public void test3(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 发起流程 需要通过 runtimeService来实现
RuntimeService runtimeService = engine.getRuntimeService();
// 通过流程定义ID来启动流程 返回的是流程实例对象
ProcessInstance processInstance = runtimeService
.startProcessInstanceById("holiday1:2:90003");
System.out.println("processInstance.getId() = " + processInstance.getId());
System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}
启动流程实例后。在act_ru_task中的审批人是空的,

但是在对应的act_ru_identitylink中我们可以看到对应的候选人信息

1.3 任务的拾取
候选要操作我们需要通过拾取的行为把候选人转换为处理人.那么候选人登录后需要能查询出来他可以拾取的任务。
/**
* 候选人 审批任务查询
* 张三 登录OA系统
*/
@Test
public void test4(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.taskCandidateUser("张三") // 根据候选人查询审批任务
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
System.out.println("task.getId() = " + task.getId());
//taskService.complete(task.getId());
}
}
}
/**
* 待办任务的 拾取 操作
* 从候选人 --> 处理人
* 一个任务如果被拾取后。其他的候选人就查询不到改任务信息了
*/
@Test
public void test5(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.taskCandidateUser("王五") // 根据候选人查询审批任务
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
// 李四 拾取了 这个任务的审批权限 --> 变成了这个任务的审批人
taskService.claim(task.getId(),"王五");
}
}
}
1.4.任务的归还
拾取任务后如果不想操作那么可以归还任务
/**
* 归还:拾取的用户 不审批了。就放弃审批人的操作
* 其他的候选人可以重新拾取人了
*/
@Test
public void test6(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.taskCandidateOrAssigned("李四") // 根据 审批人或者 候选人来查询待办任务
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
// System.out.println("task.getId() = " + task.getId());
// 归还操作的本质其实就是设置审批人为空
taskService.unclaim(task.getId());
}
}
}
3.候选人组
当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。
3.1 流程图绘制

然后在设置审批人的时候通过候选人组来设定

对应的流程图xml中的定义信息

3.2 流程操作
流程操作包括部署,启动,拾取,归还和交接等操作
/**
* 流程部署操作
*/
@Test
public void test1(){
// 1.获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.完成流程的部署操作 需要通过RepositoryService来完成
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.完成部署操作
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("flow/test6.bpmn20.xml")
.name("候选人组")
.deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
System.out.println(deploy.getId());
System.out.println(deploy.getName());
}
/**
* 发起一个流程
*/
@Test
public void test3(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 发起流程 需要通过 runtimeService来实现
RuntimeService runtimeService = engine.getRuntimeService();
// 通过流程定义ID来启动流程 返回的是流程实例对象
ProcessInstance processInstance = runtimeService
.startProcessInstanceById("holiday1:3:97503");
System.out.println("processInstance.getId() = " + processInstance.getId());
System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}
/**
* 候选人组:
* 具体的用户。比如 张三 登录了系统
* 查询张三对应的 组 根据 组来查询待办的任务
*/
@Test
public void test4(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
String group = "销售部"; // 根据当前登录用户查询到的
List<Task> list = taskService.createTaskQuery()
.taskCandidateGroup(group)
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
System.out.println("task.getId() = " + task.getId());
//taskService.complete(task.getId());
}
}
}
/**
* 待办任务的 拾取 操作
* 从候选人 --> 处理人
* 一个任务如果被拾取后。其他的候选人就查询不到改任务信息了
*/
@Test
public void test5(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
String group = "销售部"; // 根据当前登录用户查询到的
List<Task> list = taskService.createTaskQuery()
.taskCandidateGroup(group) // 根据组来查询
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
// 张三1 拾取了 这个任务的审批权限 --> 变成了这个任务的审批人
taskService.claim(task.getId(),"张三1");
}
}
}
/**
* 归还:拾取的用户 不审批了。就放弃审批人的操作
* 其他的候选人可以重新拾取人了
*/
@Test
public void test6(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
String group = "销售部"; // 根据当前登录用户查询到的
List<Task> list = taskService.createTaskQuery()
.taskAssignee("张三1")
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
// System.out.println("task.getId() = " + task.getId());
// 归还操作的本质其实就是设置审批人为空
taskService.unclaim(task.getId());
}
}
}
/**
* 获取用户审批权限的用户没有时间审批了
* 但是他也可以不用归还而是做任务的交接。把这个任务让另一个人来审批
*/
@Test
public void test8(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
String group = "销售部"; // 根据当前登录用户查询到的
List<Task> list = taskService.createTaskQuery()
.taskAssignee("张三1")
.list();
if(list != null && list.size() > 0){
for (Task task : list) {
// System.out.println("task.getId() = " + task.getId());
// 任务交接
taskService.setAssignee(task.getId(),"李四1");
}
}
}
/**
* 任务审批
*/
@Test
public void test7(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
taskService.complete("92505");
}
对应的流程中的候选人组信息同样记录在act_ru_identitylink








![[QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框](https://img-blog.csdnimg.cn/a001a3e2295d4203b0d0ab785c756a81.png)











