2023最新版本Activiti7系列-身份服务

身份服务

2023最新版本Activiti7系列-身份服务_第1张图片

  在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组,可以从候选人中选择参与者来完成任务。

1.审批人

  前面案例中直接指派审批的用户的处理

2.候选人

  一个审批节点可能有多个人同时具有审批的权限。这时我们就可以通过候选人来处理。

2.1 绘制流程图

  我们定义一个简单的审批流程图。如下:

2023最新版本Activiti7系列-身份服务_第2张图片

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

2023最新版本Activiti7系列-身份服务_第3张图片

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

2023最新版本Activiti7系列-身份服务_第4张图片

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

2023最新版本Activiti7系列-身份服务_第5张图片

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中的审批人是空的,

2023最新版本Activiti7系列-身份服务_第6张图片

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

2023最新版本Activiti7系列-身份服务_第7张图片

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 流程图绘制

2023最新版本Activiti7系列-身份服务_第8张图片

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

2023最新版本Activiti7系列-身份服务_第9张图片

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

2023最新版本Activiti7系列-身份服务_第10张图片

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

2023最新版本Activiti7系列-身份服务_第11张图片

你可能感兴趣的:(Activiti7,java,Activiti,工作流,候选人,候选人组,拾取,归还)