1.分析幾張歷史表,查詢某用戶涉及的所有已辦流程實例列表,通過對每個流程實例進行分析。
一種方法是通過jBPM HistoryService歷史服務進行操作(參照用戶手冊5.8. HistoryService歷史服務),
另一種方法是自己編寫HQL語句實現(xiàn)歷史表的查詢。
2.自己設計歷史記錄表,在需要記錄的節(jié)點使用event-listener進行監(jiān)聽,實現(xiàn)記錄。
這里以經(jīng)典的請假為例子。請假成功,人事可以入庫查詢。具體流程如下圖所示
leaveListener是一個事件監(jiān)聽,配置在app-service.xml中,方便leave.jpdl.xml進行調(diào)用
- <bean id="leaveListener" class="com.javaeye.oa.web.listener.LeaveListener" >
- <property name="leaveService" ref="leaveService"/>
- </bean>
- <bean id="leaveService" class="com.javaeye.oa.service.task.impl.LeaveServiceImpl">
- </bean>
- <?xml version="1.0" encoding="UTF-8"?>
-
- <process name="leave" xmlns="http://jbpm.org/4.3/jpdl">
<start g="201,14,48,48" name="開始"> <transition g="-42,-10" name="請假" to="填寫請假單"/> </start> <task assignee="#{applyName}" g="178,87,92,52" name="填寫請假單"> <transition g="-97,2" name="判斷是不是經(jīng)理" to="是不是經(jīng)理"/> </task> <decision expr="#{manager}" g="204,158,48,48" name="是不是經(jīng)理"> <transition g="-23,-11" name="否" to="經(jīng)理審核"/> <transition g="14,-11" name="是" to="老板審批"/> </decision> <task assignee="#{approvingOfficer}" g="103,252,92,52" name="經(jīng)理審核"> <transition g="150,450:10,-21" name="經(jīng)理批準" to="結束"> <event-listener expr="#{leaveListener}"> <field name="endMsg"> <string value="批準請假,人事入庫" /> </field> </event-listener> </transition> <transition g="-22,-22" name="請假天數(shù)>3" to="老板審批"/> <transition g="-61,-1" name="經(jīng)理不批準" to="終止"/> <transition g="149,114:-55,82" name="經(jīng)理駁回" to="填寫請假單"/> </task> <task assignee="#{approvingOfficer}" g="278,251,92,52" name="老板審批"> <transition g="326,450:-58,-24" name="老板批準" to="結束"> <event-listener expr="#{leaveListener}"> <field name="endMsg"> <string value="批準請假,人事入庫" /> </field> </event-listener> </transition> <transition g="7,0" name="老板不批準" to="終止"/> <transition g="323,114:13,61" name="老板駁回" to="填寫請假單"/> </task> <end g="219,429,48,48" name="結束" state="confirm"/> <end g="220,360,48,48" name="終止" state="dissent"/> </process> <?xml version="1.0" encoding="UTF-8"?><process name="leave" xmlns="http://jbpm.org/4.3/jpdl"><start g="201,14,48,48" name="開始"><transition g="-42,-10" name="請假" to="填寫請假單"/></start><task assignee="#{applyName}" g="178,87,92,52" name="填寫請假單"><transition g="-97,2" name="判斷是不是經(jīng)理" to="是不是經(jīng)理"/></task><decision expr="#{manager}" g="204,158,48,48" name="是不是經(jīng)理"><transition g="-23,-11" name="否" to="經(jīng)理審核"/><transition g="14,-11" name="是" to="老板審批"/></decision><task assignee="#{approvingOfficer}" g="103,252,92,52" name="經(jīng)理審核"><transition g="150,450:10,-21" name="經(jīng)理批準" to="結束"><event-listener expr="#{leaveListener}"><field name="endMsg"><string value="批準請假,人事入庫" /></field></event-listener></transition><transition g="-22,-22" name="請假天數(shù)>3" to="老板審批"/><transition g="-61,-1" name="經(jīng)理不批準" to="終止"/><transition g="149,114:-55,82" name="經(jīng)理駁回" to="填寫請假單"/></task><task assignee="#{approvingOfficer}" g="278,251,92,52" name="老板審批"><transition g="326,450:-58,-24" name="老板批準" to="結束"><event-listener expr="#{leaveListener}"><field name="endMsg"><string value="批準請假,人事入庫" /></field></event-listener></transition><transition g="7,0" name="老板不批準" to="終止"/><transition g="323,114:13,61" name="老板駁回" to="填寫請假單"/></task><end g="219,429,48,48" name="結束" state="confirm"/><end g="220,360,48,48" name="終止" state="dissent"/></process>
applyName、manager、approvingOfficer幾個變量在實際操作中進行設置
endMsg測試時候使用,實際應用中可以刪除
當經(jīng)理批準申請或老板批準申請的時候,事件響應,進行請假申請入庫。
Leavelistener.java代碼
- package com.javaeye.oa.web.listener;
-
- import org.jbpm.api.listener.EventListener;
- import org.jbpm.api.listener.EventListenerExecution;
-
- import com.javaeye.oa.entity.task.Leave;
- import com.javaeye.oa.service.task.LeaveService;
-
- public class LeaveListener implements EventListener {
-
- private static final long serialVersionUID = 7098294717133900660L;
- private String endMsg;//endMsg測試時候使用,實際應用中可以刪除
- private LeaveService leaveService;
-
- public void setEndMsg(String endMsg) {
- this.endMsg = endMsg;
- }
- //leaveService進行set注入
- public void setLeaveService(LeaveService leaveService) {
- this.leaveService = leaveService;
- }
-
- public void notify(EventListenerExecution execution) throws Exception {
-
- System.out.println("==============leaveListener:endMsg="+endMsg);
- String applyName = (String) execution.getVariable("applyName");
- String leaveDay = (String) execution.getVariable("leaveDay");
- String applyTime = (String) execution.getVariable("applyTime");
- String position = (String) execution.getVariable("position");
- String content = (String) execution.getVariable("content");
- String approvingOfficer = (String) execution.getVariable("approvingOfficer");
-
- Leave leave = new Leave();
- leave.setApplyName(applyName);
- leave.setApplyTime(applyTime);
- leave.setApprovingOfficer(approvingOfficer);
- leave.setContent(content);
- leave.setPosition(position);
- leave.setLeaveDay(leaveDay);
-
- leaveService.addLeave(leave);
- }
- }
package com.javaeye.oa.web.listener;import org.jbpm.api.listener.EventListener;import org.jbpm.api.listener.EventListenerExecution;import com.javaeye.oa.entity.task.Leave;import com.javaeye.oa.service.task.LeaveService;public class LeaveListener implements EventListener {private static final long serialVersionUID = 7098294717133900660L;private String endMsg;//endMsg測試時候使用,實際應用中可以刪除private LeaveService leaveService;public void setEndMsg(String endMsg) {this.endMsg = endMsg;}//leaveService進行set注入public void setLeaveService(LeaveService leaveService) {this.leaveService = leaveService;}public void notify(EventListenerExecution execution) throws Exception {System.out.println("==============leaveListener:endMsg="+endMsg);String applyName = (String) execution.getVariable("applyName");String leaveDay = (String) execution.getVariable("leaveDay");String applyTime = (String) execution.getVariable("applyTime");String position = (String) execution.getVariable("position");String content = (String) execution.getVariable("content");String approvingOfficer = (String) execution.getVariable("approvingOfficer");Leave leave = new Leave();leave.setApplyName(applyName);leave.setApplyTime(applyTime);leave.setApprovingOfficer(approvingOfficer);leave.setContent(content);leave.setPosition(position);leave.setLeaveDay(leaveDay);leaveService.addLeave(leave);}}
Leave.java代碼
- package com.javaeye.oa.entity.task;
-
- public class Leave implements java.io.Serializable {
-
- private static final long serialVersionUID = -3289821345085237147L;
- private Long id;
- private String applyName;
- private String leaveDay;
- private String position;
- private String applyTime;
- private String content;
- private String approvingOfficer;
-
- // Constructors
-
- /** default constructor */
- public Leave() {
- }
- ...
package com.javaeye.oa.entity.task;public class Leave implements java.io.Serializable {private static final long serialVersionUID = -3289821345085237147L;private Long id;private String applyName;private String leaveDay;private String position;private String applyTime;private String content;private String approvingOfficer;// Constructors/** default constructor */public Leave() {}...
當一切就緒,我們便開始進行實際操作。
--------------------------------------------------------------------------------------------------------
一。員工dylan點擊請假鏈接
- public String leave() {
-
- Map<String, Object> variables = new HashMap<String, Object>();
-
- variables.put("applyName", "dylan");
- ExecutionService executionService = processEngine.getExecutionService();
- ProcessInstance processInstance = executionService.startProcessInstanceByKey("leave",variables);
-
- if (processInstance.isActive("填寫請假單")) {
- url = "apply";
- }
- return url;
- }
二。dylan在請假頁面填寫請假申請單 - <%@page contentType="text/html;charset=UTF-8" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>填寫申請單</title> </head> <body> <form action="apply.action" method="POST"> <table width="300" border=1> <tr> <td><label>申請人</label></td> <td><input type="text" value="dylan" name="applyName"></td> </tr> <tr> <td><label>職位</label></td> <td><input type="text" value="員工" name="position"></td> </tr> <tr> <td><label>申請時間</label></td> <td><input type="text" value="2010-01-10" name="applyTime"></td> </tr> <tr> <td><label>請假天數(shù)</label></td> <td><input type="text" value="1" name="leaveDay"></td> </tr> <tr> <td><label>請假原因</label></td> <td><textarea name="content" rows=3 cols=200>病假</textarea></td> </tr> <tr> <td><input type="submit" value="申請"></td> <td><input type="reset" value="取消"></td> </tr> </table> </form> </body> </html> 三。dylan填寫完成,提交請假單
- public String apply() {
- Map<String,Object> variables = new HashMap<String,Object>();
String applyName = getRequest().getParameter("applyName"); String applyTime = getRequest().getParameter("applyTime"); String leaveDay = getRequest().getParameter("leaveDay"); String content = getRequest().getParameter("content"); String position = getRequest().getParameter("position"); variables.put("applyName", applyName); variables.put("applyTime", applyTime); variables.put("leaveDay", leaveDay); variables.put("content", content); variables.put("position", position); if (position.trim().equals("經(jīng)理")) { variables.put("manager", "是"); variables.put("approvingOfficer", "S老板"); } else { variables.put("manager", "否"); variables.put("approvingOfficer", "T經(jīng)理"); } TaskService taskService = processEngine.getTaskService(); taskList = taskService.findPersonalTasks("dylan"); task = taskList.get(0); taskService.setVariables(task.getId(), variables); taskService.completeTask(task.getId()); return SUCCESS; } 四。請假1天,職位為員工,直接經(jīng)理進行審批,審批通過,即入庫
- public String confirm() {
- Map<String, Object> variables = new HashMap<String, Object>();
TaskService taskService = processEngine.getTaskService(); ExecutionService executionService = processEngine .getExecutionService(); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if (execution.getProcessInstance().isActive("老板審批")) { variables.put("approvingOfficer", "S老板"); taskService.completeTask(taskId, "老板批準"); } else if (execution.getProcessInstance().isActive("經(jīng)理審核")) { String variable = (String) taskService.getVariable(taskId, "leaveDay"); if (Integer.valueOf(variable) > 3) { taskService.completeTask(taskId, "請假天數(shù)>3"); } else { taskService.completeTask(taskId, "經(jīng)理批準"); } } return SUCCESS; } public String confirm() {Map<String, Object> variables = new HashMap<String, Object>();TaskService taskService = processEngine.getTaskService();ExecutionService executionService = processEngine.getExecutionService();task = taskService.getTask(taskId);execution = executionService.findExecutionById(task.getExecutionId());if (execution.getProcessInstance().isActive("老板審批")) {//approvingOfficer如果已存在值,則把之前值覆蓋variables.put("approvingOfficer", "S老板");taskService.completeTask(taskId, "老板批準");} else if (execution.getProcessInstance().isActive("經(jīng)理審核")) {String variable = (String) taskService.getVariable(taskId, "leaveDay");if (Integer.valueOf(variable) > 3) {taskService.completeTask(taskId, "請假天數(shù)>3");} else {taskService.completeTask(taskId, "經(jīng)理批準");}}return SUCCESS;}
入庫之后,人事即可對請假情況進行查看考核=。=