每個(gè)員工還有多少天休假必須管理起來,在員工提交休假申請時(shí)要檢查申請?zhí)鞌?shù)是否超過可用天數(shù)。申請批準(zhǔn)后,要在可用天數(shù)里減去申請?zhí)鞌?shù)。每次休假申請結(jié)束之后,不管通過未通過或是否取消,都必須記錄下來。主管在批復(fù)申請之后,系統(tǒng)要將批復(fù)結(jié)果Email給申請人。對于大于10天的申請,如果部門主管已批準(zhǔn)同意而上級主管還未批準(zhǔn),這時(shí)申請人撤銷申請后,系統(tǒng)應(yīng)發(fā)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="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>
<!-- 將請假的狀態(tài)改變?yōu)?/span>“取消”-->
<delegation class="kellerdu.jbpm.action.RequestCancel"/>
</action>
</transition>
</state>
<state name="Chief Approve">
<assignment swimlane="chief"/>
<transition name="approve" to="NeedBossApprove">
<action>
<!-- 將請假的狀態(tài)改變?yōu)?/span>“主管批準(zhǔn)”-->
<delegation class="kellerdu.jbpm.action.ChiefApprove"/>
</action>
</transition>
<transition name="disapprove" to="Decided">
<action>
<!-- 將請假的狀態(tài)改變?yōu)?/span>“主管否決”-->
<delegation class="kellerdu.jbpm.action.ChiefDisapprove"/>
</action>
</transition>
</state>
<state name="Boss Approve">
<assignment swimlane="boss"/>
<transition name="approve" to="Decided">
<action>
<!-- 將請假的狀態(tài)改變?yōu)?/span>“老板批準(zhǔn)”-->
<delegation class="kellerdu.jbpm.action.BossApprove"/>
</action>
</transition>
<transition name="disapprove" to="Decided">
<action>
<!-- 將請假的狀態(tài)改變?yōu)?/span>“老板否決”-->
<delegation class="kellerdu.jbpm.action.BossDisapprove"/>
</action>
</transition>
</state>
<decision name="NeedBossApprove">
<!-- 請假天數(shù)大于10天的要老板批準(zhǔn) -->
<delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/>
<transition name="need" to="Boss Approve"/>
<transition name="notNeed" to="Decided"/>
</decision>
<join name="Decided">
<description>有一個(gè)先到達(dá)即進(jìn)行父Token</description>
<delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>
<transition to="Do Something"/>
</join>
<decision name="Do Something">
<description>
根據(jù)請求的狀態(tài)決定。
(1)“主管或者老板批準(zhǔn)”-‘approve’:修改員工休假的總天數(shù),設(shè)定發(fā)給用戶E-Mail的信息。
(2)“主管或者老板否決”-“disapprove”:設(shè)定發(fā)給用戶E-Mail的信息。
(3)“撤銷”-"cancel"-設(shè)定發(fā)給用戶E-Mail的信息。如果主管批準(zhǔn),要發(fā)給主管消息說明已經(jīng)撤銷。
</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">
<!-- 發(fā)送E-Mail消息給申請者,記錄請假日志 -->
<delegation class="kellerdu.jbpm.action.ProcessEndAction"/>
</action>
</process-definition>
jBPM,全稱是Java Business Process Management,是一種基于J2EE的輕量級工作流管理系統(tǒng)。jBPM是公開源代碼項(xiàng)目,它使用要遵循 Apache License。jBPM在
jBPM最大的特色就是它的商務(wù)邏輯定義沒有采用目前的一些規(guī)范,如WfMC´s XPDL, BPML, ebXML, BPEL4WS等,而是采用了它自己定義的Process defiJBoss jBPM nition language (jPdl)。jPdl認(rèn)為一個(gè)商務(wù)流程可以被看作是一個(gè)UML狀態(tài)圖。jPdl就是詳細(xì)定義了這個(gè)狀態(tài)圖的每個(gè)部分,如起始、結(jié)束狀態(tài),狀態(tài)之間的轉(zhuǎn)換等。
jBPM的另一個(gè)特色是它使用Hibernate來管理它的數(shù)據(jù)庫。Hibernate是目前Java領(lǐng)域最好的一種數(shù)據(jù)持久層解決方案。通過Hibernate,jBPM將數(shù)據(jù)的管理職能分離出去,自己專注于商務(wù)邏輯的處理。
1. JPDL的流程定義元素
1) 第一層:GraphElement
這個(gè)容易理解,因?yàn)樵诋嬃鞒潭x時(shí),每個(gè)拖拉的對象都是一個(gè)graph的元素。GraphElement有四個(gè)屬性:
(1)processDefine 表示當(dāng)前元素屬于哪個(gè)流程定義
(2)events 表示可以接收哪些event
(3)name 名字
(4)exceptionHandlers 異常處理類集合(List)
2) 第二層:node、processDefinition、Transition、Task
它們都繼承自GraphElement
(1)processDefinition表示流程定義(implements NodeCollection),它有下面的屬性:name、version、nodes、startState。nodes表示流程中所有的node,startState用于啟動流程時(shí)找到首節(jié)點(diǎn)。
(2)Transition表示轉(zhuǎn)移,它有三個(gè)屬性:from(Node),to(Node),supportedEventTypes表示支持的event類型
(3)node表示節(jié)點(diǎn),它有四個(gè)屬性:leaving transitions、arriving transitions、action、superState。
(4)Task 定義任務(wù)
3) 第三層:各種不同的node
它們都繼承自node。 Decision、EndState、Fork、Join、Merge、Milestone、 InterleaveEnd、InterleaveStart、ProcessState、State。
摘要: 1概述