工作中要用到JBPM写工作流,自习的时候找到一篇较好的文章,贴过来共享下!
=========================================================================
在某一公司中,部门员工要休假的话需要部门主管的批准。如果休假天数大于10天的话,在部门主管的同意后,还必须上级主管批准。如果是部门主管要休假只要上级主管批准即可。在休假被批准之前,申请人可以撤销休假申请。
每个员工还有多少天休假必须管理起来,在员工提交休假申请时要检查申请天数是否超过可用天数。申请批准后,要在可用天数里减去申请天数。每次休假申请结束之后,不管通过未通过或是否取消,都必须记录下来。主管在批复申请之后,系统要将批复结果Email给申请人。对于大于10天的申请,如果部门主管已批准同意而上级主管还未批准,这时申请人撤销申请后,系统应发Email通知部门主管申请已撤销。
processdefinition.xml如下:
<?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="BeginRequest"/>
</start-state>
<fork name="BeginRequest">
<transition to="RequesterCancel"/>
<transition to="IsChief"/>
</fork>
<decision name="IsChief">
<delegation class="kellerdu.jbpm.delegation.ChiefDecision"/>
<transition name="BossApprove" to="BossApprove"/>
<transition name="ChiefApprove" to="ChiefApprove"/>
</decision>
<state name="RequesterCancel">
<assignment swimlane="requester"/>
<transition name="cancel" to="Decided">
<action>
<!-- 将请假的状态改变为“取消”-->
<delegation class="kellerdu.jbpm.action.RequestCancel"/>
</action>
</transition>
</state>
<state name="ChiefApprove">
<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="BossApprove">
<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="BossApprove"/>
<transition name="notNeed" to="Decided"/>
</decision>
<join name="Decided">
<description>有一个先到达即进行父Token</description>
<delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>
<transition to="DoSomething"/>
</join>
<decision name="DoSomething">
<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的身份。
package kellerdu.jbpm.delegation;
import org.jbpm.delegation.*;
import kellerdu.jbpm.LogsFactory;
import org.apache.commons.logging.Log;
public class BossSwimlane implements AssignmentHandler {
public BossSwimlane() {
}
/**
* 当前的状态有哪个actor来具体负责处理,选择是老板的actor来处理。
*
* 如果王林是老板,那么他请假可以用他的名称来开始一个请假流程,当他检查他需要批示的
* 请假时,使用actorId=boss来找出所有的批示。这时selectActor返回的值就是一个常量“boss”
*
*
* @param assignmentContext AssignmentContext
* @return String
* @todo Implement this org.jbpm.delegation.AssignmentHandler method
*/
public String selectActor(AssignmentContext assignmentContext) {
Log log = LogsFactory.getLogInstance(this.getClass());
log.info("任务分配给老板");
return "boss";
}
}
ackage kellerdu.jbpm.delegation;
import org.jbpm.delegation.*;
import kellerdu.jbpm.LogsFactory;
import org.apache.commons.logging.Log;
public class ChiefSwimlane implements AssignmentHandler {
public ChiefSwimlane() {
}
/**
* selectActor
* @see BossSwimlane
*
* @param assignmentContext AssignmentContext
* @return String
* @todo Implement this org.jbpm.delegation.AssignmentHandler method
*/
public String selectActor(AssignmentContext assignmentContext) {
Log log = LogsFactory.getLogInstance(this.getClass());
log.info("任务分配给上级主管");
return "chief";
}
}
(二)Decision
package kellerdu.jbpm.delegation;
import org.jbpm.delegation.*;
import kellerdu.jbpm.LogsFactory;
import org.apache.commons.logging.Log;
import kellerdu.jbpm.Constants;
public class ChiefDecision implements DecisionHandler {
public ChiefDecision() {
}
/**
* 判断是否需要主管批准,决定下一个要进行的transition
*
* @param executionContext ExecutionContext
* @return String
* @todo Implement this org.jbpm.delegation.DecisionHandler method
*/
public String decide(ExecutionContext executionContext) {
Log log=LogsFactory.getLogInstance(this.getClass());
String ac=(String)executionContext.getVariable(Constants.USER_NAME);
if(ac!=null&&(ac.equals("dali")||ac.equals("wang"))){
log.info(ac+"需要老板批准!");
return "BossApprove";
}else{
log.info(ac+"需要先经主管批准");
return "ChiefApprove";
}
}
}
=======================
(三)fork
package kellerdu.jbpm.delegation;
import org.jbpm.*;
import org.jbpm.delegation.*;
import org.jbpm.model.execution.*;
import java.util.*;
public class DecidedJoin implements JoinHandler {
public DecidedJoin() {
}
/**
* fork,只要一个分支到达,即可进行下一步操作,同时取消其它同时进行的分支。
* 这里就是用户如果取消,请假就取消。如果用户请假批准,则用户不能取消。
*
* @param forkContext ForkContext
* @throws ExecutionException
* @todo Implement this org.jbpm.delegation.ForkHandler method
*/
public void join(JoinContext joinContext) throws ExecutionException {
Iterator it=joinContext.getConcurrentTokens().values().iterator();
Token arrivingToken = joinContext.getToken();
while(it.hasNext()){
Token to=(Token)it.next();
if(to.getId().equals(arrivingToken.getId())){
//取消其它执行的Token
joinContext.getExecutionService().cancelToken(to.getId());
}
}
// reactivate the parent token.
joinContext.reactivateToken( arrivingToken.getParent() );
}
}
(一) 开始一个请假流程
//user是请假人的actorId
ExecutionService es=JbpmServiceFactory.getInstance().openExecutionService(user);
HashMap vs=new HashMap();
//一些参数
vs.put(Constants.REQUEST_STATUS,String.valueOf(0));
vs.put(Constants.REQUEST_RETURN_INFO,"No info!");
vs.put(Constants.USER_NAME,EncodeTransfer.toISO(user));
vs.put(Constants.REQUEST_DAYS,String.valueOf(rea.getDays()));
try {
//开启请假流程
es.startProcessInstance(Constants.WORK_NAME, vs);
log.info("["+user+"]"+"申请假期开始!请假"+rea.getDays()+"天!");
return am.findForward("main");
} catch (ExecutionException ex) {
ex.printStackTrace();
log.error("请假进程无法开始!");
return am.findForward("error");
}finally{
es.close();
}
(二)当前执行任务
对于部门经理或者老板,找到要处理的请假。
String actorId = (String) req.getSession().getAttribute(Constants.USER);
if(actorId.equals("wang")){
actorId="boss";
}else if(actorId.equals("bigli")){
actorId="chief";
}
// get the execution service
ExecutionService executionService = JbpmServiceFactory.getInstance().
openExecutionService(actorId);
// get the tasklist from jbpm for user
List tasks = new ArrayList();
// add the jbpm tasks
tasks.addAll(executionService.getTaskList(actorId));
// put the tasklist into the form
mf.setTasks(tasks);
// get the tasklist from jbpm for user
List definitions = new ArrayList();
// add the jbpm definitions
definitions.addAll(executionService.getLatestDefinitions());
// put the tasklist into the form
mf.setRequests(definitions);
// close the execution service
executionService.close();
req.getSession().setAttribute("mainForm",mf);
log.debug("任务: " + tasks);
log.debug("当前可以执行的请求: " + definitions);
(三)处理请假
String actorId = (String) reqrest.getSession().getAttribute(Constants.
USER);
Long tokenId=new Long(req.getParameter("tokenId"));
// get the execution service
ExecutionService executionService = JbpmServiceFactory.getInstance().
openExecutionService(actorId);
Map hm=executionService.getVariables(tokenId);//变量
String act=req.getParameter("action");//进行转换的transition
executionService.endOfState(tokenId,hm,act);
executionService.close();
相关推荐
**JBPM工作流详解** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了一整套解决方案,用于设计、执行和管理业务流程。在本示例中,我们将深入探讨如何利用JBPM实现销售批复这一具体...
jbpm工作流请假案例是一个基于jbpm流程引擎的实践项目,旨在帮助用户理解并学习如何在实际场景中应用工作流技术。jbpm是一款开源的工作流管理系统,它提供了强大的流程建模、执行和监控功能,广泛应用于企业级业务...
**jbpm工作流简介** jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了一整套解决方案,用于设计、执行和管理业务流程。jbpm不仅支持BPMN(Business Process Model and Notation)...
【李腾飞JBPM工作流引擎代码test01到test04】是一系列关于使用JBPM工作流引擎进行程序开发的示例代码。...每个test文件代表一个逐步进阶的实践案例,对于学习和理解JBPM工作流引擎的运作机制非常有帮助。
**JBPM工作流经典例子详解** JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于管理和执行业务流程。它提供了强大的流程建模、执行和监控功能,且基于Java,具有良好的跨平台性和可...
在`jbpm工作流引擎介绍.ppt`文件中,可能包含了对这些步骤的详细图解,展示了每个步骤如何在jbpm中建模,以及流程实例在不同阶段的变化。此外,还可能涵盖了如何配置工作流规则、如何定义和分配任务,以及如何使用...
在这个"Jbpm工作流引擎使用例子"中,我们可以深入学习如何利用Jbpm进行流程的创建、流程实例的启动与管理,以及如何将其与Java、Hibernate等技术结合使用。以下是关于这些知识点的详细讲解: 1. **Jbpm工作流引擎**...
jBPM4作为该系列的一个版本,提供了一套完整的流程管理和执行框架,允许开发者构建灵活的工作流应用,以实现业务流程自动化。本指南由胡奇编写,旨在为开发者提供一个全面的参考,帮助他们快速学习和掌握使用jBPM4...
JBPM工作流开发指南v10-20070706.doc 是一份详细的学习文档,主要针对那些想要深入...总之,这份JBPM工作流开发指南为初学者提供了全面的入门指导,帮助他们理解并掌握JBPM工作流引擎的使用,实现高效的企业流程管理。
JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...
JBPM(Java Business Process Model)是Red Hat提供的一款开源的工作流引擎,用于在Java应用程序中实现业务流程管理(BPM)。它基于规范化的BPMN 2.0标准,支持图形化流程设计与复杂的业务逻辑处理。JBPM允许开发者...
**JBPM5.4工作流例子详解** JBPM(JBoss Business Process Management)是一个开源的工作流管理系统,主要用于处理业务流程的自动化。JBPM5.4是该系统的一个版本,它在之前的基础上进行了优化和增强,提供了更为...
通过这份学习资料大全,开发者可以全面了解jbpm工作流的原理、功能和实践技巧,进一步提升在业务流程管理领域的专业技能。同时,"美好渭南网"提供的链接可能提供了更多的在线资源和社区支持,对于学习和交流非常有...
JBPM(Java Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的解决方案,用于设计、执行和管理业务流程。JBPM4.4是JBPM的一个重要版本,它在4.x系列中引入了诸多改进和新特性,使得业务...
JBPM工作流开发指南是一份详尽的文档,旨在引导开发者深入理解...总的来说,JBPM工作流开发指南是学习和掌握JBPM技术的宝贵资源,对于想要在企业级应用中实现自动化工作流管理的开发者来说,是一份不可或缺的学习材料。