原文出处:http://blog.csdn.net/john2522/article/details/7254140
需求:
针对企业的多步审批,当前节点的审批人对上个节点的审批有意见或者当前接受审批任务的人觉得不应该由自己来审批,那么就需要回退到上个节点的审批,由上一步的人重新办理。
解决方案是:在流程定义中为具有回退功能的任务活动设置专门用于处理回退逻辑的监听器,然后需要回退时 动态的创建一条转移路径,只想退回到目的地。
1)回退的实例流程定义:
<process name="销售订单审批回退流程" key="销售订单审批回退流程_10002">
<start ID="1" name="开始" type="start" x="123" y="123" Radio="20">
<transition ID="5" name="流程线" type="transition" FromElementID="1" ToElementID="3" to="小组审批">
<event-listener class="com.zhg.bpm.operation.withdraw.WithdrawListener"/>
</transition>
</start>
<end ID="2" name="结束" type="end" x="689" y="132" Radio="20"/>
<task ID="3" name="小组审批" type="NodeAudit" x="276" y="118" Width="100" Height="30" candidate-groups="RO2010091500000001">
<on event="end">
<event-listener class="com.zg.bpm.operation.message.AfterMessageListener"/>
</on>
<on event="start">
<event-listener class="com.zg.bpm.operation.message.BeforeMessageListener"/>
</on>
<transition ID="6" name="流程线" type="transition" FromElementID="3" ToElementID="4" to="部门审批">
<event-listener class="com.zhg.bpm.operation.withdraw.WithdrawListener"/>
</transition>
</task>
<task ID="4" name="部门审批" type="NodeAudit" x="450" y="142" Width="100" Height="30" candidate-groups="RO2010091500000001">
<on event="end">
<event-listener class="com.zg.bpm.operation.message.AfterMessageListener"/>
</on>
<on event="start">
<event-listener class="com.zg.bpm.operation.message.BeforeMessageListener"/>
</on>
<transition ID="7" name="结束" type="transition" FromElementID="4" ToElementID="2" to="结束">
<event-listener class="com.zhg.bpm.operation.withdraw.WithdrawListener"/>
</transition>
</task>
</process>
流程图如下:
WithdrawListener就是回退的监听器
2)事件监听器WithdrawListener定义
public class WithdrawListener implements EventListener {
public void notify(EventListenerExecution execution) throws Exception {
TransitionImpl transition=((ExecutionImpl)execution).getTransition();
ActivityImpl destination=transition.getDestination();
ActivityImpl source=transition.getSource();
//如果目的转向与源转向都不为空,则在该任务的转向中建立一条可回退的路径
//转向名称为"目的转向名称to源转向名称"
if(destination!=null&&source!=null){
TransitionImpl newTran=destination.createOutgoingTransition();
newTran.setName(destination.getName()+" to "+source.getName());
newTran.setDestination(source);
}
}
}
3)最后是回退的API了,调用回退服务,删除历史审批信息就行了
直接调用command就行了,比如processEngine.execute(new WithdrawTaskCommand(processId, taskName))
package com.zhg.bpm.command;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.Session;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.cmd.Command;
import org.jbpm.api.cmd.Environment;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.history.model.HistoryActivityInstanceImpl;
/**
*撤消,取回命令,应该在我的历史任务中激活
*
*/
public class WithdrawTaskCommand implements Command {
private static Logger logger = LoggerFactory.getLogger(WithdrawTaskCommand.class);
private String pid;
private String withdrawToActName;
public WithdrawTaskCommand(String pid,String withdrawToActName){
this.pid=pid;
this.withdrawToActName=withdrawToActName;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPid() {
return pid;
}
public void setWithdrawToActName(String withdrawToActName) {
this.withdrawToActName = withdrawToActName;
}
public String getWithdrawToActName() {
return withdrawToActName;
}
public String execute(Environment environment) throws Exception{
//从流程引擎环境中获取执行,任务,历史3种服务
ExecutionService executionService=environment.get(ExecutionService.class);
TaskService taskService=environment.get(TaskService.class);
HistoryService historyService=environment.get(HistoryService.class);
//这里比较特殊,由于JBPM4没有清除历史数据的服务API直接提供,所以这里要获取的是
//Hibernate Session对象
Session session=environment.get(Session.class);
Execution exec=executionService.findExecutionById(pid);
//获取当前活动名称集合
Set<String> actNames=exec.findActiveActivityNames();
if(actNames==null||actNames.size()==0){
String msg="没有可以取回的活动";
logger.error(msg);
throw new Exception(msg);
}
if(actNames.size()>1){
String msg="存在多个活动的节点 ";
logger.error(msg);
throw new Exception(msg);
}
String actName=actNames.iterator().next();
String withdrawPath=actName+" to "+withdrawToActName;
//获取当前活动的任务
List<Task> tasks=taskService.createTaskQuery().processInstanceId(pid)
.activityName(actName).list();
for(Task task:tasks){
/*
* 结束任务(即取回任务).如果completeTask Api执行失败,很可能是因
* 为withdrawPath不存在,这说明当前活动已非取回目的地活动的下一步了
* 实际应用中可以据此规则做一步的异常 处理
*/
taskService.completeTask(task.getId(), withdrawPath);
}
//这里清除当前活动的历史痕迹,即删除历史活动实例及其历史任务
HistoryActivityInstanceImpl hActInst=(HistoryActivityInstanceImpl)historyService
.createHistoryActivityInstanceQuery()
.activityName(actName)
.executionId(pid)
.uniqueResult();
//直接数据库物理删除
session.delete(hActInst);
return "SUCCESS";
}
}
相关推荐
jbpm工作流整合是一个关键的主题,它涉及到企业级业务流程管理(BPM)系统的实施与集成。jbpm是一个开源的工作流管理系统,它提供了一套全面的工具和框架,用于设计、执行、监控和优化业务流程。这个压缩包可能包含...
在JOffice2中,JBPM4是一个强大的工作流引擎,用于管理和执行业务流程。本文将深入探讨如何在JOffice2中实现JBPM4任务的回退功能,这在处理复杂流程时尤其重要,允许用户纠正错误或根据需要调整流程方向。 任务回退...
**jBPM4工作流应用开发指南** jBPM4是一款强大的开源工作流管理系统,它为企业提供了一套全面的工作流解决方案,支持业务流程的建模、执行和监控。本指南将深入探讨jBPM4在实际开发中的应用,帮助开发者理解和掌握...
2. **Jbpm工作流编程步骤**: - **安装与配置**:首先需要下载并安装Jbpm,配置相应的数据库连接和其他依赖。 - **设计流程定义**:使用Jbpm提供的建模工具(如BPMN2)设计流程图,定义各个活动、参与者、流转规则...
这个jbpm-test示例是学习和理解JBPM工作流管理系统的良好起点。开发者可以通过它了解如何设计和实现一个实际的业务流程,同时掌握回退功能的实现方法。 总之,JBPM4.4的请假流程实例是一个全面展示流程管理能力的...
在"jbpm工作流经典教程"中,我们可以期待学习到以下关键知识点: 1. **BPMN简介**:BPMN是一种业务流程建模语言,jbpm利用它来可视化表达业务流程。学习者会了解到各种BPMN元素,如开始事件、结束事件、任务、网关...
标题中的“JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)”是指在使用JBPM(Java Business Process Management)4.4版本时,设计了一个特殊的流程控制机制,允许用户在执行流程过程中进行回...
**Jbpm工作流实例—报销申请** Jbpm(jBoss Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的流程定义、执行、监控和优化工具,帮助企业实现业务流程自动化。在这个“报销申请”的...
jbpm工作流学习资料大全是一份综合性的资源集合,涵盖了jbpm工作流的各个方面,适合初学者和进阶者深入理解这一技术。jbpm(Java Business Process Management)是一款开源的工作流管理系统,它允许开发者设计、执行...
在工作流系统中,任务回退功能对于确保业务流程的正确执行至关重要。例如,在企业办公自动化(Office Automation,OA)系统中,任务回退可用于处理审批流程中的非规范操作。任务回退可能涉及单级或多级的审批过程,...
业务流程执行:流程的启动、任务的提交、回退、撤销、取回、处理任务等操作、 实用需求实现:执行权限、工作流留痕、事务提醒 只需一套实现,你的业务只要在挂接中配置则可以具有工作流功能 业务方面:OA项目实战...
例如,它未直接支持“回退”、“取回”、“会签”、“委派”等功能,这些在中国被认为是常见的业务场景。然而,通过深入理解jbpm的架构和设计思路,开发者可以探索并实现这些特定需求的解决方案,以满足中国特色的...
工作流引擎是全部或部分由计算机支持或自动处理的业务过程。工作流程引擎作用:将工作分解,按照一定的规则和过程来执行并监控业务流程,以提高效率,减低成本;实现不同业务部门之间业务的自动化,标准化和系统化...
这个“JBPM工作流开发指南”是一个深入介绍如何使用JBPM进行工作流开发的资源。 1. **JBPM简介** - **定义**:JBPM是基于Java的业务流程管理平台,它包含了一套完整的工具链,包括流程建模、部署、执行、监控和...
**JBPM4开发指南代码详解** JBPM4(Java Business Process Management 4)是一款开源的工作流...通过深入理解并实践《jBPM工作流应用开发指南》中的代码,开发者可以有效地利用jbPM4解决实际项目中的业务流程问题。
5. **工作流API使用**:jBPM提供了丰富的API来管理和控制流程实例,包括回退操作。你需要熟悉这些API,如`startProcessInstanceById()`, `signalEvent()`等,来实现流程的退回。 6. **异常处理**:在设计退回操作时...
FixFlow不仅支持常见的工作流功能,如加签、会签、回退等“中国式工作流”,而且提供了更为友好的用户界面和更完善的本地化支持。 #### 五、总结 综上所述,JBPM与Activiti各有千秋,在不同的应用场景下展现出不同...
业务流程执行:流程的启动、任务的提交、回退、撤销、取回、处理任务等操作、 实用需求实现:执行权限、工作流留痕、事务提醒 只需一套实现,你的业务只要在挂接中配置则可以具有工作流功能 业务方面:OA项目实战