一個簡單的會簽實例
http://www.aygfsteel.com/jbpm/archive/2007/10/15/153036.html一個簡單的會簽實例
作者:tomkoo
以下例子中 采用了jbpm console 的幾個實例用戶
項目提交人 : ernie .
主管審批 : bert
會簽 : ernie , bert , grover
老板審批 : grover
正常流程: 項目金額 >= 500W RMB
提交項目 --> 主管審批 --> 會簽 --> 老板審批 --> 審批通過(結束)
正常流程: 項目金額 < 500W RMB
提交項目 --> 主管審批 --> 會簽 --> 審批通過(結束)
其中主管審批, 會簽, 老板審批 , 不通過, 全部退回給項目提交人修改.
會簽中: 所有人全通過, 則通過. 任何一人不通過, 停止其他會簽任務.退回給提交人.
流程定義如下:
1. <?xml version="1.0" encoding="UTF-8"?>
2.
3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1"
4. name="tc_prj_approval">
5.
6. <swimlane name="initiator" />
7.
8. <!項目提交人 >
9. <swimlane name="requester">
10. <assignment expression="user(ernie)" />
11. </swimlane>
12.
13. <! 主管 >
14. <swimlane name="chief">
15. <assignment expression="user(bert)" />
16. </swimlane>
17.
18. <!老板 >
19. <swimlane name="boss">
20. <assignment expression="user(grover)" />
21. </swimlane>
22.
23. <!會簽人 >
24. <swimlane name="cosinger">
25. <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">
26. </assignment>
27. </swimlane>
28. <start-state name="start">
29. <task name="tc_prj_newprj" swimlane="initiator"></task>
30. <transition name="to_submit" to="tc_prj_submit"></transition>
31. </start-state>
32. <task-node name="tc_prj_submit">
33. <task name="tc_prj_submit"></task>
34. <transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition>
35. </task-node>
36. <task-node name="tc_prj_chiefapprove">
37. <task name="tc_prj_chiefapprove"></task>
38. <transition name="approve" to="tc_prj_countersign"></transition>
39. <transition name="disapprove" to="tc_prj_submit"></transition>
40. </task-node>
41. <task-node name="tc_prj_countersign" signal="last-wait"
42. create-tasks="false">
43. <task name="tc_prj_countersign">
44. <event type="task-end">
45. <action
46. class="net.chenj.jbpm.sample.TaskEndCountersign">
47. </action>
48. </event>
49.
50. </task>
51.
52. <event type="node-enter">
53. <action name="createInstance"
54. class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">
55. </action>
56. </event>
57.
58. <transition name="approve" to="amount_decision"></transition>
59. <transition name="disapprove" to="tc_prj_submit"></transition>
60. </task-node>
61. <decision name="amount_decision">
62. <transition name="to_bossapprove" to="tc_prj_bossapprove"></transition>
63. <transition name="to_end" to="end1"></transition>
64. </decision>
65. <task-node name="tc_prj_bossapprove">
66. <task name="tc_prj_bossapprove"></task>
67. <transition name="approve" to="end1"></transition>
68. <transition name="disapprove" to="tc_prj_submit">
69. <condition>#{amount >= 500}</condition>
70. </transition>
71. </task-node>
72. <end-state name="end1"></end-state>
73. </process-definition>
74.
會簽swimlane class
1. package net.chenj.jbpm.sample;
2.
3. import org.jbpm.graph.exe.*;
4. import org.jbpm.taskmgmt.def.*;
5. import org.jbpm.taskmgmt.exe.Assignable;
6.
7. public class CosingerAssiHandler implements AssignmentHandler {
8.
9. private static final long serialVersionUID = 1L;
10.
11. public void assign(Assignable assignable, ExecutionContext executionContext) {
12. // 從數據庫或者ldap 讀取會簽人設置
13. String[] a = { "ernie", "bert", "grover" };
14. assignable.setPooledActors(a);
15. }
16.
17. }
18.
創建會簽任務實現類
1. package net.chenj.jbpm.sample;
2.
3. import org.jbpm.graph.def.ActionHandler;
4. import org.jbpm.graph.exe.ExecutionContext;
5. import org.jbpm.graph.exe.Token;
6. import org.jbpm.graph.node.TaskNode;
7. import org.jbpm.taskmgmt.def.Task;
8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
9.
10. public class CreateTaskInstanceCountersign implements ActionHandler {
11.
12. private static final long serialVersionUID = 1L;
13.
14. public void execute(ExecutionContext executionContext) throws Exception {
15.
16. Token token = executionContext.getToken();
17. TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
18. TaskNode taskNode = (TaskNode) executionContext.getNode();
19. Task task = taskNode.getTask("tc_prj_countersign");
20. // 從數據庫或者ldap 讀取會簽人設置創建任務實例
21. tmi.createTaskInstance(task, token).setActorId("ernie");
22. tmi.createTaskInstance(task, token).setActorId("bert");
23. tmi.createTaskInstance(task, token).setActorId("grover");
24.
25. }
26.
27. }
結束不通過時結束其他會簽任務實現
1. package net.chenj.jbpm.sample;
2.
3. import java.util.Collection;
4. import java.util.Iterator;
5. import org.jbpm.graph.def.ActionHandler;
6. import org.jbpm.graph.exe.ExecutionContext;
7. import org.jbpm.taskmgmt.exe.TaskInstance;
8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
9.
10. public class TaskEndCountersign implements ActionHandler {
11.
12. private static final long serialVersionUID = 1L;
13.
14. public void execute(ExecutionContext executionContext) throws Exception {
15.
16.
17. boolean isDisapprove = Boolean.valueOf((String) executionContext
18. .getVariable("isDisapprove"));
19. // 如果有一個任務實例拒絕通過則結束除當前任務實例外其他任務實例
20. if (isDisapprove) {
21. TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
22. TaskInstance ti = executionContext.getTaskInstance();
23. final String actorId = ti.getActorId();
24. Collection c = tmi.getSignallingTasks(executionContext);
25. for (Iterator it = c.iterator(); it.hasNext();) {
26. TaskInstance task = (TaskInstance) it.next();
27. if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {
28. task.end("disapprove");
29. }
30. }
31. }
32.
33. }
34.
35. }
task-node"主管會計復核"則是我們需要進行會簽的節點。在這個節點我們設置了幾個重要的屬性:
- 1) signal="last-wait",這個屬性決定了該節點將在完成該節點內的所有Task的TaskInstance以后才會進入下一個節點。)
- 2) create-tasks="false",這個屬性決定了在進入該節點的時候,不會自動為該節點的任何Task創建任何的TaskInstance。因為我們需要根據會簽的人員來自己創建TaskInstance。
進入流程節點的時候,執行ActionHandler類com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用來動態生成TaskInstance。
2. <eventtype="task-end">
Task結束的時候調用com.sky.plugin.jbpm.def.ConuntersignActionHandler進行會簽處理。判斷會簽路徑來決定會簽的執行和走向。
http://linliangyi2007.javaeye.com/blog/176356
http://tomkoo.javaeye.com/blog/24690
http://cache.baidu.com/c?m=9d78d513d99405f804ab837e7c509c244e4380127a84914c68d5e35f93124c403731bfed3365505adc9f3a2143b8482ff7ed7337721420c0c39bcc198af0c53f2fff76692f01c41c539504afca4322ca2b&p=9174c64ad1830ac308e2957e1e55&user=baidu
posted on 2008-09-18 11:57 gdufo 閱讀(746) 評論(0) 編輯 收藏 所屬分類: workflow