jbpm历史查询

晨曦之光 发布于 2012/04/11 18:10
阅读 860
收藏 1
1.分析几张历史表,查询某用户涉及的所有已办流程实例列表,通过对每个流程实例进行分析。
一种方法是通过jBPM HistoryService历史服务进行操作(参照用户手册5.8. HistoryService历史服务),
另一种方法是自己编写HQL语句实现历史表的查询。

2.自己设计历史记录表,在需要记录的节点使用event-listener进行监听,实现记录。

这里以经典的请假为例子。请假成功,人事可以入库查询。具体流程如下图所示
 
leaveListener是一个事件监听,配置在app-service.xml中,方便leave.jpdl.xml进行调用
App-service.xml代码
  1. <bean id="leaveListener" class="com.javaeye.oa.web.listener.LeaveListener" >   
  2.         <property name="leaveService" ref="leaveService"/>   
  3. </bean>   
  4. <bean id="leaveService" class="com.javaeye.oa.service.task.impl.LeaveServiceImpl">   
  5. </bean>  
Leave.jpdl.xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2.   
  3. <process name="leave" xmlns="http://jbpm.org/4.3/jpdl">   
  4.    <start g="201,14,48,48" name="开始">   
  5.       <transition g="-42,-10" name="请假" to="填写请假单"/>   
  6.    </start>   
  7.    <task assignee="#{applyName}" g="178,87,92,52" name="填写请假单">   
  8.       <transition g="-97,2" name="判断是不是经理" to="是不是经理"/>   
  9.    </task>   
  10.    <decision expr="#{manager}" g="204,158,48,48" name="是不是经理">   
  11.       <transition g="-23,-11" name="否" to="经理审核"/>   
  12.       <transition g="14,-11" name="是" to="老板审批"/>   
  13.    </decision>   
  14.    <task assignee="#{approvingOfficer}" g="103,252,92,52" name="经理审核">   
  15.       <transition g="150,450:10,-21" name="经理批准" to="结束">   
  16.             <event-listener expr="#{leaveListener}">   
  17.                 <field name="endMsg">   
  18.                     <string value="批准请假,人事入库" />   
  19.                 </field>   
  20.             </event-listener>   
  21.       </transition>   
  22.       <transition g="-22,-22" name="请假天数>3" to="老板审批"/>   
  23.       <transition g="-61,-1" name="经理不批准" to="终止"/>   
  24.       <transition g="149,114:-55,82" name="经理驳回" to="填写请假单"/>   
  25.    </task>   
  26.    <task assignee="#{approvingOfficer}" g="278,251,92,52" name="老板审批">   
  27.       <transition g="326,450:-58,-24" name="老板批准" to="结束">   
  28.             <event-listener expr="#{leaveListener}">   
  29.                 <field name="endMsg">   
  30.                     <string value="批准请假,人事入库" />   
  31.                 </field>   
  32.             </event-listener>   
  33.       </transition>   
  34.       <transition g="7,0" name="老板不批准" to="终止"/>   
  35.       <transition g="323,114:13,61" name="老板驳回" to="填写请假单"/>   
  36.    </task>   
  37.    <end g="219,429,48,48" name="结束" state="confirm"/>   
  38.    <end g="220,360,48,48" name="终止" state="dissent"/>   
  39. </process>  


applyName、manager、approvingOfficer几个变量在实际操作中进行设置
endMsg测试时候使用,实际应用中可以删除

当经理批准申请或老板批准申请的时候,事件响应,进行请假申请入库。
Leavelistener.java代码

  1. package com.javaeye.oa.web.listener;   
  2.   
  3. import org.jbpm.api.listener.EventListener;   
  4. import org.jbpm.api.listener.EventListenerExecution;   
  5.   
  6. import com.javaeye.oa.entity.task.Leave;   
  7. import com.javaeye.oa.service.task.LeaveService;   
  8.   
  9. public class LeaveListener implements EventListener {   
  10.   
  11.     private static final long serialVersionUID = 7098294717133900660L;   
  12.     private String endMsg;//endMsg测试时候使用,实际应用中可以删除   
  13.     private LeaveService leaveService;   
  14.        
  15.     public void setEndMsg(String endMsg) {   
  16.         this.endMsg = endMsg;   
  17.     }   
  18.     //leaveService进行set注入   
  19.     public void setLeaveService(LeaveService leaveService) {   
  20.         this.leaveService = leaveService;   
  21.     }   
  22.        
  23.     public void notify(EventListenerExecution execution) throws Exception {   
  24.   
  25.         System.out.println("==============leaveListener:endMsg="+endMsg);   
  26.         String applyName = (String) execution.getVariable("applyName");   
  27.         String leaveDay = (String) execution.getVariable("leaveDay");   
  28.         String applyTime = (String) execution.getVariable("applyTime");   
  29.         String position = (String) execution.getVariable("position");   
  30.         String content = (String) execution.getVariable("content");   
  31.         String approvingOfficer = (String) execution.getVariable("approvingOfficer");   
  32.            
  33.         Leave leave = new Leave();   
  34.         leave.setApplyName(applyName);   
  35.         leave.setApplyTime(applyTime);   
  36.         leave.setApprovingOfficer(approvingOfficer);   
  37.         leave.setContent(content);   
  38.         leave.setPosition(position);   
  39.         leave.setLeaveDay(leaveDay);   
  40.            
  41.         leaveService.addLeave(leave);   
  42.     }   
  43. }  

Leave.java代码

  1. package com.javaeye.oa.entity.task;   
  2.   
  3. public class Leave implements java.io.Serializable {   
  4.   
  5.     private static final long serialVersionUID = -3289821345085237147L;   
  6.     private Long id;   
  7.     private String applyName;   
  8.     private String leaveDay;   
  9.     private String position;   
  10.     private String applyTime;   
  11.     private String content;   
  12.     private String approvingOfficer;   
  13.   
  14.     // Constructors   
  15.   
  16.     /** default constructor */   
  17.     public Leave() {   
  18.     }   
  19. ...  

当一切就绪,我们便开始进行实际操作。
 
 
 
--------------------------------------------------------------------------------------------------------
一。员工dylan点击请假链接
Java代码
  1. public String leave() {   
  2.   
  3.      Map<String, Object> variables = new HashMap<String, Object>();   
  4.      //applyName对应leave.jpdl.xml中相应变量,这里applyName为dylan   
  5.      variables.put("applyName""dylan");   
  6.      ExecutionService executionService = processEngine.getExecutionService();   
  7.      ProcessInstance processInstance = executionService.startProcessInstanceByKey("leave",variables);   
  8.            
  9.      if (processInstance.isActive("填写请假单")) {   
  10.          url = "apply";   
  11.      }   
  12.      return url;   
  13. }  

二。dylan在请假页面填写请假申请单

Apply.jsp代码
  1. <%@page contentType="text/html;charset=UTF-8" %>   
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  3. <html xmlns="http://www.w3.org/1999/xhtml">   
  4.     <head>   
  5.         <title>填写申请单</title>   
  6.     </head>   
  7.     <body>   
  8.         <form action="apply.action" method="POST">   
  9.           <table width="300" border=1>   
  10.             <tr>   
  11.               <td><label>申请人</label></td>   
  12.               <td><input type="text" value="dylan" name="applyName"></td>   
  13.             </tr>   
  14.             <tr>   
  15.               <td><label>职位</label></td>   
  16.               <td><input type="text" value="员工" name="position"></td>   
  17.             </tr>   
  18.             <tr>   
  19.               <td><label>申请时间</label></td>   
  20.               <td><input type="text" value="2010-01-10" name="applyTime"></td>   
  21.             </tr>   
  22.             <tr>   
  23.               <td><label>请假天数</label></td>   
  24.               <td><input type="text" value="1" name="leaveDay"></td>   
  25.             </tr>   
  26.             <tr>   
  27.               <td><label>请假原因</label></td>   
  28.               <td><pre  name="content" rows=3 cols=200>病假</pre></td>   
  29.             </tr>   
  30.             <tr>   
  31.               <td><input type="submit" value="申请"></td>   
  32.               <td><input type="reset" value="取消"></td>   
  33.             </tr>   
  34.           </table>   
  35.         </form>   
  36.     </body>   
  37. </html>  

三。dylan填写完成,提交请假单

Java代码
  1. public String apply() {   
  2.         Map<String,Object> variables = new HashMap<String,Object>();   
  3.     String applyName = getRequest().getParameter("applyName");   
  4.     String applyTime = getRequest().getParameter("applyTime");   
  5.     String leaveDay = getRequest().getParameter("leaveDay");   
  6.     String content = getRequest().getParameter("content");   
  7.     String position = getRequest().getParameter("position");   
  8.   
  9.     variables.put("applyName", applyName);   
  10.     variables.put("applyTime", applyTime);   
  11.     variables.put("leaveDay", leaveDay);   
  12.     variables.put("content", content);   
  13.     variables.put("position", position);   
  14.     if (position.trim().equals("经理")) {   
  15.         variables.put("manager""是");   
  16.                 variables.put("approvingOfficer""S老板");   
  17.     } else {   
  18.         variables.put("manager""否");   
  19.                 variables.put("approvingOfficer""T经理");   
  20.     }   
  21.         TaskService taskService = processEngine.getTaskService();   
  22.         //dylan即请假启动的时候applyName的值   
  23.     taskList = taskService.findPersonalTasks("dylan");   
  24.     task = taskList.get(0);   
  25.     taskService.setVariables(task.getId(), variables);   
  26.     taskService.completeTask(task.getId());   
  27.         return SUCCESS;   
  28. }  
 四。请假1天,职位为员工,直接经理进行审批,审批通过,即入库
Java代码
  1. public String confirm() {   
  2.         Map<String, Object> variables = new HashMap<String, Object>();   
  3.         TaskService taskService = processEngine.getTaskService();   
  4.         ExecutionService executionService = processEngine   
  5.         .getExecutionService();   
  6.         task = taskService.getTask(taskId);   
  7.         execution = executionService.findExecutionById(task.getExecutionId());   
  8.         if (execution.getProcessInstance().isActive("老板审批")) {   
  9.             //approvingOfficer如果已存在值,则把之前值覆盖   
  10.             variables.put("approvingOfficer""S老板");   
  11.         taskService.completeTask(taskId, "老板批准");   
  12.     } else if (execution.getProcessInstance().isActive("经理审核")) {   
  13.     String variable = (String) taskService.getVariable(taskId, "leaveDay");   
  14.          if (Integer.valueOf(variable) > 3) {   
  15.             taskService.completeTask(taskId, "请假天数>3");   
  16.          } else {   
  17.         taskService.completeTask(taskId, "经理批准");   
  18.              }   
  19.     }   
  20.         return SUCCESS;   
  21. }  

入库之后,人事即可对请假情况进行查看考核=。=

原文链接:http://blog.csdn.net/wangxiaojing123/article/details/7069769
加载中
返回顶部
顶部