activiti--多實例任務實現會籤

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>

這裏附上圖:






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章