【Flowable】Flowable候选人和候选人组

news2024/10/6 3:32:35

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

1.候选人

(1).定义流程图

定义流程图,同时指定候选人,多个候选人会通过,连接
在这里插入图片描述
在这里插入图片描述

(2).部署和启动流程实例

部署流程,并且在启动流程实例的时候对UEL表达式赋值

    /**
     * 部署流程
     */
    @Test
    public void deploy(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("请假流程-候选人.bpmn20.xml")
                .name("请求流程-候选人")
                .deploy();
        System.out.println("deploy.getId() = " + deploy.getId());
        System.out.println(deploy.getName());
    }

    /**
     * 启动流程实例
     */
    @Test
    public void runProcess(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 给流程定义中的UEL表达式赋值
        Map<String,Object> variables = new HashMap<>();
        variables.put("candidate1","张三");
        variables.put("candidate2","李四");
        variables.put("candidate3","王五");
        runtimeService.startProcessInstanceById("holiday-candidate:1:4",variables);
    }

在对应的表结构中我们可以看到流程变量已经有了,但是对于的Task的Assignee还是为空。
在这里插入图片描述
在这里插入图片描述

(3).任务的查询

根据当前登录的用户,查询对应的候选任务

   /**
     * 根据登录的用户查询对应的可以拾取的任务
     *
     */
    @Test
    public void queryTaskCandidate(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-candidate:1:4")
                .taskCandidateUser("李四") # 注意
                .list();
        for (Task task : list) {
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getName() = " + task.getName());
        }
    }

(4).任务的拾取

知道了我有可拾取的任务后,拾取任务。

/**
     * 拾取任务
     *    一个候选人拾取了这个任务之后其他的用户就没有办法拾取这个任务了
     *    所以如果一个用户拾取了任务之后又不想处理了,那么可以退还
     */
    @Test
    public void claimTaskCandidate(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-candidate:1:4")
                .taskCandidateUser("李四")
                .singleResult();
        if(task != null){
            // 拾取对应的任务
            taskService.claim(task.getId(),"李四");
            System.out.println("任务拾取成功");
        }
    }

在这里插入图片描述

(5).任务的归还

拾取任务后不想操作那么就归还任务

    /**
     * 退还任务
     *    一个候选人拾取了这个任务之后其他的用户就没有办法拾取这个任务了
     *    所以如果一个用户拾取了任务之后又不想处理了,那么可以退还
     */
    @Test
    public void unclaimTaskCandidate(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-candidate:1:4")
                .taskAssignee("张三")
                .singleResult();
        if(task != null){
            // 归还对应的任务
            taskService.unclaim(task.getId());
            System.out.println("归还拾取成功");
        }
    }

(6).任务的交接

拾取任务后如果不想操作也不想归还可以直接交接给另外一个人来处理

   /**
     * 任务的交接
     *    如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户
     */
    @Test
    public void taskCandidate(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-candidate:1:4")
                .taskAssignee("李四")
                .singleResult();
        if(task != null){
            // 任务的交接
            taskService.setAssignee(task.getId(),"王五");
            System.out.println("任务交接给了王五");
        }
    }

(7). 任务的完成

正常的任务处理

   /**
     * 完成任务
     */
    @Test
    public void completeTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-candidate:1:4")
                .taskAssignee("王五")
                .singleResult();
        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成Task");
        }
    }

2.候选人组

当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。

(1).管理用户和组

1).用户管理

我们需要先单独维护用户信息。后台对应的表结构是ACT_ID_USER.

   /**
     * 维护用户
     */
    @Test
    public void createUser(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 通过 IdentityService 完成相关的用户和组的管理
        IdentityService identityService = processEngine.getIdentityService();
        User user = identityService.newUser("田佳");
        user.setFirstName("田");
        user.setLastName("jia");
        user.setEmail("tianjia@qq.com");
        identityService.saveUser(user);
    }

在这里插入图片描述

2).Group管理

维护对应的Group信息,后台对应的表结构是ACT_ID_GROUP

    /**
     * 创建用户组
     */
    @Test
    public void createGroup(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        // 创建Group对象并指定相关的信息
        Group group = identityService.newGroup("group2");
        group.setName("开发部");
        group.setType("type1");
        // 创建Group对应的表结构数据
        identityService.saveGroup(group);

    }
3). 用户分配组

用户和组是一个多对多的关联关联,我们需要做相关的分配,后台对应的表结构是ACT_ID_MEMBERSHIP

    /**
     * 将用户分配给对应的Group
     */
    @Test
    public void userGroup(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        // 根据组的编号找到对应的Group对象
        Group group = identityService.createGroupQuery().groupId("group1").singleResult();
        List<User> list = identityService.createUserQuery().list();
        for (User user : list) {
            // 将用户分配给对应的组
            identityService.createMembership(user.getId(),group.getId());
        }
    }

在这里插入图片描述

(2).候选人组应用

搞清楚了用户和用户组的关系后我们就可以来使用候选人组的应用了

1).创建流程图

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

2). 流程的部署运行

然后我们把流程部署和运行,注意对UEL表达式赋值,关联上Group

/**
     * 部署流程
     */
    @Test
    public void deploy(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("请假流程-候选人组.bpmn20.xml")
                .name("请求流程-候选人")
                .deploy();
        System.out.println("deploy.getId() = " + deploy.getId());
        System.out.println(deploy.getName());
    }

    /**
     * 启动流程实例
     */
    @Test
    public void runProcess(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        Group group = identityService.createGroupQuery().groupId("group1").singleResult();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 给流程定义中的UEL表达式赋值
        Map<String,Object> variables = new HashMap<>();
        // variables.put("g1","group1");
        variables.put("g1",group.getId()); // 给流程定义中的UEL表达式赋值
        runtimeService.startProcessInstanceById("holiday-group:1:17504",variables);
    }

对应表结构中就有对应的体现
在这里插入图片描述

3).任务的拾取和完成

然后完成任务的查询拾取和处理操作

/**
     * 根据登录的用户查询对应的可以拾取的任务
     *
     */
    @Test
    public void queryTaskCandidateGroup(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据当前登录的用户找到对应的组
        IdentityService identityService = processEngine.getIdentityService();
        // 当前用户所在的组
        Group group = identityService.createGroupQuery().groupMember("邓彪").singleResult();

        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-group:1:17504")
                .taskCandidateGroup(group.getId())
                .list();
        for (Task task : list) {
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getName() = " + task.getName());
        }
    }

    /**
     * 拾取任务
     *    一个候选人拾取了这个任务之后其他的用户就没有办法拾取这个任务了
     *    所以如果一个用户拾取了任务之后又不想处理了,那么可以退还
     */
    @Test
    public void claimTaskCandidate(){
        String userId = "田佳";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据当前登录的用户找到对应的组
        IdentityService identityService = processEngine.getIdentityService();
        // 当前用户所在的组
        Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-group:1:17504")
                .taskCandidateGroup(group.getId())
                .singleResult();
        if(task != null) {
            // 任务拾取
            taskService.claim(task.getId(),userId);
            System.out.println("任务拾取成功");
        }
    }  
   /**
     * 完成任务
     */
    @Test
    public void completeTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-group:1:17504")
                .taskAssignee("邓彪")
                .singleResult();
        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成Task");
        }
    }

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

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

相关文章

IntelliJ IDEA编辑模板变量详解(Edit Template Variables)

函数描述annotated(“annotation qname”)使用驻留在指定位置的注释创建类型符号。 例如&#xff0c;请参见迭代组中的活动模板。anonymousSuper()为Kotlin对象表达式建议一个超类型。arrayVariable()建议当前作用域中适用的所有数组变量。 例如&#xff0c;请参见迭代组中的活…

ACM - DP习题集(word里面的一小部分题集)

DP 一、经典问题1、编辑距离2、扔鸡蛋问题3、整数背包4、最大独立集5、最长公共子序列6、最长公共递增子序列7、最长公共子串&#xff08;ing&#xff09;8、最长上升子序列9、最长回文子序列10、最长回文子串&#xff08;ing&#xff09;11、最长不重复子字符串&#xff08;in…

OpenGL教程中矩阵Matrix的介绍

变换 原文Transformations作者JoeyDeVries翻译Django, Krasjet, BLumia校对暂未校对 尽管我们现在已经知道了如何创建一个物体、着色、加入纹理&#xff0c;给它们一些细节的表现&#xff0c;但因为它们都还是静态的物体&#xff0c;仍是不够有趣。我们可以尝试着在每一帧改变…

Python 操作 Excel,如何又快又好?

➤数据处理是 Python 的一大应用场景&#xff0c;而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时&#xff0c;难免要和 Excel 打交道。Python处理Excel 常用的系列库有&#xff1a;xlrd、xlwt、xlutils、openpyxl ◈xlrd &#xff0d; 用于读取 Exce…

import一个“太极”库,让Python代码提速100倍!

众所周知&#xff0c;Python的简单和易读性是靠牺牲性能为代价的—— 尤其是在计算密集的情况下&#xff0c;比如多重for循环。 不过现在&#xff0c;大佬胡渊鸣说了&#xff1a; 只需import 一个叫做“Taichi”的库&#xff0c;就可以把代码速度提升100倍&#xff01; 不信…

0-1规划在编程问题中的应用(UnityC#脚本/折返约瑟夫/OpenGL机器人摆臂循环)

一、0-1规划的定义 百度百科的解释&#xff1a;0-1规划是决策变量仅取值0或1的一类特殊的整数规划。在处理经济管理中某些规划问题时&#xff0c;若决策变量采用 0-1变量即逻辑变量&#xff0c;可把本来需要分别各种情况加以讨论的问题统一在一个问题中讨论。 如上面所说&…

记csdn打不开或打开缓慢后的修复--如何查找dns并修改hosts文件

记csdn打开缓慢后的修复–如何查找dns并修改hosts文件 问题&#xff1a; CSDN文章打开的十分缓慢&#xff0c;经常出现无法打开页面的错误提示 &#xff08;以前用的好好的&#xff0c;现在不知道公司局域网改了什么东西&#xff0c;导致我的电脑打开CSDN经常缓慢好久&#x…

ACM - 其他算法 - 基础(前缀和 + 差分)

ACM- 其他算法 一、前缀和模板例题1、区间余数求K倍区间个数&#xff1a;AcWing 1230. K倍区间例题2、前缀和哈希求最长个数平分子串:Leetcode 面试题 17.05 字母与数字 二、差分1、一维差分2、二维差分 一、前缀和 模板 //一维前缀和 S[i] a[1] a[2] ... a[i] a[l] ... …

【行情速递】MLCC龙头涨价;车厂砍单芯片;台积电28nm设备订单全部取消!

导语&#xff1a;进入第二季度&#xff0c;MLCC龙头三环集团官宣涨价!风华高科紧随其后。车市价格战蔓延至芯片端&#xff0c;车厂开始砍单芯片&#xff0c;短短半年时间不到&#xff0c;车用芯片市场从价格飞涨和一片难求的背景&#xff0c;转为砍单与降价促销...更多详情请阅…

智能警示输出器在ESD系统中的作用

ESD&#xff08;Electrostatic Discharge&#xff09;是指静电放电&#xff0c;是一种电子元器件损坏的主要原因之一。在电子制造业中&#xff0c;ESD防静电系统是非常重要的&#xff0c;可以有效地保护电子元器件&#xff0c;避免因静电放电而造成的损坏和故障。而智能警示输出…

Spring事务(编程式事务声明式事务)

Spring中编程式事务的实现&#xff1a; 此方式包含了三个重要的操作&#xff1a;获取事务、提交事务、回滚事务。 以及依赖两个重要的对象&#xff1a;DataSourceTransactionManager、TransactionDefinition 使用编程式事务示例&#xff1a; RestController public class Use…

进程间通信都有哪些方法?

进程间通信是架构复杂系统的基石。复杂系统往往是分成各种子系统、子模块、微服务等等&#xff0c;按照 Unix 的设计哲学&#xff0c;系统的每个部分应该是稳定、独立、简单有效&#xff0c;而且强大的。系统本身各个模块就像人的器官&#xff0c;可以协同工作。而这个协同的枢…

后端常用的加密算法及hash运算

文章目录 基础知识1.加密三要素2.常用的两种加密方式⭐️3.凯撒密码 对称加密1. 编码概念2. DES — Data Encryption Standard3. 3DES — Triple-DES4. AES — Advanced Encryption Standard5. 分组密码模式6. 在golang中使用对称加密⭐️6.1 填充函数6.2 DESCBC API接口6.3 AE…

Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

如果您在尝试克隆Git存储库时得到 “SSL certificate problem: unable to get local issuer certificate” 的错误,这意味着Git无法验证远程存储库的SSL证书。如果SSL证书是自签名的&#xff0c;或者SSL证书链有问题&#xff0c;就会发生这种情况。 $ git clone https://githu…

2021年上半年网络工程师真题详解(全套)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1、以下关于RISC和CISC计算机的叙述中&#xff0c;正确的是&#xff08; &#xff09;。 A、RISC不采用流水线技术&#xff0c;CISC采用流水线技术 B、RISC使用…

若依框架AjaxResult改造适应Swagger接口文档

概述 若依框架后端使用的响应对象AjaxResult&#xff0c;和Swagger存在不兼容问题&#xff0c;导致返回体即使使用了Swagger注解&#xff0c;但是Swagger接口文档中&#xff0c;不显示返回体的对象Swagger文档&#xff1a; [外链图片转存失败,源站可能有防盗链机制,建议将图片…

【Linux】Linux入门学习之常用命令二

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

Flutter学习之旅 - 路由

文章目录 Flutter路由介绍普通路由普通路由传值 命名路由将routes的配置提到外面(使用的是Map)命名路由传值 路由跳转返回上一级路由替换路由返回到根路由返回Tabs后到指定页面 Flutter路由介绍 flutter中的路由通俗就是页面跳转。在Flutter中通过Navigator(学过reactjs或小程序…

idea使用Database连接数据库报错ssm证书验证失败无法建立安全连接

项目场景&#xff1a; idea使用Database连接数据库报错ssm证书验证失败无法建立安全连接 问题描述 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferenc…

Java Agent

摘要 ​ JavaAgent就是Java探针&#xff0c;是一个JVM插件&#xff0c;常用于代码热更新&#xff0c;AOP&#xff0c;JVM监控等功能。这个技术对大多数的同学来说可能有点陌生&#xff0c;但是对Java软件开发人员来说肯定都多多少少接触过&#xff0c;只是相对其原理&#xff…