一、什么是多实例(会签)
在流程业务管理中,任务通常是由一个人去处理的,而多个人同时处理一个任务,称之为会签任务。
Activiti实现会签是基于多实例任务,将节点设置成多实例,主要通过在UserTask节点的属性上配置。
如果想让某些特定的流程活动的行为执行多次,则可以将活动设置为多实例,让其按照配 置来执行相应的次数。User Task 会创建活动的实例, 流程是否通过 User Task ,由用户决定,这不属于活动的行为。活动的多实例可以让一个流程活动(甚至是子流程〉按顺序或者同时执行,在执行的过程中,会为活动产生多个实例,因此称该流程活动为多实例的流程活动。大部分的流程活动均可以被设置为循环执行,这些活动包 括大部分的流程任务、嵌入式子流程 和调用式子流程 。为流程活动的元素添
multilnstanceLoopCharacteristics 子元素,将该流程活动配置为一个多实例的活动,如以下的配
置片断:
<userTask id=” myTask ">
<multiinstanceLoopCharacteristics isSequent al false I true ”>
</multiinstanceLoopCharacteristics>
</userTask>
以上配置片断中的 multilnstanceLoopCharacteristics 元素的 isSequential 属性,用于配置这 个流程活动在执行时,是按顺序执行还是同时执行,为 true 表示按顺序执行, false 则同时执 丁。
多实例活动像是循环体,可以为它提供集合或者设定循环次数,让它循环,就像使用 Java
里面的循环语句一样。
<process id=” process l ” name=” processl ” >
<startEvent id=” starteventl " name=”Start ” ></startEvent>
<userTask id=” usertask2 " name=” Task 1 ”>
<multiinstanceLoopCharacteristicssSequential true
<loopCardinality>2</loopCardinality>
</multiinstanceLoopCharacteristics>
</userTask>
<endEvent id="endeventl" name="End"></ endEvent>
<seque ceFlow id="flowl" name= "" sourceRef=”starteventl”
targetRef usertask2 ></ seque ceFlow>
<sequenceFlow id=”flow2 ” name=”” sourceRef =” usertask2 ”
targetRef=”usertask3 ” ></sequenceFlow>
<sequenceFlow =” flow3 name =” sourceRef usertask3
targetRef=” endeventl” ></sequenceFlow>
</process>
中定义了 个多实例的用户任务,该用户任务的全部实例将会按顺序 执行( isSequential=true ),设置了循环次数为 代2。
二、多实例(会签)参数说明
会签的种类
- 按数量通过:达到一定数量的通过表决后,会签通过。
- 按比例通过:达到一定比例的通过表决后,会签通过。
- 一票否决:只要有一个表决是否定的,会签否决。
- 一票通过:只要有一个表决通过的,会签通过。
1、多实例包含的默认变量
- nrOfInstances:创建的实例总数
- nrOfActiveInstances:当前活动的实例数,针对顺序类型的多实例,该变量值等于1
- nrOfCompletedInstances:已执行实例数
- loopCounter:表示多实例流程循环的下标
2、多实例类型
顺序(sequential ):执行顺序,必选项。true:多实例顺序执行。false:多实例并行。 并行(parallel):多个实例会同时并行发放给处理人 loop cardinality:循环基数(实例数量),可选项。可填整数,表示会签的人数。 Collection:集合,可选项。会签人数的集合list,与loop cardinality二选一。 Element variable:元素变量。选择Collection时必选,为collection集合每次遍历的元素。 Completion condition:完成条件,可选项。
3、多实例基数
定义多实例生成的实例数。当结合采集方式生成多实例时,该基数只能小于或等于采集集合的size,否则执行过程中将发生系统错误 NoSuchElementException;当基数小于采集集合的size时,则按照集合中元素的顺序生成等于基数指定数量的实例。如果不配合使用采集方式,也可以直接指定基数,则系统会同时生成指定数量的相同实例。
4、多实例采集
用于指定一个List,自动生成等于List size数量的实例。可以将该List设置为处理人员列表,然后设置元素变量名,并将分配—固定值—处理人/代理人设置为元素变量名,则最后会为每一个集合中的人员生成一个已指派实例。
5、多实例元素变量
表示多实例采集中元素对应的变量,该变量保存着集合中元素的最新值,可以使用表达式获取。
6、多实例完成条件
是一个表达式,如果返回值为true则该多实例自动结束。例如 ${nrOfCompletedInstances/nrOfInstances >= 0.6 } 只要所有流程实例完成了60%即该多实例任务结束。
${nrOfInstances == nrOfCompletedInstances} 表示所有人员审批完成后会签结束。 ${ nrOfCompletedInstances == 1}表示一个人完成审批,该会签就结束。 Activiti会签有个特性,比如设置一个人完成后会签结束,那么其他人的代办任务都会消失。
7、分配
在使用多实例的情况下,当将分配—固定值—处理人/代理人/候选人设置为多实例元素变量名时,则生成的实例会对应自动指派给列表中配置的处理人。
三、流程设计器实现多实例
设置并行节点
多实例节点设置
1、回路特性:并行多重事件-paraller 并行
2、循环基数:设置为2,表示会签的人数
loop cardinality:循环基数(实例数量),可选项。可填整数,表示会签的人数。 Collection:集合,可选项。会签人数的集合list,与loop cardinality二选一。
在实际的业务中,如果设置 循环基数=2 ,Collection集合审批人为3人,则只有前两个人可以办理任务。(个人测试得到的结果,大家可以尝试验证。)
3、集合 Collection
设置成:assigneeList ,通过assigneeList动态设置办理人,核心代码如下:
获取下级节点办理人,获取设置的集合参数规则。
获取到集合的参数,并设置流程办理人。
4、元素变量
设置为:assignee,此处的值需要和任务中,处理用户的值设置一致,处理用户设置为:${assignee}。
5、完成条件
${nrOfCompletedInstances>=2} 完成总数大于等于2的时候执行下一节点。
任务分配-设置办理人
1、设置处理用户
首先进行静态分配功能下设置:
${assignee},如果在设置用户进行设置变量,则为办理用户。
如果在候选用户进行设置,则需要办理人进行签收再办理。
2、设置动态办理用户
动态设置才是最终需要办理的用户,1中设置的办理人变量${assignee}为会签参数变量,和元素变量一直,用户动态指定办理人的参数设置,那么变量设置完成了,如何指定对应的办理人呢?所以还需要在动态办理人中进行设置。
3、说明
需要先设置静态分配中的变量,在设置动态分配中的实际办理人。
设置顺序节点
所有的设置和并行节点一样,唯一注意的是:循环基数如果设置为2,集合设置了3个办理人,个人实践只执行了2次,大家可以尝试下,如果不一样请告知。