作者:tomkoo
以下例子中 采用了jbpm console 的几个实例用户
项目提交人 : ernie .
主管审批 : bert
会签 : ernie , bert , grover
老板审批 : grover
正常流程: 项目金额 >= 500W RMB
提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)
正常流程: 项目金额 < 500W RMB
提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)
其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.
会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.
流程定义如下:
<?
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) ...{
// 从数据库或者ldap 读取会签人设置

String[] a = ...{ "ernie", "bert", "grover" };
assignable.setPooledActors(a);
}
}

创建会签任务实现类


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");
// 从数据库或者ldap 读取会签人设置创建任务实例
tmi.createTaskInstance(task, token).setActorId("ernie");
tmi.createTaskInstance(task, token).setActorId("bert");
tmi.createTaskInstance(task, token).setActorId("grover");
}
}

结束不通过时结束其他会签任务实现


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"));
// 如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例

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");
}
}
}
}
}