完整工作流JBPM項目實戰全過程教程3

  完整工作流JBPM項目實戰全過程教程3----項目後續DIY

   接着上一篇。

從數據庫中表的定義不難看出,每篇文章的審批將新建一個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!

發佈了16 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章