我们在用JBPM做流程的时候,很多时候会遇到需要判断的节点。类似java中的switch,根据不同的状态,跳转到不同的节点。

首先我们定义一个流程信息,jpdl流程图如下

明显的可以看到,在此种情况下我们就必须用到decision节点来控制不同的业务跳转到不同的角色上。

我们的jpdl.xml中的代码为:

<?xml version="1.0" encoding="UTF-8"?>

<process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="22,200,48,48">
<transition name="提交" to="exclusive1" g="-15,-20"/>
</start>
<decision name="exclusive1" expr="${node}" g="185,201,48,48">
<transition name="小于2天" to="组长" g="-49,-32"/>
<transition name="大于2天,小于10" to="科长" g="-56,-28"/>
<transition name="10天以上" to="主任" g="-47,-22"/>
</decision>
<task assignee="zuzhang" name="组长" g="338,69,92,52">
<transition name="组长批准" to="归档" g="-51,-26"/>
</task>
<task assignee="kezhang" name="科长" g="342,199,92,52">
<transition name="科长批准" to="归档" g="-49,-25"/>
</task>
<task assignee="zhuren" name="主任" g="349,325,92,52">
<transition name="主任批准" to="归档" g="-41,-25"/>
</task>
<task assignee="caiwu" name="归档" g="531,201,92,52">
<transition name="通过" to="end1" g="-35,-22"/>
</task>
<end name="end1" g="689,208,48,48"/>
</process>

此种方法是定义流程变量,流程变量等于transition中的哪个name的值就跳转到哪个角色中

在代码中:

package com.tgb.node.decision;

import java.util.HashMap;
import java.util.Map; import org.jbpm.api.ProcessInstance; import com.tgb.video.JbpmTestCase;
import com.tgb.video.JbpmUtil; public class TestDecision extends JbpmTestCase implements JbpmUtil { @Override
public void deploy() {
super.startUp();
repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision.jpdl.xml").deploy();
} @Override
public void createInstance() {
super.startUp();
Map<String,Object> map = new HashMap<String,Object>();
map.put("node", "大于2天,小于10");
ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
print("流程实例ID",processInstance.getId());
} @Override
public void getCurrectActivity() {
super.startUp();
String name = executionService.createProcessInstanceQuery().processInstanceId("decision.130001").uniqueResult().findActiveActivityNames().toString();
print("到达节点名称",name);
} @Override
public void getTask() {
// TODO Auto-generated method stub } @Override
public void completeTask() {
// TODO Auto-generated method stub } }

我们只需在代码中控制node的值即可跳转到不同的人员。

第二种:使用表达式判断

<?xml version="1.0" encoding="UTF-8"?>

<process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="22,200,48,48">
<transition name="提交" to="exclusive1" g="-15,-20"/>
</start>
<decision name="exclusive1" g="185,201,48,48">
<transition name="小于2天" to="组长" g="-49,-32">
<condition expr="${days lt 2}"/>
</transition>
<transition name="大于2天,小于10" to="科长" g="-56,-28">
<condition expr="${days ge 2 and days le 10}"/>
</transition>
<transition name="10天以上" to="主任" g="-47,-22">
<condition expr="${days gt 10}"/>
</transition>
</decision>
<task assignee="zuzhang" name="组长" g="338,69,92,52">
<transition name="组长批准" to="归档" g="-51,-26"/>
</task>
<task assignee="kezhang" name="科长" g="342,199,92,52">
<transition name="科长批准" to="归档" g="-49,-25"/>
</task>
<task assignee="zhuren" name="主任" g="349,325,92,52">
<transition name="主任批准" to="归档" g="-41,-25"/>
</task>
<task assignee="caiwu" name="归档" g="531,201,92,52">
<transition name="通过" to="end1" g="-35,-22"/>
</task>
<end name="end1" g="689,208,48,48"/>
</process>

此种方法即把判断放到配置文件中,只需传过一个数字来判断即可。

public void createInstance() {
super.startUp();
Map<String,Object> map = new HashMap<String,Object>();
map.put("days", 15);
ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);
print("流程实例ID",processInstance.getId());
}

创建流程实例代码如上,将参数用days传过来即可判断。

第三种方法:监听判断

写一个类MyDecision,继承DecisionHandler

在jpdl文件中配置上MyDecision,通过复写decide方法,用execution将参数传过来。

<?xml version="1.0" encoding="UTF-8"?>

<process key="decision" name="decision" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="22,200,48,48">
<transition name="提交" to="exclusive1" g="-15,-20"/>
</start>
<decision name="exclusive1" g="185,201,48,48">
<handler class="com.tgb.node.decision.MyDecision"/>
<transition name="到组长" to="组长" g="-49,-32">
</transition>
<transition name="到科长" to="科长" g="-56,-28">
</transition>
<transition name="到主任" to="主任" g="-47,-22">
</transition>
</decision>
<task assignee="zuzhang" name="组长" g="338,69,92,52">
<transition name="组长批准" to="归档" g="-51,-26"/>
</task>
<task assignee="kezhang" name="科长" g="342,199,92,52">
<transition name="科长批准" to="归档" g="-49,-25"/>
</task>
<task assignee="zhuren" name="主任" g="349,325,92,52">
<transition name="主任批准" to="归档" g="-41,-25"/>
</task>
<task assignee="caiwu" name="归档" g="531,201,92,52">
<transition name="通过" to="end1" g="-35,-22"/>
</task>
<end name="end1" g="689,208,48,48"/>
</process>

MyDecision类中代码:

package com.tgb.node.decision;

import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution; public class MyDecision implements DecisionHandler { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public String decide(OpenExecution execution) {
String to = execution.getVariable("to").toString(); if(to.equals("组长")){
return "到组长";
}else if (to.endsWith("科长")){
return "到科长";
}else{
return "到主任";
}
}
}

此种方法将判断逻辑交给了java代码,不用重新部署流程。

jbpm系列之五--使用decision节点判断分支情况的更多相关文章

  1. JBPM具体应用之decision节点的使用

    JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task.在本文中我们先介绍decision节点,余 ...

  2. JBPM4之decision节点:2、好学生|坏学生|超级学生

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  3. JBPM4之decision节点:3、程序猿|菜鸟|攻城狮|牛人

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  4. JBPM4之decision节点:1、好学生 | 坏学生

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  5. JBPM4入门——8.等待节点的分支执行

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  6. 给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化

    给Ajax一个漂亮的嫁衣——Ajax系列之五(下)之序列化和反序列化 标签: ajaxdictionaryjsonobject服务器function 2012-07-25 18:41 2242人阅读  ...

  7. Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理

    上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...

  8. Python猫荐书系列之五:Python高性能编程

    稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资…… 对于编程语言的争论,就是猿界的生 ...

  9. Red Gate系列之五 .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程

    原文:Red Gate系列之五 .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程 Red Gate ...

随机推荐

  1. Node.js模块os

    OS 操作系统模块 os.hostname() 操作系统的主机名. os.type() 操作系统的名称 os.release() 操作系统的发行版本 os.uptime() 当前系统的时间 以秒为 o ...

  2. FusionCharts 学习总结

    FusionCharts和Charts一样都是对数据进行统计并绘制成图标的控件,但FusionCharts带有跨浏览器的flash图表组件解决方案,功能更为强大.. 在这里我将采用Js来加载Fusio ...

  3. C++内联函数、函数模板之于头文件

    一.基本说明 C++标准中提到,一个编译单元是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件 ...

  4. 在C语言中基本数据类型所占的字节数

    基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度: 32位编译器中各基本类型所占字节数: 注:对于32位的编译器,指针变量的 ...

  5. (Problem 73)Counting fractions in a range

    Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...

  6. oracle如何修改字段类型(oracle总体知识2)

    在一次做开发的时候,遇到需要将数据表的字段类型由number改成varchar,可是该字段又有值, 用  alter table t-name modify cname newType;会报错. 话说 ...

  7. jQuery File Upload

    jQuery File Upload介绍.............................................. 2 实现基本原理......................... ...

  8. php 登录实例演示

    <pre name="code" class="python">一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主 ...

  9. 【浏览器那些基础】Android平台有那些CPU类型

    在编译Android应用的时候,需要配置支持的CPU类型,而目前Android支持的CPU类型包含了ARM和X86,所以在编译前需要指定CPU类型(不同的cpu的特性不一样): X86系列的 expo ...

  10. float存储方式编程验证

    取出float在内存中的编码: void printFloatAsBinary(float f){ // 二进制的位数 const int bits = sizeof(f) * 8; // 将floa ...