身份服务
在流程定义中在任务结点的 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系统*/@Testpublic 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