中国法律网
法律通行证: 用户名: 密码:  注册
律师加盟热线:400-8919-913   律信通 律信通  
律师
公众 咨询 贴吧
律信通 案件委托
频道 房产 婚姻 交通事故 保险 建设工程 劳动
留学
公司 合同 刑事辩护 医疗 知识产权 工商
新闻 宽频 文书 常识 案例
法规 专题 杂志 百科 论文
查找全国各地律师: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 点击各城市名拼音首字母查找律师 公众找律师,信赖律信通!律师做宣传,首选律信通!
当前位置: 主页 > 法律专题2 > 请假单 >

JBPM4---简易的请假实例

时间:2012-09-18 00:58来源:邓老师 作者:笑燕 点击:
1.新建一个动态的web项目 2.在lib目录下加入以下jar包(由于 用到fileupload的上传,所以还要加入fileupload的依赖库) 引用 *JBPM4_HOME/jbpm.jar *JBPM4_HOME/lib/*.jar *jakarta-taglibs-standard-1.1.2_HOME/lib/jstl.jar *jakarta-taglibs-standard-1.1
1.新建一个动态的web项目
2.在lib目录下加入以下jar包(由于用到fileupload的上传,所以还要加入fileupload的依赖库)
引用
*JBPM4_HOME/jbpm.jar
*JBPM4_HOME/lib/*.jar
*jakarta-taglibs-standard-1.1.2_HOME/lib/jstl.jar
*jakarta-taglibs-standard-1.1.2_HOME/lib/standard.jar
*commons-fileupload-1.2.1_HOME/lib/commons-fileupload-1.2.1.jar

3.绘制流程图(在resources目录下建立一个leave.jpdl.xml文件)
Java代码
    <?xml version="1.0"encoding="UTF-8"?> <process name="leave"xmlns="4.0/jpdl"> <start g="201,14,48,48"name="开始"> <transition g="-42,-10"name="请假"to="填写请假单"/> </start> <task assignee="Kayzhan"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="Lingo"g="103,252,92,52"name="经理审核"> <transition g="150,450:10,-21"name="经理批准"to="结束"/> <transition g="-22,-22"name="请假天数>3"to="老板审批"/> <transition g="-61,-1"name="经理不批准"to="终止"/> <transition g="149,114:-55,82"name="经理驳回"to="填写请假单"/> </task> <task assignee="ForgetDavi"g="278,251,92,52"name="老板审批"> <transition g="326,450:-58,-24"name="老板批准"to="结束"/> <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>

4.编写流程发布及控制的类
Java代码
    packagezzg; importjava.io.IOException; ng.reflect.Method; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.Iterator; importjava.util.LinkedHashMap; importjava.util.List; importjava.util.Map; importjava.util.Set; importjava.util.zip.ZipInputStream;importjavax.servlet.ServletConfig; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse;mons.fileupload.DiskFileUpload; mons.fileupload.FileItem; importorg.jbpm.api.Configuration; importorg.jbpm.api.Execution; importorg.jbpm.api.ExecutionService; importorg.jbpm.api.ProcessDefinition; importorg.jbpm.api.ProcessDefinitionQuery; importorg.jbpm.api.ProcessEngine; importorg.jbpm.api.ProcessInstance; importorg.jbpm.api.RepositoryService; importorg.jbpm.api.TaskService; importorg.jbpm.api.task.Task; /*** Servlet implementation class LeaveServlet*/publicclassLeaveServletextendsHttpServlet { privatestaticfinallongserialVersionUID = 1L; privateProcessEngine processEngine =null; privateRepositoryService repositoryService =null; privateExecutionService executionService =null; privateProcessInstance processInstance =null; privateTaskService taskService =null; privateTask task =null; privateExecution execution =null; privateString url =null; privateList list =null; privateList<Task> taskList =null; /* 初始化ProcessEngine. */publicvoidinit(ServletConfig config)throwsServletException { super.init(config); // 获取流程引擎processEngine =newConfiguration().buildProcessEngine(); repositoryService = processEngine.getRepositoryService(); executionService = processEngine.getExecutionService(); taskService = processEngine.getTaskService(); } protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { process(request, response); } protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { process(request, response); } protectedvoidprocess(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String zzg = request.getParameter("zzg"); if(zzg.equals("deploy")) { try{ deploy(request, response); }catch(Exception e) { e.printStackTrace(); } list = getLatestProcessDefinition(request, response); request.setAttribute("process", list); request.getRequestDispatcher("/index.jsp").forward(request, response); }elseif(zzg.equals("leave")) { url = leave(request, response); request.getRequestDispatcher(url).forward(request, response); }elseif(zzg.equals("query")) { list = getProcessInstanceById(request, response); request.setAttribute("pi", list); request.getRequestDispatcher("/index.jsp").forward(request, response); }elseif(zzg.equals("apply")) { apply(request, response); list = getProcessInstanceById(request, response); request.setAttribute("pi", list); request.getRequestDispatcher("/index.jsp").forward(request, response); }elseif(zzg.equals("getTask")) { list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); }elseif(zzg.equals("view")) { Map<String, Object> map = view(request, response); request.setAttribute("map", map); request.getRequestDispatcher("/view.jsp") .forward(request, response); }elseif(zzg.equals("confirm")) { confirm(request, response); list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); }elseif(zzg.equals("dissent")) { dissent(request, response); list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); } /* * try { Class clz = this.getClass(); Method method = * clz.getDeclaredMethod(action, HttpServletRequest.class, * HttpServletResponse.class); method.invoke(this, request, response); } * catch (Exception ex) { ex.printStackTrace(); } */} protectedvoiddeploy(HttpServletRequest request, HttpServletResponse response)throwsException, IOException { String temp = getServletContext().getRealPath("/temp"); String upload = getServletContext().getRealPath("/upload"); DiskFileUpload diskFileUpload =newDiskFileUpload(); diskFileUpload.setFileSizeMax(1*1024*1024); diskFileUpload.setSizeThreshold(4096); diskFileUpload.setRepositoryPath(temp); List fileItems = diskFileUpload.parseRequest(request); Iterator iter = fileItems.iterator(); if(iter.hasNext()) { FileItem item = (FileItem) iter.next(); if(!item.isFormField()) { String name = item.getName(); longsize = item.getSize(); System.out.println("name: "+ name +"&size:"+ size); if(name !=null&& !name.equals("") && size >0) { // Deploying a process部署流程repositoryService.createDeployment() .addResourcesFromZipInputStream( newZipInputStream(item.getInputStream())) .deploy(); } } } } protectedString leave(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { // 根据流程定义的KEY值启动一个新的流程实例processInstance = executionService.startProcessInstanceByKey("leave"); //判断流程定义的活动是否是“填写请假单”的活动if(processInstance.isActive("填写请假单")) { url ="/apply.jsp"; } returnurl; } protectedMap<String, Object> apply(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { Map<String, Object> variables =newHashMap<String, Object>(); String name = request.getParameter("applyName"); String time = request.getParameter("applyTime"); String leaveDay = request.getParameter("leaveDay"); String content = request.getParameter("content"); String position = request.getParameter("position"); variables.put("name", name); variables.put("time", time); variables.put("leaveDay", leaveDay); variables.put("content", content); variables.put("position", position); if(position.trim().equals("经理")) { //"manager"变量名与leave.jpdl.xml中decision里面的变量一致,同时设置的值也要保持一致variables.put("manager","是"); }else{ variables.put("manager","否"); } //获取任务列表,因为我们在填写请假单的时候是分配给“zzg”的,见leave.jpdl.xmltaskList = taskService.findPersonalTasks("zzg"); //根据任务列表获取任务task = taskList.get(0); //把设置好的变量放到任务服务里面并根据任务ID结束任务taskService.setVariables(task.getId(), variables); pleteTask(task.getId()); //判断任务活动是否到达老板审批活动//execution = executionService.findExecutionById(task.getExecutionId());//System.out.println("isActive:"//+ execution.getProcessInstance().isActive("老板审批"));returnvariables; } /** * 获取任务列表 * * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedList<Task> getTask(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String name = request.getParameter("name"); taskList = taskService.findPersonalTasks(name); returntaskList; } /** * 查看任务 * * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedMap<String, Object> view(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String taskId = request.getParameter("id"); Set<String> set = taskService.getVariableNames(taskId); Map<String, Object> map = taskService.getVariables(taskId, set); returnmap; } protectedvoidconfirm(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String taskId = request.getParameter("id"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if(execution.getProcessInstance().isActive("老板审批")) { pleteTask(taskId,"老板批准"); }elseif(execution.getProcessInstance().isActive("经理审核")) { String variable = (String) taskService.getVariable(taskId, "leaveDay"); if(Integer.valueOf(variable) >3) { pleteTask(taskId,"请假天数>3"); }else{ pleteTask(taskId,"经理批准"); } } } protectedvoiddissent(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String taskId = request.getParameter("id"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if(execution.getProcessInstance().isActive("老板审批")) { pleteTask(taskId,"老板不批准"); }elseif(execution.getProcessInstance().isActive("经理审核")) { pleteTask(taskId,"经理不批准"); } } /** * 获取最新版本的流程定义 * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedList<ProcessDefinition> getLatestProcessDefinition( HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { List<ProcessDefinition> processDefinitions = repositoryService .createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list(); Map<String, ProcessDefinition> map =newLinkedHashMap<String, ProcessDefinition>(); for(ProcessDefinition pd : processDefinitions) { String key = pd.getKey(); ProcessDefinition definition = map.get(key); if((definition ==null) || (definition.getVersion() < pd.getVersion())) { map.put(key, pd); } } returnnewArrayList(map.values()); } /** * 根据流程定义ID获取流程实例 * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedList<ProcessInstance> getProcessInstanceById( HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { String pdId = request.getParameter("id"); returnexecutionService.createProcessInstanceQuery() .processDefinitionId(pdId).list(); } }

5.在webapp目录下创建一个index.jsp页面,用来发布流程、显示流程定义及流程实例
Java代码 <contentType="text/html;charset=UTF-8" %>
<import="org.jbpm.api.*" %>
<import="java.util.*" %>
<%@ taglib prefix="c" uri="><html>
<head>
<title>jBPM4流程发布</title>
</head>
<body>
<form action="leave?zzg=deploy" method="POST" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="submit" value="发布">
</form>
<ul>
<li><a href="leave?zzg=leave">请假</a></li>
<li><a href="leave?zzg=getTask&name=Lingo" target="_blank">经理的任务列表</a></li>
<li><a href="leave?zzg=getTask&name=ForgetDavi" target="_blank">老板的任务列表</a></li>
</ul>
<table width=480 border=1>
<tr><td colspan="5">流程定义</td></tr>
<tr>
<td>ID</td>
<td>Key</td>
<td>名称</td>
<td>版本</td>
<td>操作</td>
</tr>
<c:forEach var="process" items="${process}">
<tr>
<td>${process.id}</td>
<td>${process.key}</td>
<td>${process.name}</td>
<td>${process.version}</td>
<td><a href="leave?zzg=query&id=${process.id }">查看</a></td>
</tr>
</c:forEach>
</table>
<br>
<br>
<br>
<table width=480 border=1>
<tr><td colspan="5">流程实例</td></tr>
<tr>
<td>ID</td>
<td>Key</td>
<td>状态</td>
</tr>
<c:forEach var="pi" items="${pi}">
<tr>
<td>${pi.id}</td>
<td>${pi.key}</td>
<td>${pi.state}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
6.在webapp目录创建一个apply.jsp页面,用来填写请假单
Java代码contentType="text/html;charset=UTF-8" %><html>
<head>
<title>填写申请单</title>
</head>
<body>
<form action="leave?zzg=apply" method="POST">
<table width="300" border=1>
<tr>
<td><label>申请人</label></td>
<td><input type="text" value="zzg" 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="2009-03-09" name="applyTime"></td>
</tr>
<tr>
<td><label>请假天数</label></td>
<td><input type="text" value="3" 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>
7.在webapp目录下创建一个check.jsp文件,用来显示任务列表并添加三个操作
Java代码<contentType="text/html;charset=UTF-8" %>
<import="org.jbpm.api.*" %>
<import="java.util.*" %>
<%@ taglib prefix="c" uri="><html>
<head>
<title>请假审批</title>
</head>
<body>
<table width=600 border=1>
<tr><td colspan="8">任务列表</td></tr>
<tr>
<td>ID</td>
<td>名称</td>
<td>分配人</td>
<td>创建时间</td>
<td>持续时间</td>
<td>优先级</td>
<td>描述</td>
<td>操作</td>
</tr>
<c:forEach var="task" items="${taskList}">
<tr>
<td>${task.id}</td>
<td>${task.name}</td>
<td>${task.assignee}</td>
<td>${task.createTime}</td>
<td>${task.duedate}</td>
<td>${task.priority}</td>
<td>${task.description}</td>
<td>
<a href="leave?zzg=view&id=${task.id }" target="_blank">审核</a>
<a href="leave?zzg=confirm&id=${task.id }&name=${task.assignee}">批准</a>
<a href="leave?zzg=dissent&id=${task.id }&name=${task.assignee}">不批准</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
8.在webapp目录下创建一个view.jsp文件,用来显示请假内容
Java代码 <contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="><html>
<head>
<title>审核</title>
</head>
<body>
<table width="300" border=1>
<tr>
<td><label>申请人</label></td>
<td>${map.name }</td>
</tr>
<tr>
<td><label>职位</label></td>
<td>${map.position }</td>
</tr>
<tr>
<td><label>申请时间</label></td>
<td>${map.time }</td>
</tr>
<tr>
<td><label>请假天数</label></td>
<td>${map.leaveDay }</td>
</tr>
<tr>
<td><label>请假内容</label></td>
<td>${map.content }</td>
</tr>
</table>
</body>
</html>
8.修改web.xml
Java代码
    <?xml version="1.0"encoding="UTF-8"?> <web-app id="WebApp_ID"version="2.4"xmlns="xml/ns/j2ee"xmlns:xsi="2001/XMLSchema-instance"xsi:schemaLocation="xml/ns/j2ee xml/ns/j2ee/web-app_2_4.xsd"> <display-name>LeaveJbpm</display-name> <servlet> <description> </description> <display-name>LeaveServlet</display-name> <servlet-name>LeaveServlet</servlet-name> <servlet-class> zzg.LeaveServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LeaveServlet</servlet-name> <url-pattern>/leave</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
9.把leave.jpdl.xml文件压缩成zip文件发布即可。
(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
用户名: 验证码: 点击我更换图片
栏目列表
推荐内容
中国法律网 版权所有 邮箱:service@5Law.cn 建议使用:1024x768分辨率,16位以上颜色 | 京ICP备2023040428号-1联系我们 有事点这里    [切换城市▲] 公司法
400-8919-913 工作日:9:00-18:00
周 六:9:00-12:00

法律咨询5分钟内回复
请用微信扫描二维码
关闭

关注网站CEO微信,与CEO对话