作者:tomkoo
以下例子中 采用了jbpm console 的幾個實例用戶
項目提交人 : ernie .
主管審批 : bert
會簽 : ernie , bert , grover
老板審批 : grover
正常流程: 項目金額 >= 500W RMB
提交項目 --> 主管審批 --> 會簽 --> 老板審批 --> 審批通過(結(jié)束)
正常流程: 項目金額 < 500W RMB
提交項目 --> 主管審批 --> 會簽 --> 審批通過(結(jié)束)
其中主管審批, 會簽, 老板審批 , 不通過, 全部退回給項目提交人修改.
會簽中: 所有人全通過, 則通過. 任何一人不通過, 停止其他會簽任務(wù).退回給提交人.
流程定義如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <process-definition xmlns="urn:jbpm.org:jpdl-3.1"
- name="tc_prj_approval">
- <swimlane name="initiator" />
- <!項目提交人 >
- <swimlane name="requester">
- <assignment expression="user(ernie)" />
- </swimlane>
- <! 主管 >
- <swimlane name="chief">
- <assignment expression="user(bert)" />
- </swimlane>
- <!老板 >
- <swimlane name="boss">
- <assignment expression="user(grover)" />
- </swimlane>
- <!會簽人 >
- <swimlane name="cosinger">
- <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">
- </assignment>
- </swimlane>
- <start-state name="start">
- <task name="tc_prj_newprj" swimlane="initiator"></task>
- <transition name="to_submit" to="tc_prj_submit"></transition>
- </start-state>
- <task-node name="tc_prj_submit">
- <task name="tc_prj_submit"></task>
- <transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition>
- </task-node>
- <task-node name="tc_prj_chiefapprove">
- <task name="tc_prj_chiefapprove"></task>
- <transition name="approve" to="tc_prj_countersign"></transition>
- <transition name="disapprove" to="tc_prj_submit"></transition>
- </task-node>
- <task-node name="tc_prj_countersign" signal="last-wait"
- create-tasks="false">
- <task name="tc_prj_countersign">
- <event type="task-end">
- <action
- class="net.chenj.jbpm.sample.TaskEndCountersign">
- </action>
- </event>
- </task>
- <event type="node-enter">
- <action name="createInstance"
- class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">
- </action>
- </event>
- <transition name="approve" to="amount_decision"></transition>
- <transition name="disapprove" to="tc_prj_submit"></transition>
- </task-node>
- <decision name="amount_decision">
- <transition name="to_bossapprove" to="tc_prj_bossapprove"></transition>
- <transition name="to_end" to="end1"></transition>
- </decision>
- <task-node name="tc_prj_bossapprove">
- <task name="tc_prj_bossapprove"></task>
- <transition name="approve" to="end1"></transition>
- <transition name="disapprove" to="tc_prj_submit">
- <condition>#{amount >= 500}</condition>
- </transition>
- </task-node>
- <end-state name="end1"></end-state>
- </process-definition>
會簽swimlane class
- package net.chenj.jbpm.sample;
- import org.jbpm.graph.exe.*;
- import org.jbpm.taskmgmt.def.*;
- import org.jbpm.taskmgmt.exe.Assignable;
- public class CosingerAssiHandler implements AssignmentHandler {
- private static final long serialVersionUID = 1L;
- public void assign(Assignable assignable, ExecutionContext executionContext) {
- // 從數(shù)據(jù)庫或者ldap 讀取會簽人設(shè)置
- String[] a = { "ernie", "bert", "grover" };
- assignable.setPooledActors(a);
- }
- }
創(chuàng)建會簽任務(wù)實現(xiàn)類
- package net.chenj.jbpm.sample;
- 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 CreateTaskInstanceCountersign 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("tc_prj_countersign");
- // 從數(shù)據(jù)庫或者ldap 讀取會簽人設(shè)置創(chuàng)建任務(wù)實例
- tmi.createTaskInstance(task, token).setActorId("ernie");
- tmi.createTaskInstance(task, token).setActorId("bert");
- tmi.createTaskInstance(task, token).setActorId("grover");
- }
- }
結(jié)束不通過時結(jié)束其他會簽任務(wù)實現(xiàn)
- package net.chenj.jbpm.sample;
- import java.util.Collection;
- import java.util.Iterator;
- import org.jbpm.graph.def.ActionHandler;
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.taskmgmt.exe.TaskInstance;
- import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
- public class TaskEndCountersign implements ActionHandler {
- private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception {
- boolean isDisapprove = Boolean.valueOf((String) executionContext
- .getVariable("isDisapprove"));
- // 如果有一個任務(wù)實例拒絕通過則結(jié)束除當前任務(wù)實例外其他任務(wù)實例
- if (isDisapprove) {
- TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
- TaskInstance ti = executionContext.getTaskInstance();
- final String actorId = ti.getActorId();
- Collection c = tmi.getSignallingTasks(executionContext);
- for (Iterator it = c.iterator(); it.hasNext();) {
- TaskInstance task = (TaskInstance) it.next();
- if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
- task.end("disapprove");
- }
- }
- }
- }
- }