环境 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