资源描述
Jbpm4.0工作流的例子 借款申请 流程
关键字: jbpm4 例子 借款申请 流程 工作流
正在学习jbpm4, 于是就写了个例子
这个例子的流程就用借款申请的流程, 因为学jbpm3的时候对这个例子比较熟悉.
流程图如下:
流程定义:
Xml代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <process name="loan" xmlns="http://jbpm.org/4.0/jpdl">
3. <start g="172,-1,48,48" name="start1">
4. <transition g="-27,-6" name="发起借款" to="填写借款申请" />
5. </start>
6.
7. <task assignee="#{proposer}" g="260,63,109,56" name="填写借款申请">
8. <transition g="-28,-16" name="提交申请" to="部门经理审批" />
9. </task>
10.
11. <task assignee="manager" g="113,141,114,52" name="部门经理审批">
12. <transition g="61,167:-36,62" name="部门经理驳回" to="cancel" />
13. <transition g="-51,-8" name="部门经理审批通过" to="金额判断" />
14. </task>
15.
16. <decision expr="#{money>=5000?'>=5000元':'<5000元'}"
17. g="301,205,48,48" name="金额判断">
18. <transition g="-20,-2" name=">=5000元" to="总经理审批" />
19. <transition g="-18,-13" name="<5000元" to="财务拨款" />
20. </decision>
21.
22. <end g="190,407,48,48" name="end" />
23. <end-cancel g="37,374,48,48" name="cancel" />
24.
25. <task assignee="ceo" g="150,286,100,52" name="总经理审批">
26. <transition g="-41,-6" name="总经理审批通过" to="财务拨款" />
27. <transition g="-17,-12" name="总经理驳回" to="cancel" />
28. </task>
29.
30. <task assignee="finance" g="345,325,92,52" name="财务拨款">
31. <transition g="-26,-6" name="完成拨款" to="end" />
32. </task>
33. </process>
<?xml version="1.0" encoding="UTF-8"?>
<process name="loan" xmlns="http://jbpm.org/4.0/jpdl">
<start g="172,-1,48,48" name="start1">
<transition g="-27,-6" name="发起借款" to="填写借款申请" />
</start>
<task assignee="#{proposer}" g="260,63,109,56" name="填写借款申请">
<transition g="-28,-16" name="提交申请" to="部门经理审批" />
</task>
<task assignee="manager" g="113,141,114,52" name="部门经理审批">
<transition g="61,167:-36,62" name="部门经理驳回" to="cancel" />
<transition g="-51,-8" name="部门经理审批通过" to="金额判断" />
</task>
<decision expr="#{money>=5000?'>=5000元':'<5000元'}"
g="301,205,48,48" name="金额判断">
<transition g="-20,-2" name=">=5000元" to="总经理审批" />
<transition g="-18,-13" name="<5000元" to="财务拨款" />
</decision>
<end g="190,407,48,48" name="end" />
<end-cancel g="37,374,48,48" name="cancel" />
<task assignee="ceo" g="150,286,100,52" name="总经理审批">
<transition g="-41,-6" name="总经理审批通过" to="财务拨款" />
<transition g="-17,-12" name="总经理驳回" to="cancel" />
</task>
<task assignee="finance" g="345,325,92,52" name="财务拨款">
<transition g="-26,-6" name="完成拨款" to="end" />
</task>
</process>
测试代码:
Java代码
1. /**
2. * CopyRight (C) 2006-2009 yeyong
3. * @author yy
4. * @project JbpmExamples
5. * @version 1.0
6. * @mail yy629_86 at 163 dot com
7. * @date 2009-9-9 下午3:12:13
8. * @description
9. */
10. package loan;
11.
12. import java.util.HashMap;
13. import java.util.List;
14. import java.util.Map;
15.
16. import org.jbpm.api.ProcessInstance;
17. import org.jbpm.api.history.HistoryProcessInstance;
18. import org.jbpm.api.task.Task;
19. import org.jbpm.test.JbpmTestCase;
20.
21. /**
22. * @author yeyong
23. */
24. public class LoanTest extends JbpmTestCase {
25. String deploymentId;
26.
27. @Override
28. protected void setUp() throws Exception {
29. super.setUp();
30. deploymentId = repositoryService.createDeployment().addResourceFromClasspath("loan/loan.jpdl.xml")
31. .deploy();
32. }
33.
34. @Override
35. protected void tearDown() throws Exception {
36. repositoryService.deleteDeploymentCascade(deploymentId);
37. super.tearDown();
38. }
39.
40. /**
41. * 测试用例
42. * <p>
43. * 张三 申请4000元, 部门经理驳回
44. */
45. public void test4000ButManagerDisapprove() {
46. String curUser = "Zhang San";
47. ProcessInstance pi = startLoanProcess(curUser);
48. String piId = pi.getId();
49. filloutApplication(piId, curUser, 4000);
50.
51. curUser = "manager";
52. managerApprove(piId, curUser, false, "最近资金紧张,暂不同意."); // 部门经理不同意
53.
54. pi = executionService.findProcessInstanceById(piId);
55. assertNull(pi); // 流程结束
56.
57. HistoryProcessInstance hpi = getHistoryProcessInstanceByProcessInstanceId(piId);
58. assertEquals(hpi.getState(), "cancel"); // 流程结束状态是cancel , 取消
59. }
60.
61. /**
62. * 测试用例
63. * <p>
64. * 李四 申请4000元,部门经理同意
65. */
66. public void test4000AndManagerApprove() {
67. String curUser = "Li si";
68. ProcessInstance pi = startLoanProcess(curUser);
69. String piId = pi.getId();
70. filloutApplication(piId, curUser, 4000);
71.
72. curUser = "manager";
73. managerApprove(piId, curUser, true, "同意."); // 部门经理同意
74.
75. pi = executionService.findProcessInstanceById(piId);
76. assertNotNull(pi); // 流程未结束
77. assertNotNull(pi.findActiveExecutionIn("财务拨款")); // 财务拨款处于活动状态
78.
79. curUser = "finance";
80. earmark(piId, curUser, piId); // 拨款
81.
82. pi = executionService.findProcessInstanceById(piId);
83. assertNull(pi); //流程结束
84.
85. HistoryProcessInstance hpi = getHistoryProcessInstanceByProcessInstanceId(piId);
86. assertEquals(hpi.getState(), "ended"); // 流程结束状态是ended, 正常结束
87. }
88.
89. /**
90. * 测试用例
91. * <p>
92. * 王五 申请6000元,部门经理驳回
93. */
94. public void test6000ButManagerDisapprove() {
95. String curUser = "Wang Wu";
96. ProcessInstance pi = startLoanProcess(curUser);
97. String piId = pi.getId();
98. filloutApplication(piId, curUser, 6000);
99.
100. curUser = "manager";
101. managerApprove(piId, curUser, false, "最近资金紧张,暂不同意.");
102.
103. pi = executionService.findProcessInstanceById(piId);
104. assertNull(pi);
105.
106. HistoryProcessInstance hpi = getHistoryProcessInstanceByProcessInstanceId(piId);
107. assertEquals(hpi.getState(), "cancel");
108. }
109.
110. /**
111. * 测试用例
112. * <p>
113. * 赵六 申请6000元,部门经理同意,总经理驳回
114. */
115. public void test6000AndManagerApproveButCeoDisapprove() {
116. String curUser = "Zhao Liu";
117. ProcessInstance pi = startLoanProcess(curUser);
118. String piId = pi.getId();
119. filloutApplication(piId, curUser, 6000);
120.
121. curUser = "manager";
122. managerApprove(piId, curUser, true, "同意. manager");
123. pi = executionService.findProcessInstanceById(piId);
124. assertNotNull(pi);
125. assertNotNull(pi.findActiveExecutionIn("总经理审批"));
126.
127. curUser = "ceo";
128. ceoApprove(piId, curUser, false, "不同意.等资金周转过来再说吧");
129.
130. pi = executionService.findProcessInstanceById(piId);
131. assertNull(pi);
132.
133. HistoryProcessInstance hpi = getHistoryProcessInstanceByProcessInstanceId(piId);
134. assertEquals(hpi.getState(), "cancel");
135. }
136.
137. /**
138. * 测试用例
139. * <p>
140. * 孙七 申请6000元,部门经理同意,总经理也同意
141. */
142. public void test6000AndManagerApproveAdnCeoApprove() {
143. String curUser = "Sun Qi";
144. ProcessInstance pi = startLoanProcess(curUser);
145. String piId = pi.getId();
146. filloutApplication(piId, curUser, 6000);
147.
148. curUser = "manager";
149. managerApprove(piId, curUser, true, "同意. manager");
150. pi = executionService.findProcessInstanceById(piId);
151. assertNotNull(pi);
152. assertNotNull(pi.findActiveExecutionIn("总经理审批"));
153.
154. curUser = "ceo";
155. ceoApprove(piId, curUser, true, "同意. ceo");
156. pi = executionService.findProcessInstanceById(piId);
157.
158. assertNotNull(pi);
159. assertNotNull(pi.findActiveExecutionIn("财务拨款"));
160.
161. curUser = "finance";
162. earmark(piId, curUser, piId);
163. pi = executionService.findProcessInstanceById(piId);
164. assertNull(pi);
165.
166. HistoryProcessInstance hpi =
167. getHistoryProcessInstanceByProcessInstanceId(piId);
168. assertEquals(hpi.getState(), "ended");
169. }
170.
171. /**
172. * 用户发起借款申请
173. *
174. * @param userId
175. * @return
176. */
177. protected ProcessInstance startLoanProcess(String user) {
178. Map<String, Object> variables = new HashMap<String, Object>();
179. variables.put("proposer", user);
180. return executionService.startProcessInstanceByKey("loan", variables);
181. }
182.
183. /**
184. * 填写借款申请
185. *
186. * @param piId
187. * @param user
188. * @param money
189. */
190. protected void filloutApplication(String piId, String user, double money) {
191. List<Task> tasks = taskService.findPersonalTasks(user);
192. Task filloutTask = null;
193. for (Task task : tasks) {
194. if (task.getExecutionId().equals(piId)) {
195. filloutTask = task;
196. break;
197. }
198. }
199. assertNotNull(filloutTask);
200. Map<String, Object> variables = new HashMap<String, Object>();
201. variables.put("money", money);
202. executionService.setVariables(piId, variables);
203. taskSpleteTask(filloutTask.getId());
204. }
205.
206. /**
207. * 经理审批
208. *
209. * @param piId
210. * @param user
211. * @param isPass
212. * @param comment
213. */
214. protected void managerApprove(String piId, String user, boolean isPass, String comment) {
215. List<Task> tasks = taskService.findPersonalTasks(user);
216. Task approveTask = null;
217. for (Task task : tasks) {
218. if (task.getExecutionId().equals(piId)) {
219. approveTask = task;
220. break;
221. }
222. }
223. assertNotNull(approveTask);
224.
225. taskService.addTaskComment(approveTask.getId(), comment);
226. taskSpleteTask(approveTask.getId(),
227. isPass ? "部门经理审批通过" : "部门经理驳回");
228.
229. }
230.
231. /**
232. * 总经理审批
233. *
234. * @param piId
235. * @param user
236. * @param isPass
237. * @param comment
238. */
239. protected void ceoApprove(String piId, String user, boolean isPass, String comment) {
240. List<Task> tasks = taskService.findPersonalTasks(user);
241. Task approveTask = null;
242. for (Task task : tasks) {
243. if (task.getExecutionId().equals(piId)) {
244. approveTask = task;
245. break;
246. }
247. }
248. assertNotNull(approveTask);
249.
250. taskService.addTaskComment(approveTask.getId(), comment);
251. taskSpleteTask(approveTask.getId(),
252. isPass ? "总经理审批通过" : "总经理驳回");
253. }
254.
255. /**
256. * 拨款
257. *
258. * @param piId
259. * @param user
260. * @param isPass
261. * @param comment
262. */
263. /**
264. * @param piId
265. * @param user
266. * @param comment
267. */
268. protected void earmark(String piId, String user, String comment) {
269. List<Task> tasks = taskService.findPersonalTasks(user);
270. Task earmarkask = null;
271. for (Task task : tasks) {
272. if (task.getExecutionId().equals(piId)) {
273. earmarkask = task;
274. break;
275. }
276. }
277. assertNotNull(earmarkask);
278.
279. taskService.addTaskComment(earmarkask.getId(), comment);
280.
281. // HistoryProcessInstance hpi =
282. getHistoryProcessInstanceByProcessInstanceId(piId,"填写借款申请");
283.
284. String proposer =(String) executionService.getVariable(piId,"proposer");
285. taskSpleteTask(earmarkask.getId());
286.
287. // 通知借款申请人
288. System.err.println(">> to " + proposer +", 财务科已经给你拨款.");
289. }
290.
291. public HistoryProcessInstance
292. getHistoryProcessInstanceByProcessInstanceId(String piId) {
293. return historyService.createHistoryProcessInstanceQuery().
294. processInstanceId(piId).uniqueResult();
295. }
展开阅读全文