jBPM4.3 歷史查詢

1.分析幾張歷史表,查詢某用戶涉及的所有已辦流程實例列表,通過對每個流程實例進行分析。
一種方法是通過jBPM HistoryService歷史服務進行操作(參照用戶手冊5.8. HistoryService歷史服務),
另一種方法是自己編寫HQL語句實現歷史表的查詢。

2.自己設計歷史記錄表,在需要記錄的節點使用event-listener進行監聽,實現記錄。

這裏以經典的請假爲例子。請假成功,人事可以入庫查詢。具體流程如下圖所示
[img]http://dl.iteye.com/upload/attachment/199662/1b454420-46a2-350c-948d-f4ea04a0f279.jpg[/img]

leaveListener是一個事件監聽,配置在app-service.xml中,方便leave.jpdl.xml進行調用
<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="判斷是不是經理" to="是不是經理"/>
</task>
<decision expr="#{manager}" g="204,158,48,48" name="是不是經理">
<transition g="-23,-11" name="否" to="經理審覈"/>
<transition g="14,-11" name="是" to="老闆審批"/>
</decision>
<task assignee="#{approvingOfficer}" g="103,252,92,52" name="經理審覈">
<transition g="150,450:10,-21" name="經理批准" to="結束">
<event-listener expr="#{leaveListener}">
<field name="endMsg">
<string value="批准請假,人事入庫" />
</field>
</event-listener>
</transition>
<transition g="-22,-22" name="請假天數>3" to="老闆審批"/>
<transition g="-61,-1" name="經理不批准" to="終止"/>
<transition g="149,114:-55,82" name="經理駁回" 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測試時候使用,實際應用中可以刪除

當經理批准申請或老闆批准申請的時候,事件響應,進行請假申請入庫。
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.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>();
//applyName對應leave.jpdl.xml中相應變量,這裏applyName爲dylan
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>請假天數</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("經理")) {
variables.put("manager", "是");
variables.put("approvingOfficer", "S老闆");
} else {
variables.put("manager", "否");
variables.put("approvingOfficer", "T經理");
}
TaskService taskService = processEngine.getTaskService();
//dylan即請假啓動的時候applyName的值
taskList = taskService.findPersonalTasks("dylan");
task = taskList.get(0);
taskService.setVariables(task.getId(), variables);
taskService.completeTask(task.getId());
return SUCCESS;
}

四。請假1天,職位爲員工,直接經理進行審批,審批通過,即入庫
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("經理審覈")) {
String variable = (String) taskService.getVariable(taskId, "leaveDay");
if (Integer.valueOf(variable) > 3) {
taskService.completeTask(taskId, "請假天數>3");
} else {
taskService.completeTask(taskId, "經理批准");
}
}
return SUCCESS;
}

入庫之後,人事即可對請假情況進行查看考覈=。=

本文在family168的請假例子上進行簡單修改,基於SSH+jBPM4.3,實現自定義歷史表查詢。
關於歷史事件中,variable的具體情況可參考
[url]http://www.family168.com/jbpm4/history.html[/url]
[url]http://phoenix-clt.iteye.com/blog/426714[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章