初学JBPM—简单的请假流程

初学JBPM—简单的请假流程

这是简单的流程图

下面是配置文件:

<?xml version="1.0" encoding="UTF-8"?> <process name="leave" xmlns="http://jbpm.org/4.3/jpdl"> <start g="240,0,48,48" name="start1"> <transition g="-22,-22" name="开始" to="请假申请"/> </start> <task assignee="zhangsan" g="224,133,92,52" name="请假申请"> <transition g="-30,-14" name="是否是经理" to="领导判断"/> </task> <decision expr="${manager}" g="237,262,48,48" name="领导判断"> <transition g="-37,-7" name="no" to="经理审批"/> <transition g="-3,-15" name="yes" to="老板审批"/> </decision> <task assignee="jingli" g="18,357,92,52" name="经理审批"> <transition g="-34,-5" name="是否超过3天" to="天数判断"/> </task> <task assignee="laoban" g="470,380,92,52" name="老板审批"> <transition g="-2,-10" name="老板审批通过" to="结束"/> </task> <end g="392,515,48,48" name="结束"/> <decision expr="${day>3? '大于3天':'小于3天'}" g="244,390,48,48" name="天数判断"> <transition g="-24,-7" name="小于3天" to="结束"/> <transition g="-33,-22" name="大于3天" to="老板审批"/> </decision> </process>

JBPM的核心:

ProcessEngieen 流程引擎

RepositoryServoce 主要用于发布流程定义

ExecutionService 流程执行服务

TaskService 主要是任务服务

一下是主要的逻辑:

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="org.jbpm.api.*"%> <%@page import="java.util.*"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!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> <h3><a href="leave?param=deploy" mce_href="leave?param=deploy">发布流程</a></h3> <h3><a href="leave?param=leave&name=zhangsan" mce_href="leave?param=leave&name=zhangsan">请假</a></h3> <h3><a href="leave?param=task&name=jingli" mce_href="leave?param=task&name=jingli" target="_blank">经理待办</a></h3> <h3><a href="leave?param=task&name=laoban" mce_href="leave?param=task&name=laoban" target="_blank">老板待办</a></h3> <table border="1" style="width: 800px;"> <tr align="center"> <td colspan="5">流程定义</td> </tr> <tr> <td>ID</td> <td>KEY</td> <td>名称</td> <td>版本</td> <td>操作</td> </tr> <c:forEach items="${pdList}" var="process"> <tr> <td>${process.id }</td> <td>${process.key }</td> <td>${process.name }</td> <td>${process.version }</td> <td><a href="leave?param=remove&processId=${process.id }" mce_href="leave?param=remove&processId=${process.id }">移除</a></td> </tr> </c:forEach> </table> <br> <br> <br> <table border="1" style="width: 800px;"> <tr align="center"> <td colspan="4">流程实例</td> </tr> <tr> <td>ID</td> <td>Key</td> <td>状态</td> <td>查看流程图</td> </tr> <c:forEach items="${piList}" var="pi"> <tr> <td>${pi.id }</td> <td>${pi.key }</td> <td>${pi.state }</td> <td><a href="image.jsp?id=${pi.id}" mce_href="image.jsp?id=${pi.id}" target="_blank">查看流程图</a></td> </tr> </c:forEach> </table> </body> </html>

task.jsp

<%@page contentType="text/html;charset=UTF-8" %> <%@page import="org.jbpm.api.*" %> <%@page import="java.util.*" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <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?param=confirm&taskId=${task.id }&name=${task.assignee}" mce_href="leave?param=confirm&taskId=${task.id }&name=${task.assignee}">批准</a> </td> </tr> </c:forEach> </table> </body> </html>

逻辑处理全写在一个servlet里面

package cn.com; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipInputStream; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jbpm.api.Configuration; import org.jbpm.api.Execution; import org.jbpm.api.ExecutionService; import org.jbpm.api.ProcessDefinition; import org.jbpm.api.ProcessEngine; import org.jbpm.api.ProcessInstance; import org.jbpm.api.RepositoryService; import org.jbpm.api.TaskService; import org.jbpm.api.task.Task; public class LeaveServlet extends HttpServlet { /** * 流程操作 */ private static final long serialVersionUID = 1L; private ProcessEngine processEngine = null; private RepositoryService repositoryService = null; private List<ProcessDefinition> pdList = null; private ProcessInstance processInstance = null; private List<ProcessInstance> piList = null; private ExecutionService executionService = null; private TaskService taskService = null; private List<Task> taskList = null; private Task task = null; private Execution execution = null; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(req, resp); } @Override public void init(ServletConfig config) throws ServletException { super.init(); processEngine = Configuration.getProcessEngine(); repositoryService = processEngine.getRepositoryService(); executionService = processEngine.getExecutionService(); taskService = processEngine.getTaskService(); } protected void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String param = req.getParameter("param"); if (param.equals("deploy")) { deploy(req, resp); pdList = repositoryService.createProcessDefinitionQuery().list(); req.setAttribute("pdList", pdList); req.getRequestDispatcher("/index.jsp").forward(req, resp); } if (param.equals("remove")) { remove(req, resp); pdList = repositoryService.createProcessDefinitionQuery().list(); req.setAttribute("pdList", pdList); req.getRequestDispatcher("/index.jsp").forward(req, resp); } if (param.equals("leave")) { leave(req, resp); req.setAttribute("piList", getProcessInstance(req, resp)); req.getRequestDispatcher("/index.jsp").forward(req, resp); } if (param.equals("task")) { req.setAttribute("taskList", getTask(req, resp)); req.getRequestDispatcher("/task.jsp").forward(req, resp); } if (param.equals("confirm")) { confirm(req, resp); req.setAttribute("taskList", getTask(req, resp)); req.getRequestDispatcher("/task.jsp").forward(req, resp); } } // 发布流程 protected void deploy(HttpServletRequest req, HttpServletResponse resp) { // repositoryService.createDeployment().addResourceFromClasspath( // "leave.jpdl.xml").deploy(); ZipInputStream zis = new ZipInputStream(this.getClass() .getResourceAsStream("/leave.zip")); repositoryService.createDeployment() .addResourcesFromZipInputStream(zis).deploy(); } // 删除已发布流程 protected void remove(HttpServletRequest req, HttpServletResponse resp) { String processId = req.getParameter("processId"); repositoryService.deleteDeployment(processId); } // 请假 protected void leave(HttpServletRequest req, HttpServletResponse resp) { processInstance = executionService.startProcessInstanceByKey("leave"); String name = req.getParameter("name"); piList = executionService.createProcessInstanceQuery().list(); Map<String, Object> map = new HashMap<String, Object>(); map.put("day", 2); map.put("manager", "no"); taskService.setVariables(taskService.findPersonalTasks("zhangsan").get( 0).getId(), map); taskService.completeTask(taskService.findPersonalTasks("zhangsan").get( 0).getId()); } // 经理审批 protected void confirm(HttpServletRequest req, HttpServletResponse resp) { String taskId = req.getParameter("taskId"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if (execution.getProcessInstance().isActive("经理审批")) { Map<String, Object> map = new HashMap<String, Object>(); map.put("day", 4); taskService.setVariables(taskId, map); taskService.completeTask(taskId); }else if(execution.getProcessInstance().isActive("老板审批")){ taskService.completeTask(taskId); } } // 获取任务列表 protected List<Task> getTask(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); taskList = taskService.findPersonalTasks(name); return taskList; } // 获取流程实例 protected List<ProcessInstance> getProcessInstance( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { return executionService.createProcessInstanceQuery().list(); } }