在开始实例之前需安装JBPM4开发环境和所需数据库(百度搜索安装)
1:画流程图和生成png图片;![](https://img-blog.csdn.net/20160302145116812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
<?xml version="1.0" encoding="UTF-8"?>
<process name="leave" xmlns="http://jbpm.org/4.4/jpdl">
<start g="214,37,48,48" name="start1">
<transition g="-47,-17" name="to 申请" to="申请"/>
</start>
<task assignee="#{owner}" form="request.html" g="192,126,92,52" name="申请">
<transition g="-71,-17" name="to 经理审批" to="经理审批"/>
</task>
<task assignee="manager" form="manager.html" g="194,241,92,52" name="经理审批">
<transition g="-29,-14" name="批准" to="exclusive1"/>
<transition g="105,267;103,152:-47,-17" name="驳回" to="申请"/>
</task>
<decision expr="#{day > 3 ? '老板审批' : '结束'}" g="218,342,48,48" name="exclusive1">
<transition g="415,367:-47,-17" name="老板审批" to="老板审批"/>
<transition g="-31,-16" name="结束" to="end1"/>
</decision>
<end g="219,499,48,48" name="end1"/>
<task assignee="boss" form="boss.html" g="370,408,92,52" name="老板审批">
<transition g="415,524:-91,-18" name="结束" to="end1"/>
</task>
</process>
2:发布流程图;
ProcessEngine processEngine=Configuration.getProcessEngine();
RepositoryService repositoryService=processEngine.getRepositoryService();
try{
String file="J:/leave.zip";
//将zip文件封装到IO流里
System.out.println(new File(file));
InputStream is= new FileInputStream(new File(file));
ZipInputStream zis=new ZipInputStream(is);
//将zip流程文件发布到pvm(流程虚拟机中,它会把zip包中的xml文件和png图片存储到数据库)
repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
zis.close();
is.close();
3启动流程
首先要获取已发布流程列表:
public List<ProcessDefinition> getProcessDefinitions() {
return repositoryService.createProcessDefinitionQuery().list();
}
<s:iterator value="processDefinitions" var="dfinition">
<tr>
<td>
${id }
</td>
<td>
${deploymentId }
</td>
<td>
${key }
</td>
<td>
${name }
</td>
<td>
${version }
</td>
<td>
<a href="undeploy.html?id=${deploymentId }">删除流程</a>
</td>
<td>
<a href="start.html?id=${id }">启动流程</a>
</td>
</tr>
</s:iterator>
获取流程id,给“owner”赋值
Map map = new HashMap<String, Object>();
map.put("owner", ActionContext.getContext().getSession().get("role"));
ProcessEngine processEngine=Configuration.getProcessEngine();
//流程实例服务
ExecutionService executionService=processEngine.getExecutionService();
executionService.startProcessInstanceById(id, map);//启动流程
4:用户待办任务
ProcessEngine processEngine=Configuration.getProcessEngine();
//任务引擎
TaskService taskService=processEngine.getTaskService();
//当前用户代办任务集合
taskService.findPersonalTasks(roleName);
<s:iterator value="tasks" var="task">
<tr>
<td>
<s:property value="#task.id" />
</td>
<td>
<s:property value="#task.key" />
</td>
<td>
<s:property value="#task.name" />
</td>
<td>
<s:property value="#task.activityName" />
</td>
<td>
<s:property value="#task.assignee" />
</td>
<td>
<a href="${formResourceName }?id=${id}">办理</a>//跳转到request.html页面
</td>
</tr>
</s:iterator>
-------------request.jsp页面
<form action="submit.html" method="post">
<input type="hidden" name="processDto.taskId" value="${param.id}">
<!-- 此处的owner与day两个name值要与流程图中定义的一致,owner是在xml中定义的变量,不属于具体登陆者 -->
申请人:
<input type="text" name="processDto.owner" value="${user}" />
<br />
请假时间:
<input type="text" name="processDto.day" value="" />
<br />
请假原因:
<textarea name="processDto.reason"></textarea>
<br />
<input type="submit" />
</form>
map = new HashMap<String, Object>();
map.put("owner", processDto.getOwner());
map.put("day", Integer.parseInt(processDto.getDay()));
map.put("reason", processDto.getReason());
map.put("name", processDto.getOwner());
taskService.setVariables(processDto.getTaskId(), map);
taskService.completeTask(processDto.getTaskId());//申请环节完成
----经理审批环节
根据“manager”角色获取待办任务
taskService.findPersonalTasks(roleName);
------进入manager.jsp
<fieldset>
<legend>
经理审核 username: ${user } param.id:${param.id }
</legend>
<form action="submitManager.html" method="post">
<input type="hidden" name="id" value="${param.id}">
申请人:
<s:property value="map['owner']" />
<br />
请假时间:
<s:property value="map['day']" />
<br />
请假原因:
<s:property value="map['reason']" />
<br />
姓名:
<s:property value="map['name']" />
<br />
<input name="result" type="submit" value="批准" />
<input name="result" type="submit" value="驳回" />
</form>
</fieldset>
taskService.completeTask(id, result);--经理审批结束“result”代表“批准”和“驳回”
--如果请假天数大于三天,转由老板审批,否则结束
taskService.findPersonalTasks(roleName);//获取老板待办任务
Task task = taskService.getTask(id);
String taskId = task.getId();
Set<String> strSet = new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
strSet.add("age");
strSet.add("address");
return taskService.getVariables(taskId, strSet);--进入boss办理页面
<form action="submitBoss.html" method="post">
<input type="hidden" name="id" value="${param.id}">
申请人:
<s:property value="map['owner']" />
<br />
请假时间:
<s:property value="map['day']" />
<br />
请假原因:
<s:property value="map['reason']" />
<br />
姓名:
<s:property value="map['name']" />
<br />
性别:
<s:property value="map['sex']" />
<br />
年龄:
<s:property value="map['address']" />
<br />
<input type="submit" />
</form>
taskService.completeTask(id);//boss完成审批