读书人

一个容易的会签实例

发布时间: 2012-11-01 11:11:32 作者: rapoo

一个简单的会签实例
一个简单的会签实例

作者:tomkoo
以下例子中 采用了jbpm console 的几个实例用户

项目提交人 : ernie .

主管审批 : bert

会签 : ernie , bert , grover

老板审批 : grover

?

正常流程: 项目金额 >= 500W RMB

提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)

正常流程: 项目金额 < 500W RMB

提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)

其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.

会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.

流程定义如下:

?

  1. <?xml?version="1.0"?encoding="UTF-8"?>?? ??
  2. <process-definition?xmlns="urn:jbpm.org:jpdl-3.1"?? ????name="tc_prj_approval">??
  3. ?? ????<swimlane?name="initiator"?/>??
  4. ?? ????<!项目提交人?>??
  5. ????<swimlane?name="requester">?? ????????<assignment?expression="user(ernie)"?/>??
  6. ????</swimlane>?? ??
  7. ????<!?主管?>?? ????<swimlane?name="chief">??
  8. ????????<assignment?expression="user(bert)"?/>?? ????</swimlane>??
  9. ?? ????<!老板?>??
  10. ????<swimlane?name="boss">?? ????????<assignment?expression="user(grover)"?/>??
  11. ????</swimlane>?? ??
  12. ????<!会签人?>?? ????<swimlane?name="cosinger">??
  13. ????????<assignment?class="net.chenj.jbpm.sample.CosingerAssiHandler">?? ????????</assignment>??
  14. ????</swimlane>?? ????<start-state?name="start">??
  15. ????????<task?name="tc_prj_newprj"?swimlane="initiator"></task>?? ????????<transition?name="to_submit"?to="tc_prj_submit"></transition>??
  16. ????</start-state>?? ????<task-node?name="tc_prj_submit">??
  17. ????????<task?name="tc_prj_submit"></task>?? ????????<transition?name="to_chiefapprove"?to="tc_prj_chiefapprove"></transition>??
  18. ????</task-node>?? ????<task-node?name="tc_prj_chiefapprove">??
  19. ????????<task?name="tc_prj_chiefapprove"></task>?? ????????<transition?name="approve"?to="tc_prj_countersign"></transition>??
  20. ????????<transition?name="disapprove"?to="tc_prj_submit"></transition>?? ????</task-node>??
  21. ????<task-node?name="tc_prj_countersign"?signal="last-wait"?? ????????create-tasks="false">??
  22. ????????<task?name="tc_prj_countersign">?? ????????????<event?type="task-end">??
  23. ????????????????<action?? ????????????????????class="net.chenj.jbpm.sample.TaskEndCountersign">??
  24. ????????????????</action>?? ????????????</event>??
  25. ?? ????????</task>??
  26. ?? ????????<event?type="node-enter">??
  27. ????????????<action?name="createInstance"?? ????????????????class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">??
  28. ????????????</action>?? ????????</event>??
  29. ?? ????????<transition?name="approve"?to="amount_decision"></transition>??
  30. ????????<transition?name="disapprove"?to="tc_prj_submit"></transition>?? ????</task-node>??
  31. ????<decision?name="amount_decision">?? ????????<transition?name="to_bossapprove"?to="tc_prj_bossapprove"></transition>??
  32. ????????<transition?name="to_end"?to="end1"></transition>?? ????</decision>??
  33. ????<task-node?name="tc_prj_bossapprove">?? ????????<task?name="tc_prj_bossapprove"></task>??
  34. ????????<transition?name="approve"?to="end1"></transition>?? ????????<transition?name="disapprove"?to="tc_prj_submit">??
  35. ????????????<condition>#{amount?>=?500}</condition>?? ????????</transition>??
  36. ????</task-node>?? ????<end-state?name="end1"></end-state>??
  37. </process-definition>?? ??

<script></script>

?

会签swimlane class

?

  1. package?net.chenj.jbpm.sample; ?? ??
  2. import?org.jbpm.graph.exe.*; ?? import?org.jbpm.taskmgmt.def.*; ??
  3. import?org.jbpm.taskmgmt.exe.Assignable; ?? ??
  4. public?class?CosingerAssiHandler?implements?AssignmentHandler?{ ?? ??
  5. ????private?static?final?long?serialVersionUID?=?1L; ?? ??
  6. ????public?void?assign(Assignable?assignable,?ExecutionContext?executionContext)?{ ?? ????????//?从数据库或者ldap?读取会签人设置 ??
  7. ????????String[]?a?=?{?"ernie",?"bert",?"grover"?}; ?? ????????assignable.setPooledActors(a); ??
  8. ????} ?? ??
  9. } ?? ??

<script></script>
创建会签任务实现类

?

?

  1. package?net.chenj.jbpm.sample; ?? ??
  2. import?org.jbpm.graph.def.ActionHandler; ?? import?org.jbpm.graph.exe.ExecutionContext; ??
  3. import?org.jbpm.graph.exe.Token; ?? import?org.jbpm.graph.node.TaskNode; ??
  4. import?org.jbpm.taskmgmt.def.Task; ?? import?org.jbpm.taskmgmt.exe.TaskMgmtInstance; ??
  5. ?? public?class?CreateTaskInstanceCountersign?implements?ActionHandler?{ ??
  6. ?? ????private?static?final?long?serialVersionUID?=?1L; ??
  7. ?? ????public?void?execute(ExecutionContext?executionContext)?throws?Exception?{ ??
  8. ?? ????????Token?token?=?executionContext.getToken(); ??
  9. ????????TaskMgmtInstance?tmi?=?executionContext.getTaskMgmtInstance(); ?? ????????TaskNode?taskNode?=?(TaskNode)?executionContext.getNode(); ??
  10. ????????Task?task?=?taskNode.getTask("tc_prj_countersign"); ?? ????????//?从数据库或者ldap?读取会签人设置创建任务实例 ??
  11. ????????tmi.createTaskInstance(task,?token).setActorId("ernie"); ?? ????????tmi.createTaskInstance(task,?token).setActorId("bert"); ??
  12. ????????tmi.createTaskInstance(task,?token).setActorId("grover"); ?? ??
  13. ????} ?? ??
  14. } ??

<script></script>

?

结束不通过时结束其他会签任务实现

  1. package?net.chenj.jbpm.sample; ?? ??
  2. import?java.util.Collection; ?? import?java.util.Iterator; ??
  3. import?org.jbpm.graph.def.ActionHandler; ?? import?org.jbpm.graph.exe.ExecutionContext; ??
  4. import?org.jbpm.taskmgmt.exe.TaskInstance; ?? import?org.jbpm.taskmgmt.exe.TaskMgmtInstance; ??
  5. ?? public?class?TaskEndCountersign?implements?ActionHandler?{ ??
  6. ?? ????private?static?final?long?serialVersionUID?=?1L; ??
  7. ?? ????public?void?execute(ExecutionContext?executionContext)?throws?Exception?{ ??
  8. ?? ???? ??
  9. ????????boolean?isDisapprove?=?Boolean.valueOf((String)?executionContext ?? ????????????????.getVariable("isDisapprove")); ??
  10. ????????//?如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例 ?? ????????if?(isDisapprove)?{ ??
  11. ????????????TaskMgmtInstance?tmi?=?executionContext.getTaskMgmtInstance(); ?? ????????????TaskInstance?ti?=?executionContext.getTaskInstance(); ??
  12. ????????????final?String?actorId?=?ti.getActorId(); ?? ????????????Collection?c?=?tmi.getSignallingTasks(executionContext); ??
  13. ????????????for?(Iterator?it?=?c.iterator();?it.hasNext();)?{ ?? ????????????????TaskInstance?task?=?(TaskInstance)?it.next(); ??
  14. ????????????????if?(!(actorId.equals(task.getActorId()))?&&?(!task.hasEnded()))?{ ?? ????????????????????task.end("disapprove"); ??
  15. ????????????????} ?? ????????????} ??
  16. ????????} ?? ??
  17. ????} ?? ??
  18. } ??

读书人网 >编程

热点推荐