所谓多实例任务,就是一个任务,需要多个人协作完成,大致可以分为两种:

(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 节点

下面简单解释一些其含义:

  1. isSequential,为true表示是串行多实例,false表示是并行多实例
  2. activiti:collection,表示多实例的人员集合,${leaderList}是取变量leaderList的值
  3. activiti:elementVariable,人员集合中的元素变量,这里要UserTask中activiti:assignee的值对应,这里变量名称都是leader
  4. nrOfInstances,实例总数(nr是number的简写)
  5. nrOfCompletedInstances,已完成的实例数
  6. 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);

启动流程后,进入到多实例任务,留意以下几张表的数据变化:

  1. 用户任务表,act_ru_task
  2. 节点执行表,act_ru_execution
  3. 用户与流程关联表,act_ru_identitylink
  4. 变量表,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之多实例任务相关推荐

  1. activiti启动流程实例,添加进businessKey

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

  2. activiti启动流程实例

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

  3. SpringBoot 结合Activiti 进行单条实例工作流审批

    1.建立maven项目,引入maven依赖 #因为我的项目单独引入了mybatis-plus所以这里对activiti排除一下mybatis的依赖 <dependency><grou ...

  4. 【activiti】流程实例

    流程实例 1.什么是流程实例 **流程实例(ProcessInstance)**代表流程定义的执行实例. 一个流程实例包含了所有的运行节点.我们可以利用这个对象来了解当前流程实例的进度等信息. 例如: ...

  5. 删除activiti的流程实例报错Process instance is still running, cannot delete historic process instance

    historyService.deleteHistoricProcessInstance(processInstanceId);用这句代码删除还没结束的流程实例时报错. 方案:http://www.y ...

  6. activiti 根据 流程实例ID 获取发起人

    /**获取发起人* @param PROC_INST_ID_ //流程实例ID* @from fhadmin.cn*/protected String getInitiator(String PROC ...

  7. activiti官网实例项目activiti-explorer之扩展流程节点属性

    节点中添加"关联表单"属性 1,stencilset.json中加入如下代码 , {     "name" : "approveTypepackage ...

  8. Activiti 用户任务并行动态多实例(多用户执行流程)

    在很多情况下,我们需要多用户共同执行余下流程,比如开会流程: 领导发起开会,选择开会人员(多个) 每个开会人员接收到通知后需要签到(一名用户签到不会影响到另一位用户的签到) 签到完成后则流程结束 如果 ...

  9. Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)

    相关代码参考gihub:https://github.com/changwensir/Activiti/tree/master/ActivitiDemo1 一.Activiti 历史任务查询 实际工作 ...

最新文章

  1. 客快物流大数据项目(四):大数据项目为什么使用Docker
  2. 项目经理案头手册学习系列【12】——使用挣值分析法控制项目
  3. php json java_php 解析java传过来的json数据
  4. FFmpeg 硬件加速方案概览 (上)
  5. struts2--java.lang.IllegalAccessException: Class ognl.OgnlRuntime can not access a member of
  6. Android(java)学习笔记27:TextView属性大全
  7. 【JAVA基础篇】集合框架
  8. Jsp Servlet Mysql实现的学生成绩管理系统
  9. 蔬菜刀行业调研报告 - 市场现状分析与发展前景预测
  10. unix网络编程各种TCP客户-服务器程序设计实例(三)
  11. 黄杏元《地理信息系统概论》考研复习考点精讲(八)
  12. 软考中级网络工程师笔记(一)
  13. mysql数据加表头导出_mysql导出数据到表格讲解大全(导出数据带表头,导出数据中文乱码问题解决)...
  14. 助力公共事业服务,RPA大显身手
  15. 略谈基本计数原理和排列组合
  16. ubuntu和mac进行文件传输 运用scp命令
  17. 紫外线传感器用于天然气燃烧火焰探测
  18. Adaboost算法理论
  19. 高德地图 Service 创建服务 USERKEY_PLAT_NOMATCH
  20. source使用方法

热门文章

  1. 知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)
  2. iOS 屏幕原点坐标
  3. LocalDate和LocalTime的用法介绍
  4. 期末项目——人力资源管理系统需求分析
  5. LeetCode 46——全排列
  6. iOS逆向小知识:批量部署插件(搭建私有Cydia源)
  7. C语言double数据类型介绍、示例和应用经验
  8. 网站百度权重竟然升了,经验分享
  9. 计算机主机清洁方法,实验室设备维护之电脑主机的清洁
  10. resched_task()