jbpm系列之五--使用decision节点判断分支情况
? ? ? ? ?我們?cè)谟肑BPM做流程的時(shí)候,很多時(shí)候會(huì)遇到需要判斷的節(jié)點(diǎn)。類似java中的switch,根據(jù)不同的狀態(tài),跳轉(zhuǎn)到不同的節(jié)點(diǎn)。
???????? 首先我們定義一個(gè)流程信息,jpdl流程圖如下
?
明顯的可以看到,在此種情況下我們就必須用到decision節(jié)點(diǎn)來控制不同的業(yè)務(wù)跳轉(zhuǎn)到不同的角色上。
???????? 我們的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="組長批準(zhǔn)" to="歸檔" g="-51,-26"/></task><task assignee="kezhang" name="科長" g="342,199,92,52"><transition name="科長批準(zhǔn)" to="歸檔" g="-49,-25"/></task><task assignee="zhuren" name="主任" g="349,325,92,52"><transition name="主任批準(zhǔn)" 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中的哪個(gè)name的值就跳轉(zhuǎn)到哪個(gè)角色中
?
在代碼中:
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 {@Overridepublic void deploy() {super.startUp();repositoryService.createDeployment().addResourceFromClasspath("com/tgb/node/decision/decision.jpdl.xml").deploy();}@Overridepublic void createInstance() {super.startUp();Map<String,Object> map = new HashMap<String,Object>();map.put("node", "大于2天,小于10");ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);print("流程實(shí)例ID",processInstance.getId());}@Overridepublic void getCurrectActivity() {super.startUp();String name = executionService.createProcessInstanceQuery().processInstanceId("decision.130001").uniqueResult().findActiveActivityNames().toString();print("到達(dá)節(jié)點(diǎn)名稱",name);}@Overridepublic void getTask() {// TODO Auto-generated method stub}@Overridepublic void completeTask() {// TODO Auto-generated method stub}}?
我們只需在代碼中控制node的值即可跳轉(zhuǎn)到不同的人員。
?
?
第二種:使用表達(dá)式判斷
<?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="組長批準(zhǔn)" to="歸檔" g="-51,-26"/></task><task assignee="kezhang" name="科長" g="342,199,92,52"><transition name="科長批準(zhǔn)" to="歸檔" g="-49,-25"/></task><task assignee="zhuren" name="主任" g="349,325,92,52"><transition name="主任批準(zhǔn)" 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>?
此種方法即把判斷放到配置文件中,只需傳過一個(gè)數(shù)字來判斷即可。
public void createInstance() {super.startUp();Map<String,Object> map = new HashMap<String,Object>();map.put("days", 15);ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision", map);print("流程實(shí)例ID",processInstance.getId());}?
創(chuàng)建流程實(shí)例代碼如上,將參數(shù)用days傳過來即可判斷。
?
?
第三種方法:監(jiān)聽判斷
寫一個(gè)類MyDecision,繼承DecisionHandler
在jpdl文件中配置上MyDecision,通過復(fù)寫decide方法,用execution將參數(shù)傳過來。
?
<?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="組長批準(zhǔn)" to="歸檔" g="-51,-26"/></task><task assignee="kezhang" name="科長" g="342,199,92,52"><transition name="科長批準(zhǔn)" to="歸檔" g="-49,-25"/></task><task assignee="zhuren" name="主任" g="349,325,92,52"><transition name="主任批準(zhǔn)" 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;@Overridepublic String decide(OpenExecution execution) {String to = execution.getVariable("to").toString();if(to.equals("組長")){return "到組長";}else if (to.endsWith("科長")){return "到科長";}else{return "到主任";}} }?
? ? ? ? ?此種方法將判斷邏輯交給了java代碼,不用重新部署流程。
總結(jié)
以上是生活随笔為你收集整理的jbpm系列之五--使用decision节点判断分支情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js过滤特殊字符串
- 下一篇: mysql-mmm高可用架构