`
chengzhi
  • 浏览: 112267 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

jbpm4学习--一个订单审核流程

阅读更多

在上文的基础上,开始第一个流程的编写。

一、准备工作

1、先想一个订单的审批流程

     主管审核--金额判断---总经理审核

2、先浏览jbpm4自带的example,

    找到可以CCP(copy、cut、paste)的代码、配置文件

   总计有:decision、state、eventListner等

二、画流程图

 用jbpm4带的eclipse插件画

经过长时间地与这个插件作斗争,我终于屈服了,不在画图界面上输入汉字。

步骤如下:

1、先画一个流程,只输入英文。

2、切换到到source标签下,把英文改成中文。。。再保存。

3、千万别再切回design标签下并保存。

画出来的结果如下:order.jpdl.xml

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

<process key="orderAudit" name="orderAudit" version="1" xmlns="http://jbpm.org/4.0/jpdl">
 <on event="start">
    <event-listener class="ex.order.LogListener">
      <field name="msg"><string value="有一个定单提请主管审核"/></field>
    </event-listener>
  </on>
  <start g="35,28,48,48" name="start1">
       <transition name="提请主管审核" to="superAudit" g="-83,-17"/>
  </start>
 
 
   <state g="104,25,92,52" name="superAudit">
     <on event="start">
     <event-listener class="ex.order.LogListener">
        <field name="msg"><string value="等候主管审核"/></field>
      </event-listener>
   </on>
    <on event="end">
      <event-listener class="ex.order.LogListener">
        <field name="msg"><string value="主管审核完毕"/></field>
      </event-listener>
    </on>
      <transition name="主管同意" to="moneyAutoAudit" g="-107,-17"/>
      <transition name="主管驳回" to="cancel1" g="-65,-17"/>
   </state>
  
   <decision g="273,27,48,48" name="moneyAutoAudit" >
    <on event="start">
     <event-listener class="ex.order.LogListener">
        <field name="msg"><string value="等候金额判断"/></field>
      </event-listener>
   </on>
    <on event="end">
      <event-listener class="ex.order.LogListener">
        <field name="msg"><string value="金额判断完毕"/></field>
      </event-listener>
    </on>
      <handler class="ex.order.OrderMoneyEvaluation"/>
      <transition name="needGMAduit" to="GMAduit" g="-65,-17"/>
      <transition name="通过" to="end" g="-41,-17"/>
   </decision>
  
   <state g="255,121,92,52" name="GMAduit">
        <on event="start">
     <event-listener class="ex.order.LogListener">
        <field name="msg"><string value="等候GM审核"/></field>
      </event-listener>
   </on>
    <on event="end">
      <event-listener class="ex.order.LogListener">
        <field name="msg"><string value="GM审核完毕"/></field>
      </event-listener>
    </on>
      <transition name="GM同意" to="end" g="428,149:-41,-17"/>
      <transition name="GM驳回" to="cancel1" g="-65,-17"/>
   </state>

   <end-cancel name="cancel1" g="130,122,48,48">
     <on event="start">
    <event-listener class="ex.order.LogListener">
      <field name="msg"><string value="有一个定单被驳回"/></field>
    </event-listener>
  </on>
   </end-cancel>
 
    <end g="404,27,80,40" name="end">
   <on event="start">
    <event-listener class="ex.order.LogListener">
      <field name="msg"><string value="有一个定单批准通过"/></field>
    </event-listener>
  </on>
  </end>
</process>

三、写java

1、在HelloJBPM的基础上改出一个OrderDemo,代码如下

package ex.order;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.IdentityService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;

import ex.HelloJBPM4;
import ex.HibernateUtil;

public class OrderDemo {

 
 protected final Log log = LogFactory.getLog(getClass());
   protected static ProcessEngine processEngine = null;

   protected static RepositoryService repositoryService;
   protected static ExecutionService executionService;
   protected static ManagementService managementService;
   protected static TaskService taskService;
   protected static HistoryService historyService;
   protected static IdentityService identityService;
   protected String deploymentId;
   protected synchronized void initialize() {
      if (processEngine==null) {

        String jbpmTestCfgType = System.getProperty("jbpm.test.cfg.type");
        log.debug(jbpmTestCfgType);
        Configuration configuration = new Configuration(jbpmTestCfgType);

        String jbpmTestCfgResource = System.getProperty("jbpm.test.cfg.resource");
        log.debug("jbpmTestCfgResource-->"+jbpmTestCfgResource);
        if (jbpmTestCfgResource!=null) {
          configuration.setResource(jbpmTestCfgResource);
        }

        processEngine = configuration.buildProcessEngine();
       
        log.debug("using ProcessEngine "+System.identityHashCode(processEngine));

        repositoryService = processEngine.get(RepositoryService.class);
        executionService = processEngine.getExecutionService();
        historyService = processEngine.getHistoryService();
        managementService = processEngine.getManagementService();
        taskService = processEngine.getTaskService();
        identityService = processEngine.getIdentityService();
      }
   }
   private void doOrder(){
      }
   private void deploy(){
    deploymentId = repositoryService.createDeployment()
         .addResourceFromClasspath("ex/order/order.jpdl.xml")
         .deploy();
   }
  
   private void doJob(){
 //   doOrder();
 //   if(1>0)return;
    initialize();
    deploy();
    OrderUI ui=new OrderUI();
    String answer="";
    String orderno="003";
    Map<String, Object> variables = new HashMap<String, Object>();
    variables.put("orderno",orderno);
     
   
    ProcessInstance processInstance = executionService.startProcessInstanceByKey("orderAudit",variables);
    log.debug("after start");
      Execution executionSuperAudit = processInstance.findActiveExecutionIn("superAudit");
      String executionId = executionSuperAudit.getId();
      answer=ui.getAnswer();
      if("yes".equals(answer))
       answer="主管同意";
      else
       answer="主管驳回";
      processInstance=executionService.signalExecutionById(executionId,answer);    
      log.debug("after superAudit");
     
     
          Execution executionGMAudit = processInstance.findActiveExecutionIn("GMAduit");
      executionId = executionGMAudit.getId();
      answer=ui.getAnswer();
      if("yes".equals(answer))
       answer="GM同意";
      else
       answer="GM驳回";
      processInstance=executionService.signalExecutionById(executionId,answer);
     
      repositoryService.deleteDeploymentCascade(deploymentId);
   }
  public static void main(String arg[]){
   OrderDemo ex=new OrderDemo();
   ex.doJob();
  
  }

}

其实doOrder()那个方法没什么用。。。。可以去掉

四、其它一些java类

package ex.order;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.api.listener.EventListener;
import org.jbpm.api.listener.EventListenerExecution;


public class LogListener implements EventListener {
 
 protected final Log log = LogFactory.getLog(getClass());
  private static final long serialVersionUID = 1L;
 
  // value gets injected from process definition
  String msg;
 
  public void notify(EventListenerExecution execution) {
    List<String> logs = (List<String>) execution.getVariable("logs");
    if (logs==null) {
      logs = new ArrayList<String>();
      execution.setVariable("logs", logs);
    }
    log.debug(msg);
    logs.add(msg);
  
    execution.setVariable("logs", logs);
  }
}


package ex.order;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;

public class OrderMoneyEvaluation implements DecisionHandler {
 protected final Log log = LogFactory.getLog(getClass());
 
  public String decide(OpenExecution execution) {
   log.debug("I was called");
  
   OrderDetail od =new OrderDetail();
   od.setQuantity(100f);
   od.setPrice(10.1f);
  
  log.debug("order no:-->"+ execution.getVariable("orderno"));
    if (od.getQuantity()*od.getPrice()>1000) {
      return "needGMAduit";
    }
    else
     return "通过";
  }
}

package ex.order;

public class OrderUI {
 public String getAnswer(){
  return "yes";
 }
}

五、执行后,可以在console里,看到如下结果:

15:54:36[DEBUG]LogListener.java->notify(26)  - 有一个定单提请主管审核
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
15:54:36[DEBUG]LogListener.java->notify(26)  - 等候主管审核
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
15:54:36[DEBUG]OrderDemo.java->doJob(115)  - after start
15:54:36[DEBUG]LogListener.java->notify(26)  - 主管审核完毕
15:54:36[DEBUG]LogListener.java->notify(26)  - 等候金额判断
15:54:36[DEBUG]OrderMoneyEvaluation.java->decide(13)  - I was called
15:54:36[DEBUG]OrderMoneyEvaluation.java->decide(19)  - order no:-->003
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
2009-7-19 15:54:36 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
信息: handling transient entity in delete processing
15:54:36[DEBUG]LogListener.java->notify(26)  - 金额判断完毕
15:54:36[DEBUG]LogListener.java->notify(26)  - 等候GM审核
15:54:36[DEBUG]OrderDemo.java->doJob(124)  - after superAudit
15:54:36[DEBUG]LogListener.java->notify(26)  - GM审核完毕
15:54:36[DEBUG]LogListener.java->notify(26)  - 有一个定单批准通过

研究一下,就可以知道,如何执行一个jbpm的流程了。

OrderUI的表示需要与用户交互,取得同意/驳回。

五、下一步工作

如何组织机构建模?

如何 订单与流程结合。

组织机构模型与流程结合。

 

分享到:
评论

相关推荐

    JBPM4用户说明文档

    ### jBPM4 用户说明文档知识点详解 #### 一、jBPM简介 - **定义与背景**:jBPM,...无论是对于需要快速构建复杂业务流程的企业还是希望深入研究工作流技术的开发者来说,jBPM4都是一个值得深入了解和使用的优秀工具。

    jbpm配置心得体会(结合各种数据库)

    在这个示例中,用户可以通过登录并创建一个新的 Web 销售订单来体验完整的流程。此示例展示了如何使用 jBPM 来管理订单的创建、审核以及估价等步骤。通过观察右侧流程图的变化,可以看到订单处理的状态变化。 #### ...

    JBPM文档(详解)

    JBPM,全称Java Business Process Management,是一个开源的业务流程管理系统,致力于简化和自动化企业的流程性业务应用。它采用Apache License,为开发者提供了灵活且可扩展的流程业务处理框架。jBPM的核心优势在于...

    JBPM的文档说明详细

    JBPM不仅提供了一个强大的引擎来执行业务流程定义,还提供了图形化的流程设计工具,方便开发者直观地设计复杂的业务流程。 #### 二、环境准备 为了能够顺利地使用JBPM进行业务流程的设计和执行,我们需要做一些...

    JBPM案例详解(全)

    JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于管理和执行业务流程。它提供了强大的流程定义、执行、监控和优化功能,广泛应用于企业的业务流程自动化中。本案例详解将深入探讨JBPM...

    jbpm

    总之,jbpm是一个强大的业务流程管理工具,通过合理地利用它,企业可以构建出高效、灵活的业务流程,提升业务运作效率。同时,学习和掌握jbpm,对于提升IT专业人士在企业架构设计和流程自动化方面的技能具有重要意义...

    jBPM开发入门指南.doc

    在这个示例中,有一个预定义的用户订单流程,包括下单、审核和估价等步骤,使用的是内置的数据库。 登录系统(例如使用cookie monster用户),你可以创建新的订单,查看流程的执行情况。这个例子展示了jBPM如何简化...

    jbpm5+ssh集成

    jbPM5是一个开源的工作流和业务流程管理系统,它提供了一整套工具,包括设计、部署、执行和监控工作流程。SSH则是Java Web开发的三大组件,Spring负责依赖注入和事务管理,Struts处理MVC架构,Hibernate则作为ORM...

    JBPM5.4 工作流例子

    JBPM(JBoss Business Process Management)是一个开源的工作流管理系统,主要用于处理业务流程的自动化。JBPM5.4是该系统的一个版本,它在之前的基础上进行了优化和增强,提供了更为灵活和强大的流程管理功能。在本...

    jbpm-bpel.pdf

    - 定义BPEL流程:创建一个简单的BPEL文档,描述流程的基本结构。 - 创建/获取WSDL接口文档:定义服务接口的规范。 - 部署流程定义:将BPEL文档和相关资源打包并部署到JBoss AS。 - 构建WSEE应用客户端:编写...

    jBPM开发入门指南

    通过运行start.bat启动JBoss服务,然后访问http://localhost:8080/jbpm/,可以看到一个用户订单流程的示例,该流程包括下单、审核和估价等步骤。这个示例使用内置数据库,并且预定义了名为cookie monster的用户,...

    jpbm学习资料个人总结

    总的来说,jBPM是一个强大的工作流管理工具,特别适合那些需要实现动态业务流程的企业或项目。通过理解jBPM的核心概念,如流程定义、任务管理和事件处理,开发者可以构建出适应业务需求的灵活流程系统。同时,持续...

    工作流开发jbpm工作流开发jbpm

    此示例展示了从创建订单、审核到估价的完整流程,可以帮助开发者快速了解jBPM的功能和操作方式。 #### 五、jBPM基本概念 1. **流程定义** jBPM使用XML格式定义流程,支持多种控制结构,如顺序执行、分支、循环等...

    JBPM安装、部署、开发手册

    JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于设计、执行和管理业务流程。本手册主要涵盖了JBPM的安装、部署、实例和开发过程。 1. **JBPM安装** - **JDK**:首先确保安装了JDK...

    Java实现工作流所需jar包

    JBPM(Java Business Process Management)是一个开源的工作流管理系统,广泛应用于各种业务场景,如人力资源管理、订单处理、审批流程等。本主题将详细介绍在Java环境中使用JBPM进行工作流开发所需的关键jar包及其...

Global site tag (gtag.js) - Google Analytics