在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组,可以从候选人中选择参与者来完成任务。
前面案例中直接指派审批的用户的处理
一个审批节点可能有多个人同时具有审批的权限。这时我们就可以通过候选人来处理。
我们定义一个简单的审批流程图。如下:
人事审批中我们设置多个候选人来处理,分别是张三
,李四
,王五
在总经理的位置我们统一设置几个候选人来审批
创建的对应的流程图的xml文件中内容如下:
流程图设计好后我们就可以部署流程和启动流程实例了。
/**
* 流程部署操作
*/
@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
中我们可以看到对应的候选人信息
候选要操作我们需要通过拾取
的行为把候选人
转换为处理人
.那么候选人登录后需要能查询出来他可以拾取
的任务。
/**
* 候选人 审批任务查询
* 张三 登录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(),"王五");
}
}
}
拾取任务后如果不想操作那么可以归还任务
/**
* 归还:拾取的用户 不审批了。就放弃审批人的操作
* 其他的候选人可以重新拾取人了
*/
@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());
}
}
}
当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。
然后在设置审批人的时候通过候选人组来设定
对应的流程图xml中的定义信息
流程操作包括部署
,启动
,拾取
,归还
和交接
等操作
/**
* 流程部署操作
*/
@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