|
昨天在Jbpm-inside群里面和大家討論了在Jbpm流程中,如何實現(xiàn)“會簽”的問題,最后得出了兩種方案。今天就這兩種思想中的一種:通過Aciton動態(tài)創(chuàng)建TaskInstance來實現(xiàn)“會簽”,自己實現(xiàn)了一把,成功了!
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="開始" to="財務(wù)人員錄入"></transition>
- </start-state>
- <task-node name="財務(wù)人員錄入">
- <task name="財務(wù)人員錄入申報數(shù)據(jù)" swimlane="PooledActors"></task>
- <transition name="主管會計復(fù)核" to="主管會計復(fù)核"></transition>
- </task-node>
- <task-node name="主管會計復(fù)核" signal="last-wait" create-tasks="false">
- <task name="主管會計復(fù)核" swimlane="PooledActors"></task>
- <event type="node-enter">
- <action name="createInstance"
- class="com.sky.plugin.jbpm.CreateTaskInstance">
- </action>
- </event>
- <transition name="復(fù)核通過" to="領(lǐng)導(dǎo)審批"></transition>
- <transition name="復(fù)核不通過" to="異常結(jié)束"></transition>
- </task-node>
- <task-node name="領(lǐng)導(dǎo)審批">
- <task name="領(lǐng)導(dǎo)審批" swimlane="PooledActors"></task>
- <transition name="同意" to="結(jié)束"></transition>
- <transition name="不同意" to="異常結(jié)束"></transition>
- </task-node>
- <end-state name="結(jié)束"></end-state>
- <end-state name="異常結(jié)束"></end-state>
- </process-definition>
task-node"主管會計復(fù)核"則是我們需要進行會簽的節(jié)點。在這個節(jié)點我們設(shè)置了幾個重要的屬性:
1) signal="last-wait",這個屬性決定了該節(jié)點將在完成該節(jié)點內(nèi)的所有Task的TaskInstance以后才會進入下一個節(jié)點。)
2) create-tasks="false",這個屬性決定了在進入該節(jié)點的時候,不會自動為該節(jié)點的任何Task創(chuàng)建任何的TaskInstance。因為我們需要根據(jù)會簽的人員來自己創(chuàng)建TaskInstance。
3) action,action的設(shè)定是為了,在Action中根據(jù)實際的情況來創(chuàng)建TaskInstance
2. 編寫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("主管會計復(fù)核");
- tmi.createTaskInstance(task, token)
- .setPooledActors(new String[]{"1000"});
- tmi.createTaskInstance(task, token)
- .setPooledActors(new String[]{"1001"});
-
- }
-
- }
當(dāng)然,在實際情況中.setPooledActors(new String[]{"100"})中設(shè)置的actor應(yīng)該是動態(tài)指定的,這里為了簡單方便就直接寫入的固定值。
3.部署運行,OK!
注意:如果在給TaskInstance指定Actor的時候是使用.setActor()方法的話,那么在獲取用戶任務(wù)列表的時候用.
findTaskInstances();如果是用.setPooledActors(),則需要使用.findPolledTaskInstance
()方法。[list][/list]
|