初学JBPM—简单的请假流程

来源:互联网 发布:java项目实战百度云 编辑:程序博客网 时间:2024/04/27 18:29
 分类: JBPM

这是简单的流程图

下面是配置文件:

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

JBPM的核心:

ProcessEngieen 流程引擎

RepositoryServoce 主要用于发布流程定义

ExecutionService 流程执行服务

TaskService 主要是任务服务

一下是主要的逻辑:

index.jsp

[xhtml] view plaincopyprint?
  1. <%@ page language="java"contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@page import="org.jbpm.api.*"%>
  4. <%@page import="java.util.*"%>
  5. <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  7. <html>
  8. <head>
  9. <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
  10. <title>Insert title here</title>
  11. </head>
  12. <body>
  13. <h3><ahref="leave?param=deploy" mce_href="leave?param=deploy">发布流程</a></h3>
  14. <h3><ahref="leave?param=leave&name=zhangsan" mce_href="leave?param=leave&name=zhangsan">请假</a></h3>
  15. <h3><ahref="leave?param=task&name=jingli" mce_href="leave?param=task&name=jingli" target="_blank">经理待办</a></h3>
  16. <h3><ahref="leave?param=task&name=laoban" mce_href="leave?param=task&name=laoban" target="_blank">老板待办</a></h3>
  17. <table border="1"style="width: 800px;">
  18. <tr align="center">
  19. <td colspan="5">流程定义</td>
  20. </tr>
  21. <tr>
  22. <td>ID</td>
  23. <td>KEY</td>
  24. <td>名称</td>
  25. <td>版本</td>
  26. <td>操作</td>
  27. </tr>
  28. <c:forEach items="${pdList}"var="process">
  29. <tr>
  30. <td>${process.id }</td>
  31. <td>${process.key }</td>
  32. <td>${process.name }</td>
  33. <td>${process.version }</td>
  34. <td><ahref="leave?param=remove&processId=${process.id }"mce_href="leave?param=remove&processId=${process.id }">移除</a></td>
  35. </tr>
  36. </c:forEach>
  37. </table>
  38. <br>
  39. <br>
  40. <br>
  41. <table border="1"style="width: 800px;">
  42. <tr align="center">
  43. <td colspan="4">流程实例</td>
  44. </tr>
  45. <tr>
  46. <td>ID</td>
  47. <td>Key</td>
  48. <td>状态</td>
  49. <td>查看流程图</td>
  50. </tr>
  51. <c:forEach items="${piList}"var="pi">
  52. <tr>
  53. <td>${pi.id }</td>
  54. <td>${pi.key }</td>
  55. <td>${pi.state }</td>
  56. <td><ahref="image.jsp?id=${pi.id}" mce_href="image.jsp?id=${pi.id}"target="_blank">查看流程图</a></td>
  57. </tr>
  58. </c:forEach>
  59. </table>
  60. </body>
  61. </html>

task.jsp

[xhtml] view plaincopyprint?
  1. <%@page contentType="text/html;charset=UTF-8"%>
  2. <%@page import="org.jbpm.api.*"%>
  3. <%@page import="java.util.*"%>
  4. <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
  5. <html>
  6. <head>
  7. <title>请假审批</title>
  8. </head>
  9. <body>
  10. <table width=600border=1>
  11. <tr><tdcolspan="8">任务列表</td></tr>
  12. <tr>
  13. <td>ID</td>
  14. <td>名称</td>
  15. <td>分配人</td>
  16. <td>创建时间</td>
  17. <td>持续时间</td>
  18. <td>优先级</td>
  19. <td>描述</td>
  20. <td>操作</td>
  21. </tr>
  22. <c:forEach var="task"items="${taskList}">
  23. <tr>
  24. <td>${task.id}</td>
  25. <td>${task.name}</td>
  26. <td>${task.assignee}</td>
  27. <td>${task.createTime}</td>
  28. <td>${task.duedate}</td>
  29. <td>${task.priority}</td>
  30. <td>${task.description}</td>
  31. <td>
  32. <a href="leave?param=confirm&taskId=${task.id }&name=${task.assignee}"mce_href="leave?param=confirm&taskId=${task.id }&name=${task.assignee}">批准</a>
  33. </td>
  34. </tr>
  35. </c:forEach>
  36. </table>
  37. </body>
  38. </html>

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

[java] view plaincopyprint?
  1. package cn.com;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.zip.ZipInputStream;
  7. import javax.servlet.ServletConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import org.jbpm.api.Configuration;
  13. import org.jbpm.api.Execution;
  14. import org.jbpm.api.ExecutionService;
  15. import org.jbpm.api.ProcessDefinition;
  16. import org.jbpm.api.ProcessEngine;
  17. import org.jbpm.api.ProcessInstance;
  18. import org.jbpm.api.RepositoryService;
  19. import org.jbpm.api.TaskService;
  20. import org.jbpm.api.task.Task;
  21. public class LeaveServlet extends HttpServlet {
  22. private static final longserialVersionUID = 1L;
  23. private ProcessEngine processEngine = null;
  24. private RepositoryService repositoryService =null;
  25. private List<ProcessDefinition> pdList = null;
  26. private ProcessInstance processInstance = null;
  27. private List<ProcessInstance> piList = null;
  28. private ExecutionService executionService = null;
  29. private TaskService taskService = null;
  30. private List<Task> taskList = null;
  31. private Task task = null;
  32. private Execution execution = null;
  33. @Override
  34. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  35. throws ServletException, IOException {
  36. process(req, resp);
  37. }
  38. @Override
  39. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  40. throws ServletException, IOException {
  41. process(req, resp);
  42. }
  43. @Override
  44. public void init(ServletConfig config)throws ServletException {
  45. super.init();
  46. processEngine = Configuration.getProcessEngine();
  47. repositoryService = processEngine.getRepositoryService();
  48. executionService = processEngine.getExecutionService();
  49. taskService = processEngine.getTaskService();
  50. }
  51. protected void process(HttpServletRequest req, HttpServletResponse resp)
  52. throws ServletException, IOException {
  53. String param = req.getParameter("param");
  54. if (param.equals("deploy")) {
  55. deploy(req, resp);
  56. pdList = repositoryService.createProcessDefinitionQuery().list();
  57. req.setAttribute("pdList", pdList);
  58. req.getRequestDispatcher("/index.jsp").forward(req, resp);
  59. }
  60. if (param.equals("remove")) {
  61. remove(req, resp);
  62. pdList = repositoryService.createProcessDefinitionQuery().list();
  63. req.setAttribute("pdList", pdList);
  64. req.getRequestDispatcher("/index.jsp").forward(req, resp);
  65. }
  66. if (param.equals("leave")) {
  67. leave(req, resp);
  68. req.setAttribute("piList", getProcessInstance(req, resp));
  69. req.getRequestDispatcher("/index.jsp").forward(req, resp);
  70. }
  71. if (param.equals("task")) {
  72. req.setAttribute("taskList", getTask(req, resp));
  73. req.getRequestDispatcher("/task.jsp").forward(req, resp);
  74. }
  75. if (param.equals("confirm")) {
  76. confirm(req, resp);
  77. req.setAttribute("taskList", getTask(req, resp));
  78. req.getRequestDispatcher("/task.jsp").forward(req, resp);
  79. }
  80. }
  81. // 发布流程
  82. protected void deploy(HttpServletRequest req, HttpServletResponse resp) {
  83. // repositoryService.createDeployment().addResourceFromClasspath(
  84. // "leave.jpdl.xml").deploy();
  85. ZipInputStream zis = new ZipInputStream(this.getClass()
  86. .getResourceAsStream("/leave.zip"));
  87. repositoryService.createDeployment()
  88. .addResourcesFromZipInputStream(zis).deploy();
  89. }
  90. // 删除已发布流程
  91. protected void remove(HttpServletRequest req, HttpServletResponse resp) {
  92. String processId = req.getParameter("processId");
  93. repositoryService.deleteDeployment(processId);
  94. }
  95. // 请假
  96. protected void leave(HttpServletRequest req, HttpServletResponse resp) {
  97. processInstance = executionService.startProcessInstanceByKey("leave");
  98. String name = req.getParameter("name");
  99. piList = executionService.createProcessInstanceQuery().list();
  100. Map<String, Object> map = new HashMap<String, Object>();
  101. map.put("day", 2);
  102. map.put("manager", "no");
  103. taskService.setVariables(taskService.findPersonalTasks("zhangsan").get(
  104. 0).getId(), map);
  105. taskService.completeTask(taskService.findPersonalTasks("zhangsan").get(
  106. 0).getId());
  107. }
  108. // 经理审批
  109. protected void confirm(HttpServletRequest req, HttpServletResponse resp) {
  110. String taskId = req.getParameter("taskId");
  111. task = taskService.getTask(taskId);
  112. execution = executionService.findExecutionById(task.getExecutionId());
  113. if (execution.getProcessInstance().isActive("经理审批")) {
  114. Map<String, Object> map = new HashMap<String, Object>();
  115. map.put("day", 4);
  116. taskService.setVariables(taskId, map);
  117. taskService.completeTask(taskId);
  118. }else if(execution.getProcessInstance().isActive("老板审批")){
  119. taskService.completeTask(taskId);
  120. }
  121. }
  122. // 获取任务列表
  123. protected List<Task> getTask(HttpServletRequest request,
  124. HttpServletResponse response) throws ServletException, IOException {
  125. String name = request.getParameter("name");
  126. taskList = taskService.findPersonalTasks(name);
  127. return taskList;
  128. }
  129. // 获取流程实例
  130. protected List<ProcessInstance> getProcessInstance(
  131. HttpServletRequest request, HttpServletResponse response)
  132. throws ServletException, IOException {
  133. return executionService.createProcessInstanceQuery().list();
  134. }
  135. }