初学JBPM—简单的请假流程
http://hi.csdn.net/attachment/201005/9/0_1273414648cCCZ.gif这是简单的流程图
下面是配置文件:
<?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;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {process(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {process(req, resp);}@Overridepublic 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();}}
页:
[1]