一个简单的会签实例
2007-10-15 17:23
190 查看
作者: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>
render_code();
会签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);
}
}
render_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");
}
}
render_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");
}
}
}
}
}
render_code();
以下例子中 采用了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>
render_code();
会签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);
}
}
render_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");
}
}
render_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");
}
}
}
}
}
render_code();
相关文章推荐
- 一个简单的会签实例
- Jbpm 一个简单的会签实例
- SSH实现一个简单的权限控制实例(一)
- 一个最简单的AJAX实例及解析
- 一个ant的简单实例
- 最简单的一个堆栈溢出攻击实例 (2) [by Progsoft]
- 物理引擎Havok的一个简单实例(使用Ogre渲染)
- MATLAB OOP 实例 : 一个简单的BankAccout类
- SSH实现一个简单的权限控制实例(三)
- 一口一口吃掉Struts(三)——一个简单Struts实例
- 鸟哥的Linux私房菜(基础篇)- 一个简单的 SPFdisk 分割实例
- 通过一个对数据的存储和分析的简单实例初识Hadoop
- Servlet(4)—一个简单的Servlet实例
- php和数据库结合的一个简单的web实例 代码分析 (php初学者)
- delphi程序只允许运行一个实例的简单方法:
- 一个光线跟踪的简单实例
- Hinton Neural Networks课程笔记1d:一个简单的机器学习实例
- 自己写的一个操作Mysql的简单的实例
- C语言经典实例008:一个简单的求和程序
- JQuery中一个简单的表单验证的实例