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

news2024/11/24 12:27:21

身份服务

在这里插入图片描述

  在流程定义中在任务结点的 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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题更新之-HTML5的新特性

文章目录 导文新特性有哪些&#xff1f;HTML5的新特性带来了许多好处 导文 面试题更新之-HTML5的新特性 新特性有哪些&#xff1f; HTML5引入了许多新特性和改进&#xff0c;以下是一些HTML5的新特性&#xff1a; 语义化标签&#xff1a;HTML5引入了一系列的语义化标签&#…

layui实现动态添加选项卡

前言 上一篇博客介绍了树形菜单的实现&#xff0c;这一篇将继续完善通过点击左侧树形菜单实现动态打开选项卡Tab 一. 什么是Tab选项卡 Tab广泛应用于Web页面&#xff0c;因此我们也对其进行了良好的支持&#xff08;简约风格、卡片风格、响应式Tab以及带删除的Tab等等&#…

机器视觉初步13:3D相机介绍

文章目录 1. 结构光&#xff08;Structured Light&#xff09;2. 飞行时间&#xff08;Time of Flight&#xff0c;ToF&#xff09;3. 双目视觉&#xff08;Stereo Vision&#xff09;4. 线扫描&#xff08;Line Scan&#xff09;5. 散斑&#xff08;Speckle&#xff09; 在工业…

算法训练营第三十七天||● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

● 738.单调递增的数字 为了方便遍历&#xff0c;先将int型转换为string类型&#xff0c;从后往前遍历&#xff0c;记住要设定一个flag标志 例如&#xff1a;98&#xff0c;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想…

(数据结构)(C++)数组——约瑟夫环求解

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>#define MaxSize 10using namespace std;void josephus(int n,int m)//一共n个人数到m的出列 {int p[MaxSize];int i,j,t;for(i0;i<n;i){p[i]i1;//构建初始序列&#xff08;1,2,3,4.....) } t0;//首次报数起始位…

【剑指offer】17. 正则表达式匹配(java)

文章目录 正则表达式匹配描述示例1示例2示例3示例4思路完整代码 正则表达式匹配 描述 请实现一个函数用来匹配包括’.‘和’*的正则表达式。 1.模式中的字符’.表示任意一个字符 2.模式中的字符’*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题…

scrapy---爬虫界的django

1介绍 scrapy架构 引擎(EGINE)&#xff1a;引擎负责控制系统所有组件之间的数据流&#xff0c;并在某些动作发生时触发事件。大总管&#xff0c;负责整个爬虫数据的流动 调度器(SCHEDULER)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个U…

[QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框

目录 3. QT窗体设计 3.6 自定义对话框 3.6.1 种类 3.6.2 输入对话框​编辑 3.6.3 字体对话框 3.6.4 文件对话框​编辑 3.6.5 颜色对话框 3.6.6 输出对话框​编辑 3.6.7 进度条对话框​编辑 3.6.8 自定义对话框​编辑 3. QT窗体设计 3.6 自定义对话框 在QT中&#xff…

软考A计划-系统集成项目管理工程师-项目人力资源管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Pytorch学习笔记 | 深度学习框架简介 | 环境安装

文章目录 知名深度学习框架的开发公司,以及框架的演变过程最流行的两个框架:pytorch和tensorflow两个框架最核心的区别是什么?什么是动态图和静态图环境安装CUDA是什么如何查看自己电脑的显卡类型如何安装cuda如何确认安装好了呢?如何测试安装pytorch知名深度学习框架的开发…

左神算法之中级提升(5) 背包问题

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【 2019 网易面试题】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路分析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 背包问题&#xff1a; 【代码实现】 /**…

【分布式能源的选址与定容】基于多目标粒子群算法分布式电源选址定容规划研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

解决git clone的库文件太大的问题

一直想git clone 下来的我自己库可能库大小太大&#xff0c;git不下来 https://www.kancloud.cn/maryong/maryong/1800760 在网络情况不稳定下克隆项目时&#xff0c;可能会出现下图中的错误。 问题原因&#xff1a; http缓存不够或者网络不稳定等。 解决方案&#xff1a;打开…

运算符重载和const成员 (日期类的实现C++)

运算符重载和const成员 const成员const修饰类成员函数const对象调用权限小结 运算符重载 const成员 const成员函数&#xff1a;const修饰的成员函数。const修饰类成员函数&#xff0c;实际限制的是*this&#xff0c;表明该成员函数不能对类的任何成员进行修改。 const修饰类成…

设计模式-建造者模式在Java中使用示例

场景 建造者模式 复杂对象的组装与创建 没有人买车会只买一个轮胎或者方向盘&#xff0c;大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。 如何将这些部件组装成一辆完整的汽车并返回给用户&#xff0c;这是建造者模式需要解决的问题。 建造者模式又称为…

复选框,购物车功能,单选,全选

<template><view class"index"><u-navbar title"购物车" :is-back"false" :border-bottom"false" title-color"#333":background"{background:#fff}"><view class"page_navbar_warp&qu…

探究ThreadLocal和ThreadPoolExecutor中的内存泄露风险与防范策略

探究ThreadLocal和ThreadPoolExecutor中的内存泄露风险与防范策略 本文将探讨ThreadLocal和ThreadPoolExecutor中可能存在的内存泄露问题&#xff0c;并提出相应的防范策略。 ThreadPoolExecutor的内存泄露问题 ThreadPoolExecutor是一个线程池类&#xff0c;它可以管理和复…

【PHP面试题39】linux下面chmod和chown使用详解

文章目录 一、前言二、什么是 chmod 命令&#xff1f;2.1 使用方法&#xff1a;2.2 数值表示法&#xff1a;2.3 符号表示法&#xff1a; 三、什么是 chown 命令&#xff1f;3.1 使用方法&#xff1a;3.2 更改所有者和用户组&#xff1a; 四、使用示例4.1 使用 chmod 命令修改权…

媒体邀约:企业新品发布会如何邀约记者到现场采访报道?

媒介易是国内领先的全媒体广告营销平台&#xff0c;专注全媒体营销平台创新服务。我们有超过近11年的实战经验&#xff0c;我们拥有丰富的媒体记者资源&#xff0c;关于邀约记者到现场采访&#xff0c;我们会采取以下步骤&#xff1a; 1、提前策划&#xff1a;在发布会前至少…

MATLAB 基于NDT的点云配准实验(不同参数效果) (25)

MATLAB 基于NDT的点云配准实验(不同参数效果) (25) 一、算法简介二、具体使用1.代码(注释详细)2.结果(不同参数 与ICP比较)一、算法简介 NDT点云配准与ICP一样,都是经典的点云配准算法,这里使用MATLAB进行ndt点云配准,对配准结果进行显示,并尝试不同参数,得到较好…