一个 Jbpm 员工请假流程的实例
作者:吴大愚
Email:dywu_xa@sina.com
2006-10-26
适用于 jbpm3.1 版本
1. 概述
此实例包括的是一个员工请假审批的流程实例,和流程相关的代码以及相应的测试代
码。此流程在 Eclipse3.1.2 ,JBoss-IDE 1.6 环境下测试通过。
说明,这篇文章说使用的流程实例是,学习《一个 JBPM 工作流管理示例》文章中的
流程而来。原文中的流程实例不是 jbpm3.1 版本,不能适用于 jbpm3.1。本人将其改写,并
加 入 自 己 的 设 计 和 实 现 。 原 文 地 址 为 http://blogger.org.cn/blog/more.asp?
name=lhwork&id=16137。可以对照学习。
2. 流程说明
假设应用背景如下:
在某一公司中,部门员工要休假的话需要部门主管的批准。如果休假天数大于 10 天的
话,在部门主管的同意后,还必须老板批准。如果是部门主管要休假只要老板批准即可。
在休假被批准之前,申请人可以撤销休假申请。
每次休假申请结束之后,不管通过未通过或是否取消,都必须记录下来。主管在批复
申请之后,系统要将批复结果 Email 给申请人。对于大于 10 天的申请,如果部门主管已批
准同意而上级主管还未批准,这时申请人撤销申请后,系统应发 Email 通知部门主管申请
已撤销。•
3. 流程定义
3.1.原文件
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.1" name="MyRequest">
<start-state name="SS_Request">
<transition name="" to="TN_WriteRequest"></transition>
</start-state>
<task-node name="TN_WriteRequest">
<task name="Task_WriteRequest">
<controller>
<variable name="dayCount" access="read,write,required"></variable>
</controller>
<assignment class="com.myrequest.task.WriteRequestAssignmentHandler"></assignment>
</task>
<transition name="Tr_WriteLeave" to="Fork_request">
<action name="Ac_WriteLeave"
class="com.myrequest.action.WriteLeaveActionHandler"></action>
</transition>
</task-node>
<fork name="Fork_request">
<transition name="Tr_Cancel" to="TN_RequesterCancel"></transition>
<transition name="Tr_Request" to="Deci_IsChiefHere">
<action name="Ac_GetChiefState"
class="com.myrequest.action.GetChiefStateActionHandler"></action>
</transition>
</fork>
<decision name="Deci_IsChiefHere">
<handler class="com.myrequest.decision.IsChiefHereDecisionHandler"/>
<transition name="Tr_Chief" to="TN_ChiefDecide"></transition>
<transition name="Tr_Boss" to="TN_BossDecide"></transition>
</decision>
<task-node name="TN_RequesterCancel">
<task name="Task_CancelRequest">
<assignment
class="com.myrequest.task.CancelRequestAssignmentHandler"></assignment>
</task>
<transition name="Tr_RequestCancel" to="Join_Request">
<action name="Ac_RequestCancel"
class="com.myrequest.action.RequestCancelActionHandler"></action>
</transition>
</task-node>
<task-node name="TN_ChiefDecide">
<task name="Task_ChiefDecide">
<assignment class="com.myrequest.task.ChiefDecideAssignmentHandler"></assignment>
</task>
<transition name="Tr_ChiefApprove" to="Deci_NeedBossDecide">
<action name="Ac_ChiefApprove"
class="com.myrequest.action.ChiefApproveActionHandler"></action>
</transition>
<transition name="Tr_ChiefNotApprove" to="Join_Request">
<action name="Ac_ChiefNotApprove"
class="com.myrequest.action.ChiefNotApproveActionHandler"></action>
</transition>
</task-node>
<join name="Join_Request">
<transition name="Tr_Join" to="Deci_DoSomething"></transition>
</join>
<decision name="Deci_NeedBossDecide">
<handler class="com.myrequest.decision.NeedBossDecideDecisionHandler"/>
<transition name="Tr_Need" to="TN_BossDecide"></transition>
<transition name="Tr_NotNeed" to="Join_Request">
<action name="Ac_NotNeed"
class="com.myrequest.action.NotNeedActionHandler"></action>
</transition>
</decision>
<task-node name="TN_BossDecide">
<task name="Task_BossDecide">
<assignment class="com.myrequest.task.BossDecideAssignmentHandler"></assignment>
</task>
<transition name="Tr_BossApprove" to="Join_Request">
<action name="Ac_BossApprove"
class="com.myrequest.action.BossApproveActionHandler"></action>
</transition>
<transition name="Tr_BossNotApprove" to="Join_Request">
<action name="Ac_BossNotApprove"
class="com.myrequest.action.BossNotApproveActionHandler"></action>
</transition>
</task-node>
<decision name="Deci_DoSomething">
<handler class="com.myrequest.decision.DoSomethingDecisionHandler"/>
<transition name="Tr_Approve" to="ES_Finished">
<action name="Ac_Approve"
class="com.myrequest.action.ApproveActionHandler"></action>
</transition>
<transition name="Tr_NotApprove" to="ES_Finished">
<action name="Ac_NotApprove"
class="com.myrequest.action.NotApproveActionHandler"></action>
</transition>
<transition name="Tr_Cancel" to="ES_Finished">
<action name="Ac_Cancel" class="com.myrequest.action.CancelActionHandler"></action>
</transition>
</decision>
<end-state name="ES_Finished">
<event type="node-enter">
<action name="Ac_Finished"
class="com.myrequest.action.FinishedActionHandler"></action>
</event>
</end-state>
</process-definition>
3.2.流程图片
3.3.说明
3.3.1. 命名规则
start-state 的定义为 SS_
end-state 的定义为 ES_
task-node 的定义为 TN_
fork 的定义为 Fork_
join 的定义为 Join_
task 的定义为 Task_
transition 的定义为 Tr_
action 的定义为 Ac_