Activiti参与人扩展

来源:互联网 发布:南昌怎么样 知乎 编辑:程序博客网 时间:2024/04/29 17:53

1、制单人

String userId = null;if(ParticipantContext.getProcessInstance()!=null){   HistoricProcessInstance historicProcessInstance = bpmEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(ParticipantContext.getProcessInstance().getId()).singleResult();   if(historicProcessInstance != null){      userId = historicProcessInstance.getStartUserId();   }}if(userId==null){   userId = BpmAuthentication.getAuthenticatedUserId();}

Activiti中提供了多实例任务(for-each)将多实例应到到UserTask中可以进行参与人扩展,实现多任务。
 <process id="process9728" name="mgr" isExecutable="true">    <sequenceFlow id="SequenceFlow3008" sourceRef="startEvent6770" targetRef="approveUserTask5586"/>    <startEvent id="startEvent6770" name="启动"/>    <approveUserTask id="approveUserTask5586" name="发起人" activiti:assignAble="false" activiti:addsignAble="false" activiti:rejectAble="true" activiti:delegateAble="false" activiti:samepostApprove="false" activiti:extendAttributes="[]" activiti:priority="50">      <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${bpmBean.getUser(&quot;{'filters':[],'processParticipantItems':[{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'CURUSER','userfilter':''}]}&quot;)}" activiti:elementVariable="assignee"/>    </approveUserTask>    <approveUserTask id="ApproveUserTask2" name="部门负责人" activiti:assignAble="false" activiti:addsignAble="false" activiti:rejectAble="false" activiti:delegateAble="false" activiti:samepostApprove="false" activiti:extendAttributes="[]" activiti:priority="50">      <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${bpmBean.getUser(&quot;{'filters':[],'processParticipantItems':[{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'ORGMGR','userfilter':''},{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'extend_role1','userfilter':''}]}&quot;)}" activiti:elementVariable="assignee"/>    </approveUserTask>    <sequenceFlow id="sid-615A1782-727D-4761-A879-C6DBCBCF92FD" sourceRef="approveUserTask5586" targetRef="ApproveUserTask2"/>    <approveUserTask id="ApproveUserTask3" name="上级部门负责人" activiti:assignAble="false" activiti:addsignAble="false" activiti:rejectAble="false" activiti:delegateAble="false" activiti:samepostApprove="false" activiti:extendAttributes="[]" activiti:priority="50">      <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${bpmBean.getUser(&quot;{'filters':[],'processParticipantItems':[{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'HIGHERORGMGR','userfilter':''}]}&quot;)}" activiti:elementVariable="assignee"/>    </approveUserTask>    <sequenceFlow id="sid-7CD77926-8149-4127-8F05-74B63B271E7D" sourceRef="ApproveUserTask2" targetRef="ApproveUserTask3"/>    <endEvent id="EndNoneEvent2" name="结束"/>    <sequenceFlow id="sid-64F34D7E-2762-4A4B-B519-54FDB341CEBE" sourceRef="ApproveUserTask3" targetRef="EndNoneEvent2"/>  </process>
要把一个节点设置为多实例,节点xml元素必须设置一个multiInstanceLoopCharacteristics子元素。 
Java代码  收藏代码
  1. <multiInstanceLoopCharacteristics isSequential="false|true">  
  2. ...  
  3. </multiInstanceLoopCharacteristics>  


isSequential属性表示节点是进行 顺序执行还是并行执行。 
实例的数量会在进入节点时计算一次。 有一些方法配置它。一种方法是使用loopCardinality子元素直接指定一个数字。 
Java代码  收藏代码
  1. <multiInstanceLoopCharacteristics isSequential="false|true">  
  2. <loopCardinality>5</loopCardinality>  
  3. </multiInstanceLoopCharacteristics>  


也可以使用结果为整数的表达式: 

Java代码  收藏代码
  1. <multiInstanceLoopCharacteristics isSequential="false|true">  
  2. <loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality>  
  3. </multiInstanceLoopCharacteristics>  


另一个定义实例数目的方法是,通过loopDataInputRef子元素,设置一个类型为集合的流程变量名。 对于集合中的每个元 
素,都会创建一个实例。 也可以通过inputDataItem子元素指定集合。 下面的代码演示了这些配置: 

Java代码  收藏代码
  1. <userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}">  
  2. <multiInstanceLoopCharacteristics isSequential="false">  
  3. <loopDataInputRef>assigneeList</loopDataInputRef>  
  4. <inputDataItem name="assignee" />  
  5. </multiInstanceLoopCharacteristics>  
  6. </userTask>  


假设assigneeList变量包含这些值[kermit, gonzo, foziee]。 在上面代码中,三个用户任务会同时创建。每个分支都会拥 
有一个用名为assignee的流程变量, 这个变量会包含集合中的对应元素,在例子中会用来设置用户任务的分配者。 
loopDataInputRef和inputDataItem的缺点是1)名字不好记, 2)根据BPMN 2.0格式定义,它们不能包含表达式。activiti 
通过在 multiInstanceCharacteristics中设置 collection和 elementVariable属性解决了这个问题: 

Java代码  收藏代码
  1. <userTask id="miTasks" name="My Task" activiti:assignee="${assignee}">  
  2. <multiInstanceLoopCharacteristics isSequential="true"  
  3. activiti:collection="${myService.resolveUsersForTask()}" activiti:elementVariable="assignee" >  
  4. </multiInstanceLoopCharacteristics>  
  5. </userTask>  

多实例节点在所有实例都完成时才会结束。也可以指定一个表达式在每个实例结束时执行。 如果表达式返回true,所有其 
他的实例都会销毁,多实例节点也会结束,流程会继续执行。 这个表达式必须定义在completionCondition子元素中。 

Java代码  收藏代码
  1. <userTask id="miTasks" name="My Task" activiti:assignee="${assignee}">  
  2. <multiInstanceLoopCharacteristics isSequential="false"  
  3. activiti:collection="assigneeList" activiti:elementVariable="assignee" >  
  4. <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>  
  5. </multiInstanceLoopCharacteristics>  
  6. </userTask>  


在这里例子中,会为assigneeList集合的每个元素创建一个并行的实例。 当60%的任务完成时,其他任务就会删除,流程 
继续执行。

原创粉丝点击