Activiti 会签/或签 设计思路
需求:在流程最初的时候,以请假流程为例,需要自定义审核人以及审核方式是会签还是或签。
开始前先普及几个概念:
Asignee:受理人,该任务环节的受理人,如果是会签,会有多个受理人
CandidateUsers:候选人,该任务环节的受理人由候选人中产生。
Model设计
由于会签及或签需要自定义,会签的时候,用户任务节点是以多实例的方式存在的。那么,或签是否可以理解为多实例中,只需要有一个完成了就可以完成任务节点。
<userTask id="sid-8B06F53F-9A04-46DB-9BE9-82A9C933A0B7" name="审核视频" default="sid-89A4CB33-D854-4D79-BFB2-C2348E029E50"activiti:assignee="${assignee}"><extensionElements><activiti:executionListener event="start" class="com.hereur.activiti7.MultiInstanceTaskHandler"/></extensionElements><multiInstanceLoopCharacteristicsisSequential="false"activiti:collection="assigneeList"activiti:elementVariable="assignee"><completionCondition><![CDATA[${nrOfCompletedInstances/nrOfInstances >= signCounter && nrOfCompletedInstances > 0}]]></completionCondition></multiInstanceLoopCharacteristics>
</userTask>
以上节点为多实例用户任务节点,部分参数说明如下:
activiti:assignee 受理人,取自assigneeList
nrOfCompletedInstances 完成任务的实例个数
nrOfInstances 总的实例个数
signCounter 完成用户任务节点的条件
此处,完成任务的条件为 nrOfCompletedInstances / nrOfInstances >= signCounter 即可。
在启动流程实例的时候,设置好signCounter尤为重要。此处可考虑将signCounter设置为两个值:0 或签 1 会签。
即 完成任务的实例个数 除以 总的实例个数 大于等于 0 且 完成任务的实例个数 > 0 就可完成或签;对于会签,则必须 完成任务的实例个数 和 总实例个数 相除等于 1 才可完成任务节点。
测试设计
/*** 启动流程实例*/@Testpublic void testStartProcess() {int signCounter = 0; // 0 或签 1 会签Map<String, Object> variables = new HashMap<>();List<String> users = Arrays.asList(new String[]{"system", "tough"});variables.put("updateVideoCandidates", users);// 如果是会签,设置assigneeList为该有的值;如果是或签,设置auditVideoCandidates为该有的值。// 如果是会签,设置counterSign = 1;如果是或签,设置counterSign = 0variables.put("assigneeList", users);variables.put("signCounter", signCounter);// 启动流程的时候指定候选人ProcessInstance pi = processRuntime.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("process").withProcessDefinitionId("process:3:db3e054b-dfc8-11eb-a122-00d861a4d913").withBusinessKey("Toughs2"). // 设置业务IDwithVariables(variables).build());System.out.println("流程实例ID:" + pi.getId());}/*** *查询任务,并完成自己的任务**/@Testpublic void testTask() {Page<Task> taskPage = taskRuntime.tasks(Pageable.of(0, 10), TaskPayloadBuilder.tasks().build());if (taskPage.getTotalItems() > 0) {for (Task task : taskPage.getContent()) {if (task.getAssignee() == null) {taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());System.out.println("任务:" + task);}Map<String, Object> variables = new HashMap<>();variables.put("auditResult", 1);taskRuntime.complete(TaskPayloadBuilder.complete().withVariables(variables).withTaskId(task.getId()).build());}}Page<Task> taskPage2 = taskRuntime.tasks(Pageable.of(0, 10));if (taskPage2.getTotalItems() > 0) {System.out.println("任务:" + taskPage2.getContent());}}
查看act_ru_task表可查看当前节点的受理人。
Activiti 会签/或签 设计思路相关推荐
- 两个企业级产品设计思路:流程效率指标功能生命周期长度
最近又一轮的创投圈资本寒冬到来,以往依靠融资进行持久战的引流,拉用户,广告变现这一漫长的C端打法已经不再被资本市场所推崇,而是转变为追求如何快速变现,一单就有一单钱的短投资周期模式.而此时B端产品的优 ...
- asp.net webform设计思路的思考
我使用asp.net的webform框架进行web应用程序的开发已经差不多四年了,在整个开发生涯中,也使用过一年asp.net的mvc框架.因为网上经常有讨论webform框架和mvc框架的优劣,所以 ...
- 暑假小学期安卓开发笔记1——设计思路
最近小学期到了,内容是开发一个带有服务的app,如果写得好的话,还可以十月份参加华为杯. 其他组开发的东西各式各样,有弄小说阅读器的,有弄英语单词背写的,还有弄英语情景对话的.我们小组弄的是基于番茄钟 ...
- 工作流引擎核心设计思路!
作者:vivo 互联网服务器团队- Cheng Wangrong 一.业务背景 营销自动化平台可以支持不同用户生命周期的活动旅程策略配置 ,根据用户触发的不同活动行为,进行差异化的营销触达方案.同时各 ...
- 第 5 章 Nova - 025 - OpenStack 通用设计思路
API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例 nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...
- 亿级流量网关设计思路
本文准备围绕七个点来讲网关,分别是网关的基本概念.网关设计思路.网关设计重点.流量网关.业务网关.常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分. 什么是网关 网关,很多地方将网关 ...
- 传授“带权重的负载均衡实现算法”独家设计思路!
作者|孙玄/陈东 分布式系统中,大部分系统调用都会涉及到负载均衡,例如:客户端发往服务端的请求首先到达反向代理,然后反向代理再通过负载均衡算法将请求转发到业务系统:或者后端业务系统各模块间的调用前,也 ...
- 会计期间在ERP开发中的设计思路
会计期间在ERP开发中的设计思路 2010年08月03日00:00 it168网站原创 作者:IT168 阿峰 编辑:李倩 评论:1条 本文Tag: ERP ERP开发 系统分析 [IT168 专 ...
- “私有云”安全的“过渡”时期-“云朵”方案的设计思路
一.私有云安全的尴尬现状 云计算因为能够提供虚拟化的资源池.弹性的服务能力.自助服务等,深得CIO们的青睐,为了提高企业IT设备的利用率,提高服务容灾的能力,提高对业务支撑的快速响应能力,大多数的企业 ...
- OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)
API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...
最新文章
- char s[0] do{}while(0)
- 在IDEA连接MySql数据库时报错: [08001] CLIENT_PLUGIN_AUTH is required com.mysql.cj.exceptions.
- OpenSceneGraph 笔记–如何导出三角形数据
- 25 张图,1.4 w字!彻底搞懂分布式事务原理
- mongodb数据合并设计_MongoDB:将来自多个集合的数据合并成一个
- class matplotlib.figure.Figure
- GPU GPGPU
- Node.js 入门知识点总结
- 伦巴时间步的动作要领_成人拉丁舞_伦巴、恰恰、桑巴舞、牛仔舞、斗牛舞
- dematel法分析系统中各要素的重要程度
- Django实现web端tailf日志文件
- freeotp使用教程_PPT模板怎么用
- 公元纪年法(儒略历-格里高历)转儒略日
- 医学英文文献怎么找?
- QT:主页面全屏显示(根据显示屏分辨率调整主页面尺寸)
- Tegra Nano上手
- 发票信息提取系统解决方案(纸质发票、电子发票)
- 安卓miracast花屏_计算机通过Miracast无线投屏到其他设备,出现卡顿及花屏现象...
- 前缀和(一维数组+二维数组+差分)
- Veritas NetBackup8.1.1设置备份
热门文章
- 【golang】go app 优雅关机 Graceful Shutdown How?
- Conduit-面向Kubernetes的轻量化服务网格
- unable to find account data for the submitted AuthenticationToken
- 全国省市区区划代码以及邮政编码数据最新版--Mysql版(上)
- django bootstrap3
- UltraVNC(TightVNC、WinVNC)源码分析文档
- Cosy V3.1.3 简洁大气WordPress博客主题自适应个人自媒体网站模板(含积木部分插件)
- 一个手机号码可以申请二个微信号吗?如何申请?
- LXDE桌面系统设置快捷键
- 十万个Web3为什么:什么是Optimism?它靠何法宝帮助以太坊扩容?