jbpm4.4开发环境配置+请假实例

来源:互联网 发布:ubuntu python 路径 编辑:程序博客网 时间:2024/05/09 19:38

环境搭建:

-jbpm4

-eclipse for javaee

-gpd

1. 为eclipse安装jbpm插件

启动eclipse 打开 ,点击eclipse 菜单的Help-> install new software->add->Archive->选择在jbpm4 解压目录 下的 install/src/gpd/jbpm-gpd-site.zip 然后点击ok-->全选->next->next->finish-完成安装, 重启eclipse 后生效。验证是否安装成功:点击菜单file ->new->other出现JBoss JBPM即安装成功;

2.创建一个jbpm4的动态web工程,需要把jbpm4的发布包下jbpm.jar 和lib下的所有jar导入到工程;配置文件可以在发布包中找examples->src下的所有xml文件和properties文件(5个)拷贝的你工程src目录下

3.创建流程定义 在src目录下新建一个 JBPM 4 Process Definition 命名为leave 业务流程为:员工提交申请,经理审批,经理驳回则重新填写,如果经理批准且请假天数小于3天则结束流程,否则交有老板审批老板审批通过后结束流程,否则重新填写

对应的xml文件如下

<?xml version="1.0" encoding="UTF-8"?><process name="leave" xmlns="http://jbpm.org/4.4/jpdl">   <start g="270,7,48,48" name="开始">      <transition g="-35,-23" name="申请" to="申请"/>   </start>   <end g="279,442,48,48" name="结束"/>   <task assignee="#{owner}" form="request.jsp" g="252,102,92,52" name="申请">      <transition g="-60,-22" name="经理审批" to="经理审批"/>   </task>   <task assignee="manager" form="manager.jsp" g="251,213,92,52" name="经理审批">      <transition g="-60,-24" name="经理批准" to="exclusive1"/>      <transition g="184,238;183,127:-53,-25" name="驳回申请" to="申请"/>   </task>   <task assignee="boss" form="boss.jsp" g="438,331,92,52" name="老板审批">      <transition g="485,465:-83,-20" name="审批通过" to="结束"/>      <transition name="驳回申请" to="申请" g="482,128:-53,-25"/>   </task>   <decision expr="#{day>3?'老板审批':'审批通过'}" g="275,334,48,48" name="exclusive1">      <transition g="-56,-22" name="审批通过" to="结束"/>      <transition g="-60,-22" name="老板审批" to="老板审批"/>   </decision></process>
保存流程定义后会生成一个leave.png 流程定义图

新建一个index.jsp页面用来显示流程定义、流程实例和当前任务列表;

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@page import="java.util.*,org.jbpm.api.*" %><%@page import="org.jbpm.api.task.Task"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><div align="center">用户:<%=session.getAttribute("username") %>|<a href="login.jsp">退出</a><hr><a href="deploy.jsp">发布流程</a><br/><%ProcessEngine processEngine =Configuration.getProcessEngine();RepositoryService repositoryService =processEngine.getRepositoryService();ExecutionService executionService =processEngine.getExecutionService();TaskService taskService =processEngine.getTaskService();String username =(String)session.getAttribute("username");List<ProcessDefinition> pdList =repositoryService.createProcessDefinitionQuery().list();//流程定义列表List<ProcessInstance>  piList =executionService.createProcessInstanceQuery().list();//流程实例列表List<Task> taskList =taskService.findPersonalTasks(username);//任务列表%><table cellpadding="1" cellspacing="0" border="1"><caption align="top">流程管理</caption><tr><th>流程ID</th><th>流程名称</th><th>流程版本</th><th>操作</th></tr><%for (ProcessDefinition pd : pdList) {%><tr><td><%=pd.getId()%></td><td><%=pd.getName()%></td><td><%=pd.getVersion()%></td><td><a href="delete.jsp?id=<%=pd.getDeploymentId()%>">删除流程</a>|<a href="start.jsp?id=<%=pd.getId()%>">发起流程</a></td></tr><% } %></table><hr><table cellpadding="1" cellspacing="0" border="1"><caption align="top">流程实例管理</caption><tr><th>实例ID</th><th>实例名称</th><th>状态</th><th>操作</th></tr><%for (ProcessInstance pi : piList) {%><tr><td><%=pi.getId()%></td><td><%=pi.findActiveActivityNames()%></td><td><%=pi.getState()%></td><td><a href="view.jsp?id=<%=pi.getId()%>">查看实例</a></td></tr><% } %></table><hr>taskList的大小:<%=taskList.size()%><table cellpadding="0" cellspacing="0" border="1"><caption align="top">代办任务</caption><tr><th>任务ID</th><th>任务名称</th><th>操作</th></tr><%for (Task task : taskList) {%><tr><td><%=task.getId()%></td><td><%=task.getName()%></td><td><a href="<%=task.getFormResourceName()%>?id=<%=task.getId()%>">查看任务</a></td></tr><% } %></table></div></body></html>

deploye.jsp用来发布流程定义:
ProcessEngine pe =Configuration.getProcessEngine();RepositoryService rs =pe.getRepositoryService(); ZipInputStream zip =new ZipInputStream(this.getClass().getResourceAsStream("/leave.zip"));rs.createDeployment().addResourcesFromZipInputStream(zip).deploy();response.sendRedirect("index.jsp");//可以只发布xml文件zip文件中包含xml文件和leave.png 可以做流程图的跟踪//只发布xml文件的代码为:rs.createDeployment().addResourceFromClasspath("leave.jpdl.xml").deploy();
delete.jsp删除流程定义:通过传入的流程定义的id删除流程定义;

ProcessEngine processEngine =Configuration.getProcessEngine();RepositoryService rs =processEngine.getRepositoryService();rs.deleteDeploymentCascade(request.getParameter("id"));response.sendRedirect("index.jsp");
start.jsp来启动一个流程实例:

ProcessEngine pe =Configuration.getProcessEngine();ExecutionService es =pe.getExecutionService();String id= request.getParameter("id");String username =(String)session.getAttribute("username");Map<String,String> map =new HashMap<String,String>();map.put("owner", username);es.startProcessInstanceById(id, map);response.sendRedirect("index.jsp");
map中存放流程实例中的变量

启动流程实例后任务列表中会出现相应的任务,(以普通用户为例)点击查看任务会出现请假申请页面,在填写好申请单后提交,提交代表完成当前任务,其主要代码为:

String taskId =request.getParameter("taskId");String owner =request.getParameter("owner");String day =request.getParameter("day");String reason =request.getParameter("reason");Map<String,String> map =new HashMap<String,String>();map.put("owner", owner);map.put("day", day);map.put("reason", reason);ProcessEngine pe =Configuration.getProcessEngine();TaskService  taskService=pe.getTaskService();taskService.setVariables(taskId,map);taskService.completeTask(taskId);response.sendRedirect("index.jsp");

提交后会走到经理审批处,经理提交的代码:

String taskId =request.getParameter("taskId");String resault =request.getParameter("resault"); ProcessEngine pe =Configuration.getProcessEngine();TaskService taskService = pe.getTaskService();taskService.completeTask(taskId, resault);response.sendRedirect("index.jsp");
resault 指定流程下一步的位置 批准 resault ="经理批准" 否则resault ="驳回申请" resault 对应流程定义中的transition 的name属性经历审批的页面为
<%String taskId =request.getParameter("id");ProcessEngine pe =Configuration.getProcessEngine();TaskService taskService =pe.getTaskService();String owner=(String)taskService.getVariable(taskId, "owner"); String day=(String)taskService.getVariable(taskId,"day");String reason =(String)taskService.getVariable(taskId,"reason");%><form action="submit-manager.jsp"><input type="hidden" value="${param.id}" name="taskId"><br>申请人:<%=owner %><br>申请天数:<%=day%><br>申请原因:<%=reason%><br>批准  <input id="r1" type="radio" name="resault" value="经理批准"/>  驳回  <input id="r2" type="radio" name="resault" value="驳回申请"/>  <br/><input type="submit" value="提交" /></form>
taskService.getVariable 为获取流程实例中的变量

经理提交后会判断天数是否大于3如果大于3则流程结束,否则会提交到老板审批,老板审批代码与经理审批代码基本相同

流程图的跟踪

在index 中点击查看实例会看到流程图的实时状态,这里就需要以发布包含leave.jpdl.xml和leave.png的zip 形式的文件发布流程定义

图片的获取:

pic.jsp

ProcessEngine processEngine =Configuration.getProcessEngine(); RepositoryService rs =processEngine.getRepositoryService();ExecutionService es=processEngine.getExecutionService();String id =request.getParameter("id");ProcessInstance pi =es.findProcessInstanceById(id);String pdId= pi.getProcessDefinitionId();ProcessDefinition pd =rs.createProcessDefinitionQuery().processDefinitionId(pdId).uniqueResult();InputStream is =rs.getResourceAsStream(pd.getDeploymentId(), "leave.png");byte[] b =new byte[1024];int len=-1;while((len=is.read(b,0,1024))!=-1){response.getOutputStream().write(b,0,len);}//jsp页面中如报异常加以下两行代码                out.clear();  out = pageContext.pushBody();


String id =request.getParameter("id");ProcessEngine pe  =Configuration.getProcessEngine();RepositoryService rs = pe.getRepositoryService();ExecutionService es =pe.getExecutionService();ProcessInstance pi=es.findProcessInstanceById(id);//<span style="font-size:18px;"><span style="font-size:18px;">根据流程实例的id获取流程实例</span></span>        Set<String> actvityNames= pi.findActiveActivityNames();//获取所有的活跃节点ActivityCoordinates ac =rs.getActivityCoordinates(pi.getProcessDefinitionId(),actvityNames.iterator().next());//页面中的显示/*<body>    <img  src="pic.jsp?id=<%=id%>" style="position:absolute;left:0px;top:0px">    <div style="position:absolute;border:2px solid red;left:<%=ac.getX()%>px;top:<%=ac.getY()%>px;width:<%=ac.getWidth()%>px;height:<%=ac.getHeight()%>px"></div></body>  */     


0 0
原创粉丝点击