Activiti中提供了多實例任務(for-each)將多實例應到到UserTask中可以實現會籤功能。
1
2
3
4
5
|
Multi-instance ( for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming concepts, a multi-instance matches the for each construct: it allows to execute a certain step or even a complete subprocess for each item in a given collection, sequentially or in parallel. A multi-instance is a regular activity that has extra properties defined (so-called 'multi-instance characteristics' ') which will cause the activity to be executed multiple times at runtime. Following activities can become a multi-instance activity: |
一.多實例用戶任務的XML表示:
1
2
3
4
5
6
7
8
|
<userTask id= "task" name= "多實例任務" > <multiInstanceLoopCharacteristics isSequential= "false" > <loopDataInputRef>assigneeList</loopDataInputRef> <inputDataItem name= "assignee" ></inputDataItem> <!-- userIdList[user1,user2,user3] --> <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition> </multiInstanceLoopCharacteristics> </userTask> |
在每個多實例創建後都會有3個變量,請看數據庫中act_ru_variable表的截圖:
nrOfInstances 實例總數
nrOfActiveInstances 當前還沒有完成的實例
nrOfCompletedInstances 已經完成的實例個數
multiInstanceLoopCharacteristics 是用了指定用戶任務爲多實例任務,isSequential 指定多實例是按照並行或者串行的方式進行,如果使用串行方式nrOfActiveInstances 變量始終是1 。isSequential串行並行是針對於assigneeList中的用戶集合來說的,如果是並行assigneeList集合中的每個用戶按照順序執行。
變量assigneeList,我們可以在執行這個任務之前進行賦值:
1
2
3
4
5
6
|
Map<String, Object> variables = new HashMap<String, Object>(); variables.put( "pass" , Boolean.parseBoolean(pass)); List<String> assigneeList = Arrays.asList( "10001#1001" , "10001#1002" , "10001#1003" ); variables.put( "assigneeList" , assigneeList); TaskService taskService = ActivitiUtils.getTaskService(); taskService.complete(taskId, variables); |
loopDataInputRef 指定一個流程變量的引用,該變量是一個List,可以在發起或這執行任務之前作爲流程變量放到引擎中,該list中的每一個元素將創建一個任務。元素的值通過 inputDataItem 元素的指定的變量來獲取,如 在這個實例中ist<String> assigneeList = Arrays.asList("10001#1001","10001#1002","10001#1003"); 這會創建3個用戶任務,每個用戶任務中都有一個 assignee 的變量,來分別得到list中的值。但是需要注意:選擇isSequential串行時一個任務完成後創建另一個任務,並不是一次性創建3個任務。
assigneeList 的值程序序列化後保存到act_ge_bytearray表中,請看圖:
completionCondition 結束任務的條件,該示例中是任務完成 60% 結束。
在第一步中我們知道變量 assignee 是 會籤人員的標識,只需要將指定代理人的地方用表達式來指定 assignee 變量就行了。 完整XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<userTask id= "thisTask2" name= "myTask2" > <humanPerformer>
<resourceAssignmentExpression>
<formalExpression>${assignee}</formalExpression>
</resourceAssignmentExpression> </humanPerformer> <multiInstanceLoopCharacteristics isSequential= "false" > <loopDataInputRef>assigneeList</loopDataInputRef> <inputDataItem name= "assignee" ></inputDataItem> <!-- userIdList[user1,user2,user3] --> <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition> </multiInstanceLoopCharacteristics> </userTask><span style= "white-space: pre;" >
</span> |
這裏附上圖: