jbpm 使用日记5 一个简单会签示例

:D 经过3周的努力,终于看到点收获的希望. 基本实现目前项目的工作流业务需求.

以下例子中 采用了jbpm console 的几个示例用户

项目提交人 : ernie .

主管审批 : bert

会签 : ernie , bert , grover

老板审批 : grover



正常流程: 项目金额 >= 500W RMB

提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)


正常流程: 项目金额 < 500W RMB

提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)

其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.

会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.

流程定义如下:

[code]
<?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>


[/code]


会签swimlane class

[code]
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);
}

}

[/code]
创建会签任务实现类

[code]
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");

}

}
[/code]

结束不通过时结束其他会签任务实现
[code]
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");
}
}
}

}

}
[/code]

感谢 [url=http://tomkoo.iteye.com]tomkoo[/url]提供了会签的实现思路.


附件: 为流程定义IMG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值