1.分析几张历史表,查询某用户涉及的所有已办流程实例列表,通过对每个流程实例进行分析。
一种方法是通过jBPM HistoryService历史服务进行操作(参照用户手册5.8. HistoryService历史服务),
另一种方法是自己编写HQL语句实现历史表的查询。
2.自己设计历史记录表,在需要记录的节点使用event-listener进行监听,实现记录。
这里以经典的请假为例子。请假成功,人事可以入库查询。具体流程如下图所示
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的具体情况可参考
http://www.family168.com/jbpm4/history.html
http://phoenix-clt.iteye.com/blog/426714
- 大小: 17 KB
分享到:
相关推荐
**jbpm4.3:开启开源工作流新篇章** jbpm4.3是一个强大的开源工作流管理系统,它允许开发者和业务分析师以图形化的方式设计、执行和管理业务流程。这个工具的核心在于将复杂的业务逻辑转化为计算机可以理解并执行的...
【JBPM4.3培训学习视频】是一套针对初学者设计的教程,旨在帮助学习者掌握JBPM4.3这一企业级工作流管理系统的核心概念和技术。JBPM是Java Business Process Management的缩写,是一个开源的工作流和业务流程管理平台...
jbpm4.3是JBoss Business Process Management (BPM) Suite的一个版本,它是一个开源的企业级BPM平台,用于设计、执行和管理业务流程。在这个"jbpm4.3工作流程管理例子"中,我们将深入探讨jbpm4.3的核心特性和如何...
1. **jbpm4.3**:jbpm(Java Business Process Management)是一个开源的工作流管理系统,版本4.3是其历史版本之一,用于业务流程自动化,支持BPMN2.0标准。 2. **集成环境**:jbpm4.3需要与应用服务器如Tomcat或...
JBPM4.3提供了几个关键的服务,如流程实例管理、任务服务和历史服务。流程实例管理允许启动新的流程实例,查询当前运行的实例,并控制它们的生命周期(如挂起、恢复或终止)。任务服务主要用于处理工作项的分配、...
**jbpm4.3所需jar包** JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。在JBPM 4.3版本中,为了实现完整功能,需要一系列的jar包来支持其运行环境。...
**JBPM4.3中文开发指南** JBPM(Java Business Process Management)是一个开源的工作流管理系统,专注于业务流程的建模、执行和管理。版本4.3是JBPM的一个重要里程碑,它提供了丰富的功能和改进,使得开发者能够更...
- **监控与审计**:jbpm4.3记录流程的执行历史,便于审计和分析流程性能。 - **集成能力**:jbpm4.3可以与各种企业应用集成,如Spring、Hibernate等,实现业务流程与企业应用的无缝对接。 **3. jbpm4.3的使用步骤**...
- **持久化**:jbpm4.3内置了JPA(Java Persistence API)支持,确保流程实例和历史数据的持久存储。 2. **jbpm4.3与Java集成** - **API调用**:jbpm4.3提供了Java API,开发人员可以直接在代码中创建、启动、...
流程跟踪是jbpm4.3提供的强大工具,它可以帮助用户监控流程实例的实时状态,查看每个任务的进度和历史记录。通过跟踪,管理者可以了解流程执行的详细情况,包括任务分配、等待时间、参与者交互等信息,从而优化流程...
**jbPM4.3中文开发手册** jbPM(Java Business Process Management)是一个开源的工作流管理系统,专注于业务流程的建模、执行和监控。jbPM4.3是该系统的早期版本,但仍然包含了丰富的功能和工具,为企业级业务流程...
jbpm 4.3 是一个历史悠久的开源工作流管理系统,由JBoss公司开发,主要用于业务流程管理和执行。这个视频教程是针对jbpm 4.3版本的,采用swf格式,意味着它是一系列的交互式多媒体教学内容,旨在帮助学习者深入理解...
jbpm4.3-src是一个关于jbpm(Java Business Process Management)4.3版本的源代码压缩包,主要用于学习和理解工作流管理系统的工作原理。jbpm是一个开源的企业级BPM(Business Process Management)平台,它提供了...
jbpm4.3-src.zip是一个包含jbpm 4.3版本源代码的压缩包,对于开发者来说,这是一个宝贵的资源,可以深入理解jbpm的工作原理,从而更好地利用它进行业务流程管理(BPM)系统的开发和定制。jbpm是一个开源的工作流管理...
JBPM4.3是JBoss工作流平台的一个版本,它提供了强大的业务流程管理(BPM)功能。在JBPM4.3中,数据库中的表结构是理解系统运作的基础。以下是对这些表的详细解释: 1. **JBPM4_DEPLOYMENT**:此表存储流程定义的...
### JBPM4.3编程指南知识点详述 #### 1. 概述 - **目标读者**:本指南主要面向具备一定开发经验的专业人士,旨在帮助他们深入理解JBPM4.3的各项特性和功能,从而更好地利用该平台进行流程管理和自动化。 - **内容...
以上四个表格构成了jbpm4.3中主要的数据存储框架,涵盖了从流程定义到实例执行再到历史记录的全过程管理。这些表格相互关联,通过外键和主键的机制紧密相连,确保了数据的一致性和完整性。理解这些表格的结构和关系...