一. 请假流程如下图,即:申请人申请-->部门负责人审批-->人事部审批-->申请人归档
对应的xml文件为:
<?xml version="1.0" encoding="UTF-8"?>
<process name="flowTest" xmlns="http://jbpm.org/4.3/jpdl">
<start g="58,45,48,48" name="开始">
<transition g="-81,-22" name="to 申请人申请" to="申请人申请"/>
</start>
<task g="279,40,92,52" name="申请人申请">
<assignment-handler class="jbpm.TaskAssignment">
</assignment-handler>
<transition g="-105,-22" name="to 部门负责人审批" to="部门负责人审批"/>
</task>
<task g="591,48,114,52" name="部门负责人审批">
<assignment-handler class="jbpm.TaskAssignment">
</assignment-handler>
<transition g="-81,-22" name="to 人事部审批" to="人事部审批"/>
</task>
<task g="606,152,92,52" name="人事部审批">
<assignment-handler class="jbpm.TaskAssignment">
</assignment-handler>
<transition g="-81,-22" name="to 申请人归档" to="申请人归档"/>
</task>
<task g="334,153,92,52" name="申请人归档">
<assignment-handler class="jbpm.TaskAssignment">
</assignment-handler>
<transition g="-50,-22" name="to end1" to="结束"/>
</task>
<end g="65,150,48,48" name="结束"/>
</process>
二. 管理员登录系统,设置部门与人员信息如下:
张三(zhangsan) -- 研发部(员工)
朱孝敏(zxm) -- 研发部(负责人)
周慧(zhouhui) -- 人事部
三. 管理员部署程序:
String deploymentId = processEngine.getRepositoryService()
.createDeployment()
.addResourceFromClasspath(resourceName)
.deploy();
四. 请假流程:
1. 步骤1 : 张三发起流程申请
发起流程主要逻辑:
(1)获取当前登录用户的信息,用于页面显示
(2)启动流程时,将当前信息存入
(3)根据当前节点,获得下一步的节点信息,以及下一步节点的参与者
public String start() throws Exception{
date = new Date();
// 获得当前登录用户信息
User curLoginUser = WebUtils.getLoginUser(request);
if(curLoginUser==null){
return "error";
}
userName = curLoginUser.getUserName();
Department dept = (Department)getCommonService().get(Department.class, curLoginUser.getDeptId());
deptName = dept.getDeptName();
// 启动流程时存入当前用户信息
Map<String,Object> initData = new HashMap<String,Object>();
initData.put(Constants.FLOW_CUR_USER, curLoginUser.getLoginName());
processInstance = getJbpmService().startProcessByKey(processKey,initData);
if(processInstance!=null){
// 流程定义
processDefinitionId = processInstance.getProcessDefinitionId();
processDefinition = getJbpmService().getProcessDefinition(processDefinitionId);
curTask = getJbpmService().getCurTask(processInstance.getId());
if(curTask!=null){
taskId = curTask.getId();
executionId = curTask.getExecutionId();
}
curActivity = getJbpmService().getCurActivity(processInstance.getId());
List<Transition> transitions = curActivity.getOutgoingTransitions();
// 此处只取第一个(测试代码,假设只有一个outgoing)
if(transitions!=null&&transitions.size()>0){
Transition transition = transitions.get(0);
nextActivity = transition.getDestination();
}
userList = getCommonService().getLeaders(curLoginUser);
}
return "start";
}
张三输入申请信息之后,提交流程,后台的主要逻辑是:
(1)将下一节点的参与者存入流程
(2)新建表单对象FormData ,存储输入的申请信息,(FormData与流程id关联)
(3)根据用户的勾选(下一步 or 退回)进行处理
2. 步骤2:部门负责人(朱孝敏)登录,在待办公文中可以看到待办任务,
TaskService的findPersonalTasks方法,可以根据用户名获取该用户的待办任务。
点击“处理”链接,进行流程审批,此处的逻辑是:
(1)获得表单信息以及对应的审批信息
(2)根据当前任务获得下一节点信息,取得对应的任务执行者
(3)获得可退回节点信息(即已执行的节点信息)
public String edit() throws Exception{
// 1. 表单信息
formData = (FormData)getCommonService().get(FormData.class, formDataId);
spDataList = getCommonService().findAll(SpData.class, " formDataId = '"+formDataId+"' ");
// 2. 流程定义
processDefinition = getJbpmService().getProcessDefinition(processDefinitionId);
// 3. 流程的可流转信息
curTask = getJbpmService().getCurTask(processInstanceId);
/**
* 处理的关键:下一步信息(节点,人员) ; 退回信息(全部节点--人员)
*/
// 4. 下一步
nextNodeUserInfo = new HashMap<String,Object>();
String nextActivityName = "";
curActivity = getJbpmService().getCurActivity(processInstanceId);
List<Transition> transitions = curActivity.getOutgoingTransitions();
// 此处只取第一个
if(transitions!=null&&transitions.size()>0){
Transition transition = transitions.get(0);
Activity destination = transition.getDestination();
if(destination!=null){
nextActivityName = destination.getName();
}
// 根据下一节点,获得人员信息
List<User> userList = getCommonService().getUserList(nextActivityName,processInstanceId);
nextNodeUserInfo.put(nextActivityName, userList);
}
// 5. 可退回步骤
Activity firstActivity = getJbpmService().getAllActivities(processInstanceId).get(1);
if(firstActivity.getName().contains(curTask.getActivityName())){
ifCanBack = 0;
}else{
ifCanBack = 1;
}
if(ifCanBack.intValue()==1){
canBackNames = getJbpmService().getBeforeNodeNames(processInstanceId, "");
}
return "edit";
}
部门负责人输入审批意见后进行
退回操作,页面如下图:
提交之后,流程退回到张三处,张三登录系统,查看待办公文:
进入之后,可以看到部门负责人的审批信息;然后其输入对应内容,再次提交到部门负责人处。
步骤3:部门负责人登录之后,同意该请假,提交到人事部审批;
步骤4:人事部(周慧)登录系统,可以查看到待办公文,并进行审批;
步骤5:人事部同意请假之后,申请人(张三)进行归档操作,流程结束。
说明:
1. 流程中每一个Task都配置assignment-handler来动态设置参与者,所以在提交时需要将下一节点的参与者传入流程中。
1.启动流程之后,流程进入到第一个节点
2.任务分配器TaskAssignment在第一个任务complete之后执行,所以,设置变量信息需要在complete方法执行之前完成。
2. 退回部分代码:根据jbpm4_hist_actinst /// jbpm4_hist_task 表获得流程中对应节点的历史参与者。
EnvironmentImpl envImpl = ((EnvironmentFactory)processEngine).openEnvironment();
try {
//动态回退
Task task = getTaskService().getTask(taskId);
ExecutionImpl e = (ExecutionImpl)getExecutionService().findExecutionById(task.getExecutionId());
ActivityImpl currentActivityImpl = e.getActivity();
ProcessDefinitionImpl processDefinitionImpl = currentActivityImpl.getProcessDefinition();
//生成一个transition
ActivityImpl destActivityImpl = processDefinitionImpl.findActivity(backActivityName); // 获取退回目的地的活动定义对象
TransitionImpl backTransition = currentActivityImpl.createOutgoingTransition();
backTransition.setSource(currentActivityImpl);
backTransition.setDestination(destActivityImpl);
//获得退回任务的历史参与者 (根据 jbpm4_hist_actinst /// jbpm4_hist_task 表获得 )
String user = getHistTaskUser(String.valueOf(e.getDbid()),backActivityName);
Map<String,Object> initData = new HashMap<String,Object>();
initData.put(Constants.FLOW_CUR_USER, user);
getTaskService().completeTask(taskId,initData);
} catch (Exception e) {
e.printStackTrace();
}finally{
envImpl.close();
}
分享到:
相关推荐
【标题】"JBPM视屏教程共9节 jBPM 4视频教程04设计请假流程"揭示了本次教程的核心内容,聚焦于企业业务流程管理(Business Process Management, BPM)工具jBPM的使用,特别是如何利用jBPM 4版本来设计一个具体的请假...
【jbpm4.4-demo】是一个基于jbpm4.4版本的完整演示项目,它包含了所有必要的组件和配置,使得用户可以直接下载并运行,体验一个请假流程的示例。jbpm(Java Business Process Management)是一个开源的工作流和业务...
【jbpm请假demo】是一个基于jbpm工作流引擎的示例应用,用于演示如何在实际开发环境中使用jbpm实现请假流程。jbpm是一款开源的业务流程管理(BPM)和工作流系统,它允许开发者创建、执行和管理复杂的业务流程。这个...
4. **jbpm4.4工具**: - **jbpm Designer**:图形化流程设计器,用于创建和编辑流程定义。 - **jbpm Console**:Web管理界面,用于监控流程实例、任务管理和日志查看。 - **jbpm Workbench**:集成了Designer和...
这个“jbpm4 完整的请假流程”是一个示例项目,旨在帮助初学者理解和实践jbpm4在处理业务流程,尤其是请假申请流程中的应用。在这个项目中,可能包含了流程定义、流程实例的创建与管理、任务分配与审批等一系列功能...
【jbpm4leave.zip_DEMO_java4leave_jbpm4lea_jbpm4leave_jbpm4leave.zi】是一个包含Java实现的Jbpm Demo的压缩包,它主要用于展示如何利用Jbpm来设计和执行一个简单的请假流程。这个Demo是针对开发者和对业务流程...
【jbpm4 s2sh 请假流程】是一个基于jbpm工作流引擎和SSH(Struts2、Spring、Hibernate)框架的简单示例应用,用于演示如何在Java Web环境中实现一个请假流程。在这个教程中,我们将深入理解jbpm4的工作原理以及如何...
jbpm官方demo通常会包含多个示例流程,如请假申请、报销审批等,这些例子展示了jbpm如何处理审批流程、条件分支、并行分支和循环等复杂逻辑。用户可以通过这些示例学习如何使用jbpm Designer设计流程图,然后通过...
SSH+jbpm4.4 Demo 是一个集成Spring Security(SSH)和jBPM 4.4的示例项目,主要用于展示如何在实际应用中结合这两个技术来实现业务流程管理。SSH,即Spring Security,是一个强大的安全框架,用于保护Java应用程序...
4. **数据库**:存储请假申请、审批状态等信息,以及jbpm的工作流实例和任务数据。 5. **审批角色**:不同的审批角色(如直属上司、人事部门等)在流程中扮演不同角色,进行审批操作。 6. **通知机制**:当审批...
【JBPM工作流DEMO】是一个关于使用JBPM(Java Business Process Management)进行工作流开发的实例演示。在这个DEMO中,我们将会深入探讨JBPM的核心概念、主要功能以及如何在实际项目中应用。首先,我们需要理解JBPM...
修改配置文件的数据库连接部分就可以直接运行,由于文件过大,没有上传jar包,需要自己加入。将juel.jar 替换tomcat下的D:\Application\...浏览器输入:http://localhost:8080/Spring3Jbpm/example/login/login.html
jbpm-demo是jbpm附带的演示项目,它包含了多个示例流程,如请假审批流程、采购流程等,这些实例为初学者提供了实践和学习的机会。通过jbpm-demo,用户可以直观地了解如何部署和运行工作流,以及如何与工作流系统进行...
【jbpm4.4+SSH2 完整请假流程】是一个结合了业务流程管理(BPM)工具jbpm4.4与Spring、Struts、Hibernate(SSH2)框架的示例应用,用于演示如何在企业级Java应用中实现一个完整的请假流程。这个项目的核心是jbpm,一...
jbpm-demo是jBPM提供的示例项目,包含了一些实际应用场景的流程,如请假申请、报销审批等,帮助开发者快速理解jBPM的用法。 总结,jBPM是Java开发者实施工作流管理的强大工具,它提供了一套完整的解决方案,从流程...
4. **非审批流**:审批流通常涉及组织内部的权限控制和决策过程,如报销申请、请假审批等。非审批流则更侧重于自动化处理和流程流转,不包含明确的人工审批步骤。 5. **绑定表单**:在业务流程中,表单用于收集和...
而"JBPM4Demo5Web"可能是项目结构,包括Web层、业务逻辑层和数据访问层的代码,以及必要的配置文件如pom.xml(Maven项目配置文件)和web.xml(Web应用部署描述符)。 在实践中,开发者可以使用JBPM提供的API和工具...
二、jbPM入门 1. **安装与配置**: 首先,你需要下载jbPM的最新版本并进行安装。通常,这包括获取jbPM工具集,如jbPM Workbench,用于图形化设计流程,以及jbPM服务仓库,用于运行流程实例。 2. **环境准备**: 为了...
**jbpm4.4 + Servlet 知识点详解** jbpm4.4 是一个流行的开源工作流管理系统,它提供了一套完整的解决方案,用于设计、执行和...通过对webDemo的深入学习,你可以掌握jbpm的使用,以及如何在Web环境中部署和运行流程。