SpringBoot整合Activiti7——代理/候选人/候选组(四)

2023-09-16 09:43:57


一、代理人

一个用户任务只允许有一个代理人。为一个任务分配代理人后act_ru_task表的ASSIGNEE_字段会被设置为响应的值。

审批任务设置assignee变量,表示是该任务的负责人:

<userTask id="sid-9253B2C0-D7CF-49C9-BE00-3B68D87413D4" name="审批" activiti:assignee="${assignee}"></userTask>

启动流程分配代理人:

// 启动流程分配代理人
Map<String,Object> map = new HashMap<>();
map.put("assignee", "zhangsan");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave", map);

查询任务指定代理人:

// 可通过代理人查询任务列表
List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").list();

二、候选人

一个任务可以设置多个候选人,候选人在业务上指的是有权对该任务进行操作的群体。
某个候选人签收后,其他候选人就看不到该任务。

可以使用activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人

直接赋值多个候选人示例:

<userTask activiti:candidateUsers="zhangsan,lisi,wangwu" activiti:exclusive="true" id="_3" name="审批"/>

动态设置候选人变量 candidateUsers

<userTask id="sid-31845D76-A308-4442-AE19-4AA4238DB39A" name="审批" activiti:candidateUsers="${candidateUsers}"></userTask>

这里的candidateUsers是一个流程变量,以list的形式存放了候选人列表。

注意任务和候选人的关系存储在act_ru_identitylink表中

启动流程分配候选人:

// 启动流程分配候选人
List<String> candidateUsers = new ArrayList<>();
candidateUsers.add("zhangsan");
candidateUsers.add("lisi");
Map<String,Object> variableMap = new HashMap<>();
variableMap.put("candidateUsers", candidateUsers);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave", variableMap);

三、候选组

用来把一个群体的人指定为一个任务的权限人,对应的是activiti中的用户组,分配一个用户组id到某个任务上,可以指定整个组的人为该任务的候选人。
属于该候选组的用户就可以签收然后办理该任务。

如果候选组中存在多个用户,那么只有其中的某个用户签收了任务,那么其它用户就看不到该任务。
只要任务还未被签收,候选组内的任意用户都可以签收该任务;一旦任务被签收,候选组内的其他用户就无法查看与签收该任务咯。

可以使用activiti:candidateGroups=”用户组1,用户组2,用户组3”的这种方式来实现设置一组候选人

动态设置候选组变量candidateGroup

 <userTask id="juel-candidateGroup" name="审批" activiti:candidateGroups="${candidateGroup}"></userTask>

这里的candidateGroup也是一个流程变量,其中存放了用户组id的lsit集合。

注意任务和候选组的关系存储在act_ru_identitylink表中

启动流程分配候选组:

// 启动流程分配候选组
Map<String,Object> map = new HashMap<>();
List<String> groupList = new ArrayList<>();
groupList.add("项目经理");
groupList.add("测试");
map.put("candidateGroup",groupList);
runtimeService.startProcessInstanceByKey("leave", map);

四、组任务办理流程

办理流程:

  1. 指定候选人,查询该候选人当前的待办任务
  2. 候选人不能立即办理任务,要先拾取
  3. 候选人拾取,将候选人的组任务,变成个人任务,原来候选人就变成了该任务的负责人,其他候选人就看不到该任务
  4. 候选人完成任务
  5. 如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人
    1. 查询该候选人个人任务
    2. taskService.setAssignee(taskId, null); // 设置为null,归还组任务
  6. 也可以将任务委托给其他人(委托的用户可以不是候选人)
    1. 查询该候选人个人任务
    2. taskService.setAssignee(taskId, “其他人”);

五、UEL表达式

表达式支持解析基础类型、 bean、 list、 array 和 map,也可作为条件判断。
如下:${order.price > 100 && order.price < 250}

UEL-value

  • ${applyUserId}:applyUserId这个变量是 activiti 的一个流程变量
Map<String, Object> map = new HashMap<>();
map.put("applyUserId", "zhangsan");
  • ${user.applyUserId}:表示通过调用 user 的 getter 方法获取 applyUserId 值
User user = new User();
Map<String, Object> map = new HashMap<>();
map.put("user", user);

UEL-method

  • ${User.getApplyUserId()}:userBean 是 spring 容器中的一个 bean,调用该 bean 的 getApplyUserId()方法

UEL method结合value

  • ${IUserService.findManagerForEmployee(emp)}:IUserService是 spring 容器的一个 bean,findManagerForEmployee 是该 bean 的一个方法,emp 是 activiti流程变量, emp 作为参数传到 IUserService.findManagerForEmployee 方法中
更多推荐

RK3568驱动指南|第五篇 中断-第42章 软中断实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和li

快速排序模拟实现

快速排序,时间复杂度为O(NlogN),属于排序中相对快的那一列,以下是快排的模拟实现:法一:左右指针交换法voidswap(int*x,int*y){inttmp=*x;*x=*y;*y=tmp;}//交换函数intgetmid(int*a,intleft,intright){intmid=(left+right)/

【错误记录】IntelliJ IDEA 导出可执行 jar 包执行报错 ( java.lang.ClassNotFoundException | 打包时没有选择依赖库 )

文章目录一、报错信息二、解决方案一三、解决方案二一、报错信息参考【IntelliJIDEA】导出可执行JAR包博客,从IntelliJIDEA中导出可执行JAR包;执行菜单栏/Build/BuildArtifacts选项,编译Module中配置的artifacts项目;编译完成artifacts后,进入到工程目录\ou

汽配制造问题以及MES管理系统解决方案

在汽车工业中,零部件制造与整车制造有着显著的不同。这些差异导致了零部件制造的复杂性和高要求,使其成为一个高度综合的最终产品。本文将详细介绍这些差异以及针对这些差异的解决方案。一、行业特点决定需求汽车配件制造与整车制造存在较大不同。在整车制造过程中,装配是最复杂的环节,而在零部件制造过程中,装配所占的比重较小,机加等前端

XSS跨站脚本攻击

XSS全称(CrossSiteScripting)跨站脚本攻击,XSS属于客户端攻击,受害者最终是用户,在网页中嵌入客户端恶意脚本代码,最常用javascript语言。(注意:叠成样式表CSS已经被占用所以叫XSS)原因:输入没过滤,输出没编码。危害:劫持用户cookie,钓鱼,挂马分类:1、反射性XSS(中危,一次性

肖sir__项目环境之全流程__005

一、测试流程(h模型)1、需求文档(产品)需求文档(软件需求规格说明书srs)(1)如何分析需求a、显示需求(主流程、功能,业务)b、隐性需求(比如:红包记录,扣款金额=发送金额)c、特殊需求(计算:保费计算,还款计算)d、关联需求(满减活动:活动订单,活动增加,)(2)需求特殊a、完整性:功能的实现和设计信息齐全b、

API接口:概述、设计、应用与未来趋势

一、API接口概述API,全称应用程序接口,是一种软件程序之间的通信方法。API接口在互联网开发中扮演着重要角色,允许不同的应用程序相互交流和共享数据。API定义了一套标准的通信协议,使得开发人员能够使用特定的函数、方法或协议来交换信息。二、API接口设计RESTfulAPIRESTfulAPI是当前最流行的一种API

【SpringMVC】自定义注解与AOP结合使用

目录一、SpringMVC之自定义注解1.1Java注解简介1.2为什么要用注解1.3注解的分类⭐1.3.1JDK基本注解1.3.2JDK元注解1.3.3自定义注解1.4自定义注解三种使用案例1.4.1案例一(获取类与方法上的注解值)1.4.2案例二(获取类属性上的注解属性值)1.4.3案例三(获取参数修饰注解对应的属

吉时利KEYSIGHT6517B静电计6517A高阻计

Keithley6517B静电计/高阻计是灵敏测量的全球研究实验室标准。吉时利静电计拥有60多年的低电平测量专业知识,可提供低至10aA(10×10-18A)的电流水平和低至1fC的电荷水平的可靠测量,以及高达1018Ω的最高电阻测量。6517B还能够测量最大电压范围(高达200V),输入阻抗超过200TO。特征测量高

EPLAN_001#常用功能(一)

一、栅格设置、背景颜色设置二、插入设备图标(快捷键Insert)按TAB旋转方向三、¶通过左CTRL+ENTER输入四、移动属性文本、复制格式CTRL+B可以移动设备图形中的相关文本(或者右键—文本—移动属性文本)很对多个文本的,可以取消其固定五、改变方向(属性中选择相应的变量)六、直接编辑(可以快速修改元器件名称)七

蓝牙核心规范(V5.4)10.2-BLE 入门笔记之CIS篇

LECIS同步通信同步通信提供了一种使用蓝牙LE在设备之间传输有时间限制的数据的方式。它提供了一个机制,允许多个接收器设备在不同的时间从相同的源接收数据,以同步它们对该数据的处理。LEAUDIO使用同步通信。当使用同步通信时,数据具有有限的时间有效期,在到期时被认为已过期。尚未传输的过期数据将被丢弃。这意味着设备只接收

热文推荐