前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023最新版本Activiti7系列-身份服务

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

作者头像
用户4919348
发布2023-07-24 19:12:22
2230
发布2023-07-24 19:12:22
举报
文章被收录于专栏:波波烤鸭波波烤鸭

身份服务

在这里插入图片描述
在这里插入图片描述

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

1.审批人

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

2.候选人

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

2.1 绘制流程图

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

2.2 部署和启动流程

  流程图设计好后我们就可以部署流程和启动流程实例了。

代码语言:javascript
复制
/**
 * 流程部署操作
 */
@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 任务的拾取

  候选要操作我们需要通过拾取的行为把候选人转换为处理人.那么候选人登录后需要能查询出来他可以拾取的任务。

代码语言:javascript
复制
   /**
     * 候选人 审批任务查询
     * 张三 登录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.任务的归还

  拾取任务后如果不想操作那么可以归还任务

代码语言:javascript
复制
/**
 *  归还:拾取的用户 不审批了。就放弃审批人的操作
 *  其他的候选人可以重新拾取人了
 */
@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 流程操作

  流程操作包括部署,启动,拾取,归还交接等操作

代码语言:javascript
复制
/**
 * 流程部署操作
 */
@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-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 身份服务
    • 1.审批人
      • 2.候选人
        • 2.1 绘制流程图
        • 2.2 部署和启动流程
        • 1.3 任务的拾取
        • 1.4.任务的归还
      • 3.候选人组
        • 3.1 流程图绘制
        • 3.2 流程操作
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档