需求:在流程最初的时候,以请假流程为例,需要自定义审核人以及审核方式是会签还是或签。

开始前先普及几个概念:

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 会签/或签 设计思路相关推荐

  1. 两个企业级产品设计思路:流程效率指标功能生命周期长度

    最近又一轮的创投圈资本寒冬到来,以往依靠融资进行持久战的引流,拉用户,广告变现这一漫长的C端打法已经不再被资本市场所推崇,而是转变为追求如何快速变现,一单就有一单钱的短投资周期模式.而此时B端产品的优 ...

  2. asp.net webform设计思路的思考

    我使用asp.net的webform框架进行web应用程序的开发已经差不多四年了,在整个开发生涯中,也使用过一年asp.net的mvc框架.因为网上经常有讨论webform框架和mvc框架的优劣,所以 ...

  3. 暑假小学期安卓开发笔记1——设计思路

    最近小学期到了,内容是开发一个带有服务的app,如果写得好的话,还可以十月份参加华为杯. 其他组开发的东西各式各样,有弄小说阅读器的,有弄英语单词背写的,还有弄英语情景对话的.我们小组弄的是基于番茄钟 ...

  4. 工作流引擎核心设计思路!

    作者:vivo 互联网服务器团队- Cheng Wangrong 一.业务背景 营销自动化平台可以支持不同用户生命周期的活动旅程策略配置 ,根据用户触发的不同活动行为,进行差异化的营销触达方案.同时各 ...

  5. 第 5 章 Nova - 025 - OpenStack 通用设计思路

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例 nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  6. 亿级流量网关设计思路

    本文准备围绕七个点来讲网关,分别是网关的基本概念.网关设计思路.网关设计重点.流量网关.业务网关.常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分. 什么是网关 网关,很多地方将网关 ...

  7. 传授“带权重的负载均衡实现算法”独家设计思路!

    作者|孙玄/陈东 分布式系统中,大部分系统调用都会涉及到负载均衡,例如:客户端发往服务端的请求首先到达反向代理,然后反向代理再通过负载均衡算法将请求转发到业务系统:或者后端业务系统各模块间的调用前,也 ...

  8. 会计期间在ERP开发中的设计思路

    会计期间在ERP开发中的设计思路 2010年08月03日00:00 it168网站原创  作者:IT168 阿峰  编辑:李倩 评论:1条 本文Tag: ERP ERP开发 系统分析 [IT168 专 ...

  9. “私有云”安全的“过渡”时期-“云朵”方案的设计思路

    一.私有云安全的尴尬现状 云计算因为能够提供虚拟化的资源池.弹性的服务能力.自助服务等,深得CIO们的青睐,为了提高企业IT设备的利用率,提高服务容灾的能力,提高对业务支撑的快速响应能力,大多数的企业 ...

  10. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

最新文章

  1. char s[0] do{}while(0)
  2. 在IDEA连接MySql数据库时报错: [08001] CLIENT_PLUGIN_AUTH is required com.mysql.cj.exceptions.
  3. OpenSceneGraph 笔记–如何导出三角形数据
  4. 25 张图,1.4 w字!彻底搞懂分布式事务原理
  5. mongodb数据合并设计_MongoDB:将来自多个集合的数据合并成一个
  6. class matplotlib.figure.Figure
  7. GPU GPGPU
  8. Node.js 入门知识点总结
  9. 伦巴时间步的动作要领_成人拉丁舞_伦巴、恰恰、桑巴舞、牛仔舞、斗牛舞
  10. dematel法分析系统中各要素的重要程度
  11. Django实现web端tailf日志文件
  12. freeotp使用教程_PPT模板怎么用
  13. 公元纪年法(儒略历-格里高历)转儒略日
  14. 医学英文文献怎么找?
  15. QT:主页面全屏显示(根据显示屏分辨率调整主页面尺寸)
  16. Tegra Nano上手
  17. 发票信息提取系统解决方案(纸质发票、电子发票)
  18. 安卓miracast花屏_计算机通过Miracast无线投屏到其他设备,出现卡顿及花屏现象...
  19. 前缀和(一维数组+二维数组+差分)
  20. Veritas NetBackup8.1.1设置备份

热门文章

  1. 【golang】go app 优雅关机 Graceful Shutdown How?
  2. Conduit-面向Kubernetes的轻量化服务网格
  3. unable to find account data for the submitted AuthenticationToken
  4. 全国省市区区划代码以及邮政编码数据最新版--Mysql版(上)
  5. django bootstrap3
  6. UltraVNC(TightVNC、WinVNC)源码分析文档
  7. Cosy V3.1.3 简洁大气WordPress博客主题自适应个人自媒体网站模板(含积木部分插件)
  8. 一个手机号码可以申请二个微信号吗?如何申请?
  9. LXDE桌面系统设置快捷键
  10. 十万个Web3为什么:什么是Optimism?它靠何法宝帮助以太坊扩容?