Activiti中提供了多實例任務(for-each)將多實例應到到UserTask中可以實現會簽功能。
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表示:
<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,我們可以在執行這個任務之前進行賦值:
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:
<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>
這里附上圖: