环境 Eclipse(ee版),tomcat6.0,jdk1.6
今天初学jbpm4 ,记录下过程,下面代码参考临远老师的视屏。
这个是公司请假流程图
第一个task 申请:expression #{owner}
经理审批 :expression manager
老板审批:expression boss
decision : expression #{day >3 ? '老板审批' : '结束'}
leave.jpdl.xml
<?xml version="1.0" encoding="UTF-8"?> <process name="leave" xmlns="http://jbpm.org/4.4/jpdl"> <start g="156,26,68,57" name="start1"> <transition to="申请"/> </start> <task assignee="#{owner}" form="request.jsp" g="136,128,92,54" name="申请"> <transition to="经理审批"/> </task> <task assignee="manager" form="manager.jsp" g="131,219,98,55" name="经理审批"> <transition g="-34,-9" name="批准" to="exclusive1"/> <transition g="308,247;312,156:-45,-22" name="驳回" to="申请"/> </task> <decision expr="#{day >3 ? '老板审批' : '结束'}" g="152,318,65,56" name="exclusive1"> <transition g="-28,-8" name="结束" to="end1"/> <transition g="-30,-22" name="老板审批" to="老板审批"/> </decision> <task assignee="boss" form="boss.jsp" g="284,334,82,62" name="老板审批"> <transition to="end1"/> </task> <end g="157,408,72,52" name="end1"/> </process>
首先是login.jsp
<form action="doLogin.jsp"> 用户名:<input type="text" name="username"/> <button type="submit">登入</button> </form>
doLogin.jsp
<% String username=request.getParameter("username"); session.setAttribute("username",username); response.sendRedirect("index.jsp"); %>
index.jsp
<% ProcessEngine processEngine=Configuration.getProcessEngine(); RepositoryService repositoryService=processEngine.getRepositoryService(); ExecutionService executionService=processEngine.getExecutionService(); TaskService taskService=processEngine.getTaskService(); String username=(String)session.getAttribute("username"); List<ProcessDefinition> list=repositoryService.createProcessDefinitionQuery().list(); List<ProcessInstance> piList=executionService.createProcessInstanceQuery().list(); List<Task> taskList=taskService.findPersonalTasks(username); %> <body> <a href="deploy.jsp">deploy new process</a><br>[username: <%=username %>]<a href="login.jsp">登入</a> <table> <tr><td> 流程定义</td></tr> <tr> <td>ID:</td> <td>流程名:</td> <td>Version:</td> </tr> <% for(ProcessDefinition pd : list) { %> <tr> <td><%=pd.getId()%></td> <td><%=pd.getName()%></td> <td><%=pd.getVersion() %></td> <td> <a href="remove.jsp?id=<%=pd.getDeploymentId() %>">remove</a> |||| <a href="start.jsp?id=<%=pd.getId() %>">start</a> </td> </tr> <% } %> </table> <table> <tr><td>流程实例</td></tr> <tr> <td>ID:</td> <td>activity:</td> <td>state:</td> </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() %>">view</a> --> </td> </tr> <% } %> </table> <table> <tr><td>代办任务</td></tr> <tr> <td>ID:</td> <td>name:</td> </tr> <% for(Task task : taskList) { %> <tr> <td><%=task.getId()%></td> <td><%=task.getName()%></td> <td> //读取form的内容 <a href="<%=task.getFormResourceName() %>?id=<%=task.getId() %>">view</a> </td> </tr> <% } %> </table> </body>
点击deploy new process,发布新流程定义
deploy.jsp
<% //发布新流程 ProcessEngine processEngine=Configuration.getProcessEngine(); RepositoryService repositoryService=processEngine.getRepositoryService(); repositoryService.createDeployment().addResourceFromClasspath("leave.jpdl.xml").deploy(); response.sendRedirect("index.jsp"); %>
点击start,启动新的流程实例
start.jsp
<% ProcessEngine processEngine=Configuration.getProcessEngine(); ExecutionService executionService=processEngine.getExecutionService(); Map<String,Object> map=new HashMap<String,Object>();
//将用户名给了owner map.put("owner",session.getAttribute("username")); executionService.startProcessInstanceById(request.getParameter("id"),map); response.sendRedirect("index.jsp"); %>
user 申请:request.jsp
<body> <fieldset> <legend>申请表</legend> <form action="submit.jsp" method="post""> <input type="hidden" name="taskId" value="${param.id}"> 申请人:<input type="text" name="owner" value="${sessionScope['username']}"><br> 请假时间:<input type="text" name="day" value=""/><br> 申请原因:<textarea name="reason"></textarea><br> <input type="submit"/> </form> </fieldset> </body>
完成申请:submit.jsp
<% ProcessEngine processEngine=Configuration.getProcessEngine(); TaskService taskService=processEngine.getTaskService(); String taskId=request.getParameter("taskId"); String owner=request.getParameter("owner"); int day=Integer.parseInt(request.getParameter("day")); String reason=request.getParameter("reason"); Map<String,Object> map=new HashMap<String,Object>(); map.put("day",day); map.put("reason",reason); //没用名称的外向转移,map作为变量进入流程 taskService.completeTask(taskId,map); response.sendRedirect("index.jsp"); %>
流程进入 经理审批:使用用户名为manager登入,进入该流程 manager.jsp
<% ProcessEngine processEngine=Configuration.getProcessEngine(); TaskService taskService=processEngine.getTaskService(); String taskId=request.getParameter("id"); Task task=taskService.getTask(taskId); %> <body> <table> <tr><td>经理审核</td></tr> </table> <form action="submit_manager.jsp" method="post"> <input type="hidden" name="taskId" value="${param.id}"/> 申请人:<%=taskService.getVariable(taskId,"owner") %><br> 申请时间:<%=taskService.getVariable(taskId,"day") %><br> 申请原因:<%=taskService.getVariable(taskId,"reason") %><br> <input name="result" type="submit" value="批准"> <input name="result" type="submit" value="驳回"> </form> </body>
然后完成经理审批:submit_manger.jsp
<% String result=new String(request.getParameter("result").getBytes("iso8859_1"), "utf-8"); //System.out.println("resutlt:"+result); ProcessEngine processEngine=Configuration.getProcessEngine(); TaskService taskService=processEngine.getTaskService(); String taskId=request.getParameter("taskId"); taskService.completeTask(taskId,result); response.sendRedirect("index.jsp"); %>
在这里有流程的驳回和批准,通过从manager.jsp中传进来的result的值来判断执行哪条
taskService.completeTask(taskId,result);有名字的外向转移。
如果day<=3 这所有的路程结束,反之,进入老板审批:boss.jsp
<% ProcessEngine processEngine=Configuration.getProcessEngine(); TaskService taskService=processEngine.getTaskService(); String taskId=request.getParameter("id"); Task task=taskService.getTask(taskId); %> <body> <table> <tr><td>老板审核</td></tr> </table> <form action="submit_boss.jsp" method="post"> <input type="hidden" name="taskId" value="${param.id}"/> 申请人:<%=taskService.getVariable(taskId,"owner") %><br> 申请时间:<%=taskService.getVariable(taskId,"day") %><br> 申请原因:<%=taskService.getVariable(taskId,"reason") %><br> <input name="result" type="submit" value="批准"> </form> </body>
submit_boss.jsp 完成审批
<% ProcessEngine processEngine=Configuration.getProcessEngine(); TaskService taskService=processEngine.getTaskService(); String taskId=request.getParameter("taskId"); taskService.completeTask(taskId); response.sendRedirect("index.jsp"); %>
这里taskService.completeTask(taskId);没用名称的外向转移,且没有要传入的变量
以上过程遇到的问题
建立环境时,由于是tomcat6.0版本的,有jar包的冲突,将项目中jbpm的juel-api.jar,juel-impl.jar,juel-engine.jar 三个包移到tomcat lib下
在使用taskService.completeTask时,会遇到No unnamed transitions were found for the task 'XXX
具体参考http://www.family168.com/tutorial/jbpm4.0/html/services.html#taskservice