Activiti之多实例任务
所谓多实例任务,就是一个任务,需要多个人协作完成,大致可以分为两种:
(1)并行多实例:完成任务没有先后顺序的要求,并行执行
(2)串行多实例:完成任务有先后顺序,也就是说,必须等待前一个人完成了任务,下一个人的 任务才开始
在流程图中也可以体现出并行多实例与串行多实例的区别,注意看领导审批节点,多了3条线,如果3条线是竖直的,那就是并行多实例,如下所示:
如果3条线是水平的,那就是串行多实例,如下所示:
bpmn文件的流程图,本质就是一个xml文件,普通的用户任务和多实例的任务区别如下:
<userTask activiti:exclusive="true" id="_3" name="请假申请"/><userTask activiti:assignee="${leader}" activiti:exclusive="true" id="_4" name="领导审批"><multiInstanceLoopCharacteristics activiti:collection="${leaderList}" activiti:elementVariable="leader" isSequential="true"><completionCondition><![CDATA[${nrOfInstances == nrOfCompletedInstances}]]></completionCondition></multiInstanceLoopCharacteristics></userTask>
区别就在于多实例任务里面多了一个multiInstanceLoopCharacteristics 节点
下面简单解释一些其含义:
- isSequential,为true表示是串行多实例,false表示是并行多实例
- activiti:collection,表示多实例的人员集合,${leaderList}是取变量leaderList的值
- activiti:elementVariable,人员集合中的元素变量,这里要UserTask中activiti:assignee的值对应,这里变量名称都是leader
- nrOfInstances,实例总数(nr是number的简写)
- nrOfCompletedInstances,已完成的实例数
- completionCondition,表示多实例任务的完成条件
下面以并行多实例为例,看看多实例任务的流转过程,下面是本次示例的流程图
主要的xml如下:
<process id="test_huiqian_2" isClosed="false" isExecutable="true" name="测试多实例会签" processType="None"><startEvent id="_2" name="StartEvent"/><userTask activiti:assignee="${applyUser}" activiti:exclusive="true" id="_3" name="申请人确认"><extensionElements><activiti:taskListener delegateExpression="${huiQianTaskListener}" event="complete"/></extensionElements><multiInstanceLoopCharacteristics activiti:collection="${applyUserList}" activiti:elementVariable="applyUser" isSequential="false"><completionCondition><![CDATA[${agreeCnt/nrOfInstances>=0.5}]]></completionCondition></multiInstanceLoopCharacteristics></userTask><exclusiveGateway gatewayDirection="Unspecified" id="_4" name="ExclusiveGateway"/><userTask activiti:assignee="${leader}" activiti:exclusive="true" id="_5" name="领导审批"/><exclusiveGateway gatewayDirection="Unspecified" id="_6" name="ExclusiveGateway"/><endEvent id="_7" name="EndEvent"/><sequenceFlow id="_8" sourceRef="_2" targetRef="_3"/><sequenceFlow id="_9" sourceRef="_3" targetRef="_4"/><sequenceFlow id="_10" name="确认申请" sourceRef="_4" targetRef="_5"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${isApply == 'true'}]]></conditionExpression></sequenceFlow><sequenceFlow id="_11" sourceRef="_5" targetRef="_6"/><sequenceFlow id="_12" name="领导审批通过" sourceRef="_6" targetRef="_7"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${leaderAudit == 'true'}]]></conditionExpression></sequenceFlow><sequenceFlow id="_13" name="放弃申请" sourceRef="_4" targetRef="_7"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${isApply == 'false'}]]></conditionExpression></sequenceFlow><sequenceFlow id="_14" name="领导审批不通过" sourceRef="_6" targetRef="_3"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${leaderAudit == 'false'}]]></conditionExpression></sequenceFlow></process>
注意到:
<completionCondition><![CDATA[${agreeCnt/nrOfInstances>=0.5}]]></completionCondition>
说明只要有一半的人同意了,多实例任务就完成了,进入到下一个节点
启动流程
启动流程,设置多实例任务的参与者:张三、李四、王五
String key = "test_huiqian_2";// 申请人列表List<String> applyUserList = new ArrayList<>(3);applyUserList.add("张三");applyUserList.add("李四");applyUserList.add("王五");Map<String,Object> variables = new HashMap<>(1);variables.put("applyUserList",applyUserList);// 申请人同意的数量variables.put("agreeCnt",0);variables.put("isApply","false");// 启动流程runtimeService.startProcessInstanceByKey(key, variables);
启动流程后,进入到多实例任务,留意以下几张表的数据变化:
- 用户任务表,act_ru_task
- 节点执行表,act_ru_execution
- 用户与流程关联表,act_ru_identitylink
- 变量表,act_ru_variable
(1)用户任务表,act_ru_task,可以看到插入了3条数据,张三、李四、王五都有了待办任务
(2)节点执行表,act_ru_execution,可以看到插入了5条数据,其中parent_id_为空的是父执行流,整个过程都会保留。而id_为120013的数据是活动节点的执行流,会根据流程的流转进行更新。剩下的3条数据就和act_ru_task表的3条数据一一对应了。
(3)用户与流程关联表,act_ru_identitylink,插入了流程的参与者
(4)变量表,act_ru_variable
完成多实例任务
- 当张三完成任务后
act_ru_task表删除了张三的任务
但是,并没有删除act_ru_execution对应的数据,而是更新了版本号REV_和是否激活标志IS_ACTIVE
- 当李四完成任务后
act_ru_task表删除了李四的任务
同样的,并没有删除act_ru_execution对应的数据,而是更新了版本号REV_和是否激活标志IS_ACTIVE
- 当王五完成任务后
因为此时满足了多实例的完成条件,有50%以上的人同意了。所以删除了对应的act_ru_task和act_ru_execution表等数据
同时插入下一环节的数据到act_ru_task和act_ru_execution
任务完成之后,act_ru开头的表都会被清空。
示例代码地址:https://github.com/qiuxinfa/activiti-study。
Activiti之多实例任务相关推荐
- activiti启动流程实例,添加进businessKey
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...
- activiti启动流程实例
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...
- SpringBoot 结合Activiti 进行单条实例工作流审批
1.建立maven项目,引入maven依赖 #因为我的项目单独引入了mybatis-plus所以这里对activiti排除一下mybatis的依赖 <dependency><grou ...
- 【activiti】流程实例
流程实例 1.什么是流程实例 **流程实例(ProcessInstance)**代表流程定义的执行实例. 一个流程实例包含了所有的运行节点.我们可以利用这个对象来了解当前流程实例的进度等信息. 例如: ...
- 删除activiti的流程实例报错Process instance is still running, cannot delete historic process instance
historyService.deleteHistoricProcessInstance(processInstanceId);用这句代码删除还没结束的流程实例时报错. 方案:http://www.y ...
- activiti 根据 流程实例ID 获取发起人
/**获取发起人* @param PROC_INST_ID_ //流程实例ID* @from fhadmin.cn*/protected String getInitiator(String PROC ...
- activiti官网实例项目activiti-explorer之扩展流程节点属性
节点中添加"关联表单"属性 1,stencilset.json中加入如下代码 , { "name" : "approveTypepackage ...
- Activiti 用户任务并行动态多实例(多用户执行流程)
在很多情况下,我们需要多用户共同执行余下流程,比如开会流程: 领导发起开会,选择开会人员(多个) 每个开会人员接收到通知后需要签到(一名用户签到不会影响到另一位用户的签到) 签到完成后则流程结束 如果 ...
- Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)
相关代码参考gihub:https://github.com/changwensir/Activiti/tree/master/ActivitiDemo1 一.Activiti 历史任务查询 实际工作 ...
最新文章
- 客快物流大数据项目(四):大数据项目为什么使用Docker
- 项目经理案头手册学习系列【12】——使用挣值分析法控制项目
- php json java_php 解析java传过来的json数据
- FFmpeg 硬件加速方案概览 (上)
- struts2--java.lang.IllegalAccessException: Class ognl.OgnlRuntime can not access a member of
- Android(java)学习笔记27:TextView属性大全
- 【JAVA基础篇】集合框架
- Jsp Servlet Mysql实现的学生成绩管理系统
- 蔬菜刀行业调研报告 - 市场现状分析与发展前景预测
- unix网络编程各种TCP客户-服务器程序设计实例(三)
- 黄杏元《地理信息系统概论》考研复习考点精讲(八)
- 软考中级网络工程师笔记(一)
- mysql数据加表头导出_mysql导出数据到表格讲解大全(导出数据带表头,导出数据中文乱码问题解决)...
- 助力公共事业服务,RPA大显身手
- 略谈基本计数原理和排列组合
- ubuntu和mac进行文件传输 运用scp命令
- 紫外线传感器用于天然气燃烧火焰探测
- Adaboost算法理论
- 高德地图 Service 创建服务 USERKEY_PLAT_NOMATCH
- source使用方法