`

jbpm请假工作流

阅读更多

请假流程(备用)

工作中要用到JBPM写工作流,自习的时候找到一篇较好的文章,贴过来共享下!

示例:
在某一公司中,部门员工要休假的话需要部门主管的批准。如果休假天数大于10天的话,在部门主管的同意后,还必须上级主管批准。如果是部门主管要休假只要上级主管批准即可。在休假被批准之前,申请人可以撤销休假申请。
每个员工还有多少天休假必须管理起来,在员工提交休假申请时要检查申请天数是否超过可用天数。申请批准后,要在可用天数里减去申请天数。每次休假申请结束之后,不管通过未通过或是否取消,都必须记录下来。主管在批复申请之后,系统要将批复结果Email给申请人。对于大于10天的申请,如果部门主管已批准同意而上级主管还未批准,这时申请人撤销申请后,系统应发Email通知部门主管申请已撤销。 
  processdefinition.xml如下:

xml 代码
  1. <!----><?xml version="1.0" encoding="UTF-8"?>
    <!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Keller (zju) -->
    <!DOCTYPE process-definition PUBLIC
        "-//jBpm/jBpm Mapping DTD 2.0//EN"
        "http://jbpm.org/dtd/processdefinition-2.0.dtd">
    <process-definition name="RequestLeave">
     <swimlane name="requester">
      <description>申请者</description>
     </swimlane>
     <swimlane name="chief">
      <description>部门主管</description>
      <delegation class="kellerdu.jbpm.delegation.ChiefSwimlane" />
     </swimlane>
     <swimlane name="boss">
      <description>上级主管</description>
      <delegation class="kellerdu.jbpm.delegation.BossSwimlane" />
     </swimlane>
     <start-state name="request" swimlane="requester">
      <transition to="Begin Request" />
     </start-state>
     <fork name="Begin Request">
      <transition to="Requester Cancel" />
      <transition to="IsChief" />
     </fork>
     <decision name="IsChief">
      <delegation class="kellerdu.jbpm.delegation.ChiefDecision" />
      <transition name="Boss Approve" to="Boss Approve" />
      <transition name="Chief Approve" to="Chief Approve" />
     </decision>
     <state name="Requester Cancel">
      <assignment swimlane="requester" />
      <transition name="cancel" to="Decided">
       <action>
        <!-- 将请假的状态改变为“取消”-->
        <delegation class="kellerdu.jbpm.action.RequestCancel" />
       </action>
      </transition>
     </state>
     <state name="Chief Approve">
      <assignment swimlane="chief" />
      <transition name="approve" to="NeedBossApprove">
       <action>
        <!-- 将请假的状态改变为“主管批准”-->
        <delegation class="kellerdu.jbpm.action.ChiefApprove" />
       </action>
      </transition>
      <transition name="disapprove" to="Decided">
       <action>
        <!-- 将请假的状态改变为“主管否决”-->
        <delegation
         class="kellerdu.jbpm.action.ChiefDisapprove" />
       </action>
      </transition>
     </state>
     <state name="Boss Approve">
      <assignment swimlane="boss" />
      <transition name="approve" to="Decided">
       <action>
        <!-- 将请假的状态改变为“老板批准”-->
        <delegation class="kellerdu.jbpm.action.BossApprove" />
       </action>
      </transition>
      <transition name="disapprove" to="Decided">
       <action>
        <!-- 将请假的状态改变为“老板否决”-->
        <delegation class="kellerdu.jbpm.action.BossDisapprove" />
       </action>
      </transition>
     </state>
     <decision name="NeedBossApprove">
      <!-- 请假天数大于10天的要老板批准  -->
      <delegation
       class="kellerdu.jbpm.delegation.NeedBossApproveDecision" />
      <transition name="need" to="Boss Approve" />
      <transition name="notNeed" to="Decided" />
     </decision>
     <join name="Decided">
      <description>有一个先到达即进行父Token</description>
      <delegation class="kellerdu.jbpm.delegation.DecidedJoin" />
      <transition to="Do Something" />
     </join>
     <decision name="Do Something">
      <description>
       根据请求的状态决定。
       (1)“主管或者老板批准”-‘approve’:修改员工休假的总天数,设定发给用户E-Mail的信息。
       (2)“主管或者老板否决”-“disapprove”:设定发给用户E-Mail的信息。
       (3)“撤销”-"cancel"-设定发给用户E-Mail的信息。如果主管批准,要发给主管消息说明已经撤销。
      </description>
      <delegation
       class="kellerdu.jbpm.delegation.DoSomethingDecision" />
      <transition name="disapprove" to="Finished">
       <action>
        <delegation class="kellerdu.jbpm.action.Disapprove" />
       </action>
      </transition>
      <transition name="approve" to="Finished">
       <action>
        <delegation class="kellerdu.jbpm.action.Approve" />
       </action>
      </transition>
      <transition name="cancel" to="Finished">
       <action>
        <delegation class="kellerdu.jbpm.action.Cancel" />
       </action>
      </transition>
     </decision>
     <end-state name="Finished" />
     <action event-type="process-end">
      <!-- 发送E-Mail消息给申请者,记录请假日志 -->
      <delegation class="kellerdu.jbpm.action.ProcessEndAction" />
     </action>
    </process-definition>

 

Action指明的是当前状态要执行的一些额外的操作,如记录log、发邮件等。
(1)Swimline的delegation要做的就是判别当前Actor的身份。

java 代码
  1. package kellerdu.jbpm.delegation;   
  2.   
  3. import org.jbpm.delegation.*;   
  4. import kellerdu.jbpm.LogsFactory;   
  5. import org.apache.commons.logging.Log;   
  6.   
  7. public class BossSwimlane implements AssignmentHandler {   
  8.     public BossSwimlane() {   
  9.     }   
  10.   
  11.     /**  
  12.      * 当前的状态有哪个actor来具体负责处理,选择是老板的actor来处理。  
  13.      *  
  14.      * 如果王林是老板,那么他请假可以用他的名称来开始一个请假流程,当他检查他需要批示的  
  15.      * 请假时,使用actorId=boss来找出所有的批示。这时selectActor返回的值就是一个常量“boss”  
  16.      *  
  17.      *  
  18.      * @param assignmentContext AssignmentContext  
  19.      * @return String  
  20.      * @todo Implement this org.jbpm.delegation.AssignmentHandler method  
  21.      */  
  22.     public String selectActor(AssignmentContext assignmentContext) {   
  23.         Log log = LogsFactory.getLogInstance(this.getClass());   
  24.         log.info("任务分配给老板");   
  25.         return "boss";   
  26.     }   
  27. }   
  28. ========================================   
  29. ackage kellerdu.jbpm.delegation;   
  30.   
  31. import org.jbpm.delegation.*;   
  32. import kellerdu.jbpm.LogsFactory;   
  33. import org.apache.commons.logging.Log;   
  34.   
  35. public class ChiefSwimlane implements AssignmentHandler {   
  36.     public ChiefSwimlane() {   
  37.     }   
  38.   
  39.     /**  
  40.      * selectActor  
  41.      * @see BossSwimlane  
  42.      *  
  43.      * @param assignmentContext AssignmentContext  
  44.      * @return String  
  45.      * @todo Implement this org.jbpm.delegation.AssignmentHandler method  
  46.      */  
  47.     public String selectActor(AssignmentContext assignmentContext) {   
  48.        Log log = LogsFactory.getLogInstance(this.getClass());   
  49.         log.info("任务分配给上级主管");   
  50.        return "chief";   
  51.     }   
  52. }   

(二)Decision

java 代码
  1. package kellerdu.jbpm.delegation;   
  2.   
  3. import org.jbpm.delegation.*;   
  4. import kellerdu.jbpm.LogsFactory;   
  5. import org.apache.commons.logging.Log;   
  6. import kellerdu.jbpm.Constants;   
  7.   
  8. public class ChiefDecision implements DecisionHandler {   
  9.     public ChiefDecision() {   
  10.     }   
  11.   
  12.     /**  
  13.      * 判断是否需要主管批准,决定下一个要进行的transition  
  14.      *  
  15.      * @param executionContext ExecutionContext  
  16.      * @return String  
  17.      * @todo Implement this org.jbpm.delegation.DecisionHandler method  
  18.      */  
  19.     public String decide(ExecutionContext executionContext) {   
  20.         Log log=LogsFactory.getLogInstance(this.getClass());   
  21.         String ac=(String)executionContext.getVariable(Constants.USER_NAME);   
  22.         if(ac!=null&&(ac.equals("dali")||ac.equals("wang"))){   
  23.             log.info(ac+"需要老板批准!");   
  24.             return "BossApprove";   
  25.         }else{   
  26.             log.info(ac+"需要先经主管批准");   
  27.             return "ChiefApprove";   
  28.         }   
  29.     }   
  30. }   
  31.   

=======================
(三)fork

java 代码
  1. package kellerdu.jbpm.delegation;   
  2.   
  3. import org.jbpm.*;   
  4. import org.jbpm.delegation.*;   
  5. import org.jbpm.model.execution.*;   
  6. import java.util.*;   
  7.   
  8. public class DecidedJoin implements JoinHandler {   
  9.     public DecidedJoin() {   
  10.     }   
  11.   
  12.     /**  
  13.      * fork,只要一个分支到达,即可进行下一步操作,同时取消其它同时进行的分支。  
  14.      * 这里就是用户如果取消,请假就取消。如果用户请假批准,则用户不能取消。  
  15.      *  
  16.      * @param forkContext ForkContext  
  17.      * @throws ExecutionException  
  18.      * @todo Implement this org.jbpm.delegation.ForkHandler method  
  19.      */  
  20.     public void join(JoinContext joinContext) throws ExecutionException {   
  21.         Iterator it=joinContext.getConcurrentTokens().values().iterator();   
  22.         Token arrivingToken = joinContext.getToken();   
  23.         while(it.hasNext()){   
  24.             Token to=(Token)it.next();   
  25.             if(to.getId().equals(arrivingToken.getId())){   
  26.                 //取消其它执行的Token   
  27.                 joinContext.getExecutionService().cancelToken(to.getId());   
  28.             }   
  29.         }   
  30.          // reactivate the parent token.   
  31.           joinContext.reactivateToken( arrivingToken.getParent() );   
  32.     }   
  33. }   
  34.     

(一)  开始一个请假流程

java 代码
  1. //user是请假人的actorId   
  2.       ExecutionService es=JbpmServiceFactory.getInstance().openExecutionService(user);   
  3.        HashMap vs=new HashMap();   
  4.       //一些参数   
  5.        vs.put(Constants.REQUEST_STATUS,String.valueOf(0));   
  6.        vs.put(Constants.REQUEST_RETURN_INFO,"No info!");   
  7.        vs.put(Constants.USER_NAME,EncodeTransfer.toISO(user));   
  8.        vs.put(Constants.REQUEST_DAYS,String.valueOf(rea.getDays()));   
  9.        try {   
  10.           //开启请假流程   
  11.            es.startProcessInstance(Constants.WORK_NAME, vs);   
  12.            log.info("["+user+"]"+"申请假期开始!请假"+rea.getDays()+"天!");   
  13.            return am.findForward("main");   
  14.        } catch (ExecutionException ex) {   
  15.            ex.printStackTrace();   
  16.            log.error("请假进程无法开始!");   
  17.            return am.findForward("error");   
  18.        }finally{   
  19.            es.close();   
  20.        }   

(二)当前执行任务
    对于部门经理或者老板,找到要处理的请假。

java 代码
  1. String actorId = (String) req.getSession().getAttribute(Constants.USER);   
  2.           if(actorId.equals("wang")){   
  3.               actorId="boss";   
  4.           }else if(actorId.equals("bigli")){   
  5.               actorId="chief";   
  6.           }   
  7.           // get the execution service   
  8.           ExecutionService executionService = JbpmServiceFactory.getInstance().   
  9.                                               openExecutionService(actorId);   
  10.   
  11.           // get the tasklist from jbpm for user   
  12.           List tasks = new ArrayList();   
  13.           // add the jbpm tasks   
  14.           tasks.addAll(executionService.getTaskList(actorId));   
  15.           // put the tasklist into the form   
  16.           mf.setTasks(tasks);   
  17.           // get the tasklist from jbpm for user   
  18.           List definitions = new ArrayList();   
  19.           // add the jbpm definitions   
  20.           definitions.addAll(executionService.getLatestDefinitions());   
  21.           // put the tasklist into the form   
  22.           mf.setRequests(definitions);   
  23.           // close the execution service   
  24.           executionService.close();   
  25.           req.getSession().setAttribute("mainForm",mf);   
  26.           log.debug("任务: " + tasks);   
  27.           log.debug("当前可以执行的请求: " + definitions);   

(三)处理请假

java 代码
  1. String actorId = (String) reqrest.getSession().getAttribute(Constants.   
  2.                     USER);   
  3.             Long tokenId=new Long(req.getParameter("tokenId"));   
  4.             // get the execution service   
  5.             ExecutionService executionService = JbpmServiceFactory.getInstance().   
  6.                                                 openExecutionService(actorId);   
  7.             Map hm=executionService.getVariables(tokenId);//变量   
  8.             String act=req.getParameter("action");//进行转换的transition   
  9.             executionService.endOfState(tokenId,hm,act);   
  10.             executionService.close();   
分享到:
评论

相关推荐

    jBPM请假工作流,很全的任务列表

    在"jBPM请假工作流"中,我们可以看到一个全面的任务列表,这个列表涵盖了请假流程中的各个阶段,使得整个请假过程变得规范、高效。 1. **我要请假**: 这是流程的起点,员工通过jBPM发起请假申请。用户在系统中填写...

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...

    JBPM4工作流介绍.pptx

    JBPM4是一款强大的工作流管理系统,专为JavaEE开发人员设计,旨在解决复杂流程管理和变更需求。本课程适合对JavaEE开发有经验的技术人员以及流程分析师。JBPM4提供了广泛的应用场景,涵盖了关键业务流程,如订单处理...

    基于JBPM工作流的OA办公系统

    **基于JBPM工作流的OA办公系统** JBPM(Java Business Process Management)是Talend公司推出的一款开源的工作流管理系统,主要用于实现业务流程自动化。它提供了全面的工作流解决方案,包括流程设计、执行、监控和...

    JBPM4.3工作流请假流程例子

    【JBPM4.3工作流请假流程例子】是基于Myeclipse8.5M和JBPM4.3的集成应用,旨在演示如何构建一个实际的请假流程。在本文中,我们将深入探讨JBPM(Java Business Process Management)的核心概念,以及如何在实际开发...

    jbpm4.4+s2sh请假流程例子

    【jbpm4.4+s2sh请假流程例子】是一个典型的结合了jbpm4.4工作流引擎和Struts2、Spring、Hibernate(S2SH)框架的实战项目,旨在演示如何在企业级应用中实现一个完整的请假流程。在这个例子中,jbpm4.4作为流程管理的...

    jbpm4请假实例代码

    【jbpm4请假实例代码】是一个基于jbpm4工作流引擎的示例应用,它用于演示如何在实际项目中实现员工请假流程的自动化管理。jbpm4是一个开源的工作流管理系统,它提供了强大的业务流程建模、执行和管理功能,使得...

    jbpm工作流请假案例

    jbpm工作流请假案例是一个基于jbpm流程引擎的实践项目,旨在帮助用户理解并学习如何在实际场景中应用工作流技术。jbpm是一款开源的工作流管理系统,它提供了强大的流程建模、执行和监控功能,广泛应用于企业级业务...

    工作流(jbpm)请假流程实例

    jbpm请假流程实例通常包括以下几个关键步骤: 1. **流程设计**:首先,开发者会使用jbpm提供的流程建模工具(例如:jBPM Designer)来定义请假流程。这涉及到创建各种活动(如:申请、审批、驳回等)、决策节点...

    jBPM4.4请假流程JavaWeb完全版

    jBPM(Java Business Process Management)是一个开源的工作流和业务流程管理框架,它允许开发者在Java应用程序中实现复杂的业务流程。jBPM4.4是该框架的一个较早版本,但仍然具有广泛的适用性和学习价值。在这个...

    jbpm4.4 请假工作流 实例

    学习jbpm 的最佳例子,例子是用orcal10g 做为数据库的项目实例。本项目对jbpm 用户组 的重写 webroot 下 db 文件夹下有 自己用户角色,关系表的 sql 语句,和基本数据 可以帮助测试,流程跟踪的展示!

    jbpm 请假流程定义发布项目

    总结,jbpm请假流程定义发布项目是一个实用的学习和实践案例,涵盖了jbpm的基本使用、数据库集成、流程定义以及流程的监控与管理。通过对该项目的研究,开发者不仅可以了解jbpm的工作原理,还能掌握如何在实际环境中...

    请假工作流JBPM整合SSH2完整实例

    【标题】"请假工作流JBPM整合SSH2完整实例"涉及了多个IT领域的关键技术,主要集中在企业级应用开发上。JBPM(Java Business Process Management)是用于业务流程管理的开源框架,而SSH2则指的是Spring、Struts和...

    JBPM5.4 工作流例子

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

    jbpm 请假示例 简易 修改版

    【jbpm 请假示例 简易 修改版】是一个基于jbpm工作流引擎的简单应用实例,旨在演示如何在企业级环境中实现一个请假流程。jbpm是一个开源的工作流管理系统,它提供了完整的业务流程自动化解决方案,包括流程设计、...

    jbpm-2.0-beta1.zip_java 工作流引擎_jbpm_jbpm-demo_工作流_工作流引擎

    jbpm是一款开源的工作流管理系统,主要面向Java开发者,它提供了强大的流程定义和执行能力,帮助企业或组织实现自动化的工作流程。jbpm-2.0-beta1是该系统的早期版本,其核心功能包括工作流引擎、流程建模工具以及一...

    基于JBPM的请假系统

    【基于JBPM的请假系统】是一个使用JBPM工作流引擎,结合MySQL数据库,并集成了Spring、Struts2和Hibernate(SSH框架)的项目实例。这个系统主要是为了实现企业内部员工的请假申请流程自动化,提高工作效率,减少人为...

    jBPM4工作流应用开发指南

    《jBPM4工作流应用开发指南》是一本深度探讨工作流管理系统的专业书籍,尤其聚焦于jBPM4这一开源工作流引擎的使用与开发。工作流技术,作为企业管理信息化的重要工具,能够自动化和规范业务流程,提高企业效率。本书...

    jBPM4.4工作流开发指南.docx

    jBPM4.4工作流开发指南 jBPM4.4是一种流行的工作流引擎,它提供了一个强大且灵活的工作流管理系统。本指南将详细介绍jBPM4.4的安装、部署、使用、开发和原理等方面的知识点。 一、开发环境搭建 要开发jBPM4.4工作...

Global site tag (gtag.js) - Google Analytics