接着上一篇。
從數據庫中表的定義不難看出,每篇文章的審批將新建一個JBPM流程實例來跟蹤。
文章的表article中,利用PiId來關聯一個流程實例,並且定義State字段來表示文章的當前狀態(編輯中,審批中,審批通過,nulll),定義AuditState字段來表示文章當前由何權限的人員來審批(一級審批,二級審批,三級審批,四級審批,當然還可以自定義權限)
下面就來演示如何自定義權限
首先在數據庫中插入自己定義的權限
insert into userduty(`Name`,`DutyType`,`DutyValue`)
values ('自定義流程權限1','自定義流程權限1','自定義流程權限1');
insert into userduty(`Name`,`DutyType`,`DutyValue`)
values ('自定義流程權限2','自定義流程權限2','自定義流程權限2');
insert into userduty(`Name`,`DutyType`,`DutyValue`)
values ('自定義流程權限3','自定義流程權限3','自定義流程權限3');
insert into userduty(`Name`,`DutyType`,`DutyValue`)
values ('自定義流程權限4','自定義流程權限4','自定義流程權限4');
insert into userduty(`Name`,`DutyType`,`DutyValue`)
values ('自定義流程權限5','自定義流程權限5','自定義流程權限5');
insert into userduty(`Name`,`DutyType`,`DutyValue`)
values ('自定義流程權限6','自定義流程權限6','自定義流程權限6');
然後就是插入自定義用戶(需要注意用戶與權限之間的關聯關係)
insert into user(DutyNo,`LoginName`,`Password`,`UserName`)
values (7,'zpchen1','zpchen1','zpchen1_自定義流程權限1');
insert into user(DutyNo,`LoginName`,`Password`,`UserName`)
values (8,'zpchen2','zpchen1','zpchen2_自定義流程權限2');
insert into user(DutyNo,`LoginName`,`Password`,`UserName`)
values (9,'zpchen3','zpchen3','zpchen3_自定義流程權限3');
insert into user(DutyNo,`LoginName`,`Password`,`UserName`)
values (10,'zpchen4','zpchen4','zpchen4_自定義流程權限4');
insert into user(DutyNo,`LoginName`,`Password`,`UserName`)
values (11,'zpchen5','zpchen15,'zpchen5_自定義流程權限5');
insert into user(DutyNo,`LoginName`,`Password`,`UserName`)
values (12,'zpchen6','zpchen6','zpchen6_自定義流程權限6');
(注意,如果直接copy上面的mysql語句,需要修改下藍色部分標記的DutyNo,與你自己機子上的值對應起來,上面爲我自己機子上數據的值)
OK,數據庫要做的變化就是這些了!
接着就是自定義流程定義文件了.藉助JBPM的Eclipse插件輕鬆實現之。
定義好的流程定義文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1"
name="zpchenProcess">
<start-state name="start">
<transition name="編輯我的任務" to="這個任務完
成"></transition>
</start-state>
<state name="這個任務完成">
<transition name="發佈任務" to="自定義流程權限1">
<action name="action"
class="c20.jbpm.action.PubActionHandler">
</action>
</transition>
</state>
<state name="自定義流程權限1">
<transition name="同意" to="自定義流程權限2">
<action name="action"
class="c20.jbpm.action.AuditYesActionHandler">
</action>
</transition>
<transition name="實在糟糕" to="這個任務完成">
<action name="action"
class="c20.jbpm.action.AuditNoActionHandler">
</action>
</transition>
</state>
<state name="自定義流程權限2">
<transition name="同意" to="自定義流程權限3">
<action name="action"
class="c20.jbpm.action.AuditYesActionHandler">
</action>
</transition>
<transition name="不太滿意" to="這個任務完成">
<action name="action"
class="c20.jbpm.action.AuditNoActionHandler">
</action>
</transition>
</state>
<state name="自定義流程權限3">
<transition name="同意" to="自定義流程權限4">
<action name="action"
class="c20.jbpm.action.AuditYesActionHandler">
</action>
</transition>
<transition name="重新編輯" to="這個任務完成">
<action name="action"
class="c20.jbpm.action.AuditNoActionHandler">
</action>
</transition>
</state>
<state name="自定義流程權限4">
<transition name="同意" to="自定義流程權限5">
<action name="action"
class="c20.jbpm.action.AuditYesActionHandler">
</action>
</transition>
<transition name="不同意" to="自定義流程權限2">
<action name="action"
class="c20.jbpm.action.AuditNoActionHandler">
</action>
</transition>
</state>
<state name="自定義流程權限5">
<transition name="同意" to="自定義流程權限6">
<action name="action"
class="c20.jbpm.action.AuditYesActionHandler">
</action>
</transition>
<transition name="繼續完善" to="自定義流程權限3">
<action name="action"
class="c20.jbpm.action.AuditNoActionHandler">
</action>
</transition>
</state>
<state name="自定義流程權限6">
<transition name="很好,同意發表" to="end1">
<action name="action"
class="c20.jbpm.action.AuditFinishYesActionHandler">
</action>
</transition>
<transition name="繼續完善" to="這個任務完成">
<action name="action"
class="c20.jbpm.action.AuditFinishNoActionHandler">
</action>
</transition>
</state>
<end-state name="end1"></end-state>
</process-definition>
從流程定義的文件中可以看出,流程的定義相當的靈活。
那麼,系統是怎麼將一個文章的審批過程按照這個流程定義來執行了?
本文開頭就指出了,article表中定義了AuditState字段來表示文章當前由何權限的人員
來審批,當流程在運作當中,利用JBPM的ActionHandler句柄來動態的改變文章的
AuditState狀態。然後當OA系統的用戶(這裏應該是具有文章審批等操作權限的用戶,
而非guest,或manager)登錄系統後,判斷該用戶的權限,如果該用戶的權限正好和
article表中AuditState相同時候,就將這些權限級別的文章展現給該登錄用戶審批。這
樣就達到了每篇文章的級級審批的過程了。
不過到這裏,你登錄管理員後可以發佈這個自定義流程,guest用戶也可以發佈文章了,
但是當你以自己定義的用戶zpchen1,zpchen2。。。。登錄後頁面會顯示不了審批文章
的菜單,
你可以查看下menu.jsp的代碼就會發現問題所在了,
找到如下代碼:
<%
}
//如果具有管理員權限
if(userSession != null && userSession.getDutyValue() != null &&
userSession.getDutyType().equals("審批員")){
%>
修改成
<%
}
//如果具有管理員權限
if(userSession != null && userSession.getDutyValue() != null &&
(userSession.getDutyType().equals("審批員")||userSession.getDutyType
().contains("自定義流程權限"))){
%>
OK,到這裏應用就完成了。
OVER!