Activiti學習之 多實例實現會簽功


 

轉:

Activiti學習之 多實例實現會簽功能

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chq00788/article/details/41513451

一個任務需要多個角色進行審批或者表決,根據這些審批結果來決定流程的走向。實現以上任務,activiti已經提供了支持,可以使用BPMN規范的多實例活動來實現。

 

1.Activiti多實例:

 

多實例節點是在業務流程中定義重復環節的一個方法。 從開發角度講,多實例和循環是一樣的: 它可以根據給定的集合,為每個元素執行一個環節甚至一個完整的子流程, 既可以順序依次執行也可以並發同步執行

多實例是在一個普通的節點上添加了額外的屬性定義 (所以叫做'多實例特性'),這樣運行時節點就會執行多次。 下面的節點都可以成為一個多實例節點:

根據規范的要求,每個上級流程為每個實例創建分支時都要提供如下變量:

  • nrOfInstances:實例總數

  • nrOfActiveInstances:當前活動的,比如,還沒完成的,實例數量。 對於順序執行的多實例,值一直為1。

  • nrOfCompletedInstances:已經完成實例的數目。

可以通過execution.getVariable(x)方法獲得這些變量。

另外,每個創建的分支都會有分支級別的本地變量(比如,其他實例不可見, 不會保存到流程實例級別):

  • loopCounter:表示特定實例的在循環的索引值。可以使用activiti的elementIndexVariable屬性修改loopCounter的變量名。

圖形標記

如果節點是多實例的,會在節點底部顯示三條短線。 三條線表示實例會並行執行。 三條線表示順序執行。

Xml內容

要把一個節點設置為多實例,節點xml元素必須設置一個multiInstanceLoopCharacteristics子元素。

<multiInstanceLoopCharacteristics isSequential="false|true">  ... </multiInstanceLoopCharacteristics>

isSequential屬性表示節點是進行 順序執行還是並行執行。

實例的數量會在進入節點時計算一次。 有一些方法配置它。一種方法是使用loopCardinality子元素直接指定一個數字。

<multiInstanceLoopCharacteristics isSequential="false|true">   <loopCardinality>5</loopCardinality> </multiInstanceLoopCharacteristics>

也可以使用結果為整數的表達式:

<multiInstanceLoopCharacteristics isSequential="false|true">   <loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality> </multiInstanceLoopCharacteristics>

另一個定義實例數目的方法是,通過loopDataInputRef子元素,設置一個類型為集合的流程變量名。 對於集合中的每個元素,都會創建一個實例。 也可以通過inputDataItem子元素指定集合。 下面的代碼演示了這些配置:

<userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}">   <multiInstanceLoopCharacteristics isSequential="false">     <loopDataInputRef>assigneeList</loopDataInputRef>     <inputDataItem name="assignee" />   </multiInstanceLoopCharacteristics> </userTask>

假設assigneeList變量包含這些值[kermit, gonzo, foziee]。 在上面代碼中,三個用戶任務會同時創建。每個分支都會擁有一個用名為assignee的流程變量, 這個變量會包含集合中的對應元素,在例子中會用來設置用戶任務的分配者。

loopDataInputRefinputDataItem的缺點是1)名字不好記, 2)根據BPMN 2.0格式定義,它們不能包含表達式。activiti通過在 multiInstanceCharacteristics中設置 collection和 elementVariable屬性解決了這個問題:

<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}">   <multiInstanceLoopCharacteristics isSequential="true"      activiti:collection="${myService.resolveUsersForTask()}" activiti:elementVariable="assignee">   </multiInstanceLoopCharacteristics> </userTask>

多實例節點在所有實例都完成時才會結束。也可以指定一個表達式在每個實例結束時執行。 如果表達式返回true,所有其他的實例都會銷毀,多實例節點也會結束,流程會繼續執行。 這個表達式必須定義在completionCondition子元素中。

<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}">   <multiInstanceLoopCharacteristics isSequential="false"      activiti:collection="assigneeList" activiti:elementVariable="assignee" >     <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>   </multiInstanceLoopCharacteristics> </userTask>

在這里例子中,會為assigneeList集合的每個元素創建一個並行的實例。 當60%的任務完成時,其他任務就會刪除,流程繼續執行。

以上內容為Activiti用戶手冊的內容,下面實現一個簡單地流程
2.流程實現
流程圖為:
properties:
XML:
<userTask id="usertask1" name="會簽" activiti:assignee="${assignee}">
      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${assigneeList}" activiti:elementVariable="assignee">
        <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>
      </multiInstanceLoopCharacteristics>
</userTask>
 
發布流程:
Deployment deployment = repositoryService.createDeployment()
 .addClasspathResource("com/chq/ssh/test/activiti/deploy/huiqian.bpmn20.xml")
 .deploy();
啟動流程:
List<String> assigneeList=new ArrayList<String>(); //分配任務的人員
assigneeList.add("tom");
assigneeList.add("jeck");
assigneeList.add("mary");
Map<String, Object> vars = new HashMap<String, Object>(); //參數
vars.put("assigneeList", assigneeList);
 
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("huiqian",vars);
 
查詢任務:
這時查詢以上三個人的任務,都會顯示有“會簽”這個任務
List<Task> tasks = taskService.createTaskQuery().taskAssignee("mary").list();
完成任務:
會簽節點設置的: ${nrOfCompletedInstances/nrOfInstances >= 0.6 } 所有任務完成超過60%,剩余的任務就會刪除,表示會簽通過。
上面一共設置了三個任務,當兩個完成時,超過60%。流程結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM