| 昨天在Jbpm-inside群里面和大家討論了在Jbpm流程中,如何實(shí)現“會(huì )簽”的問(wèn)題,最后得出了兩種方案。今天就這兩種思想中的一種:通過(guò)Aciton動(dòng)態(tài)創(chuàng )建TaskInstance來(lái)實(shí)現“會(huì )簽”,自己實(shí)現了一把,成功了! 1. 創(chuàng )建processDefinition.xml流程定義文件,如下: 代碼 - <?xml version="1.0" encoding="UTF-8"?>
- <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="webPay">
- <swimlane name="PooledActors">
- <assignment class="com.sky.plugin.jbpm.ActorHandel"></assignment>
- </swimlane>
- <start-state name="網(wǎng)上支付審批流程">
- <transition name="開(kāi)始" to="財務(wù)人員錄入"></transition>
- </start-state>
- <task-node name="財務(wù)人員錄入">
- <task name="財務(wù)人員錄入申報數據" swimlane="PooledActors"></task>
- <transition name="主管會(huì )計復核" to="主管會(huì )計復核"></transition>
- </task-node>
- <task-node name="主管會(huì )計復核" signal="last-wait" create-tasks="false">
- <task name="主管會(huì )計復核" swimlane="PooledActors"></task>
- <event type="node-enter">
- <action name="createInstance"
- class="com.sky.plugin.jbpm.CreateTaskInstance">
- </action>
- </event>
- <transition name="復核通過(guò)" to="領(lǐng)導審批"></transition>
- <transition name="復核不通過(guò)" to="異常結束"></transition>
- </task-node>
- <task-node name="領(lǐng)導審批">
- <task name="領(lǐng)導審批" swimlane="PooledActors"></task>
- <transition name="同意" to="結束"></transition>
- <transition name="不同意" to="異常結束"></transition>
- </task-node>
- <end-state name="結束"></end-state>
- <end-state name="異常結束"></end-state>
- </process-definition>
task-node"主管會(huì )計復核"則是我們需要進(jìn)行會(huì )簽的節點(diǎn)。在這個(gè)節點(diǎn)我們設置了幾個(gè)重要的屬性: 1) signal="last-wait",這個(gè)屬性決定了該節點(diǎn)將在完成該節點(diǎn)內的所有Task的TaskInstance以后才會(huì )進(jìn)入下一個(gè)節點(diǎn)。) 2) create-tasks="false",這個(gè)屬性決定了在進(jìn)入該節點(diǎn)的時(shí)候,不會(huì )自動(dòng)為該節點(diǎn)的任何Task創(chuàng )建任何的TaskInstance。因為我們需要根據會(huì )簽的人員來(lái)自己創(chuàng )建TaskInstance。 3) action,action的設定是為了,在A(yíng)ction中根據實(shí)際的情況來(lái)創(chuàng )建TaskInstance 2. 編寫(xiě)Action代碼 代碼 - import org.jbpm.graph.def.ActionHandler;
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.graph.exe.Token;
- import org.jbpm.graph.node.TaskNode;
- import org.jbpm.taskmgmt.def.Task;
- import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
-
- public class CreateTaskInstance implements ActionHandler {
-
- private static final long serialVersionUID = 1L;
-
- public void execute(ExecutionContext executionContext) throws Exception {
- Token token = executionContext.getToken();
- TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
-
- TaskNode taskNode = (TaskNode) executionContext.getNode();
- Task task= taskNode.getTask("主管會(huì )計復核");
- tmi.createTaskInstance(task, token)
- .setPooledActors(new String[]{"1000"});
- tmi.createTaskInstance(task, token)
- .setPooledActors(new String[]{"1001"});
-
- }
-
- }
當然,在實(shí)際情況中.setPooledActors(new String[]{"100"})中設置的actor應該是動(dòng)態(tài)指定的,這里為了簡(jiǎn)單方便就直接寫(xiě)入的固定值。 3.部署運行,OK! 注意:如果在給TaskInstance指定Actor的時(shí)候是使用.setActor()方法的話(huà),那么在獲取用戶(hù)任務(wù)列表的時(shí)候用. findTaskInstances();如果是用.setPooledActors(),則需要使用.findPolledTaskInstance ()方法。[list][/list] |