任务回退的工作可以有两种实现方式:
1. 完成当前任务,产生新的后退任务
2. 不需要完成当前任务,让当前任务直接指向后退的节点。
第一种方式,是joffice1提供的实现,其实现原理就需要有一个completeTask与newTask的动作。在jbpm4的流程历史中有记录这个跳转的过程,
第二种方式是joffice2提供的实现,其没有ComplteTask与newTask的动作,只有changeTaskDefintion与change assignee的动作。
以下为其实现的代码细节,测试过可以使用,
- /**
- * 从当前任务跳回上一任务
- * @param curTask 当前任务对象
- * @param preTaskName 前一任务名称
- * @param assignee 前一任务执行人ID
- * @return
- */
- public Task jumpToPreTask(Task curTask,String preTaskName,String assignee){
- EnvironmentImpl env=null;
- try{
- TaskImpl task=(TaskImpl)curTask;
- env=((EnvironmentFactory) processEngine).openEnvironment();
- ProcessInstance pi=getProcessInstanceByTaskId(curTask.getId());
- ProcessDefinitionImpl pd=(ProcessDefinitionImpl)getProcessDefinitionByTaskId(curTask.getId());
- TaskDefinitionImpl taskDef= pd.getTaskDefinition(preTaskName);
- //更换其Execution
- ExecutionImpl exeImpl=(ExecutionImpl)pi;
- //更换其活动的定义
- Activity preActivity=pd.findActivity(preTaskName);
- exeImpl.setActivity(preActivity);
- task.setActivityName(preTaskName);
- task.setName(preTaskName);
- task.setDescription(preTaskName);
- task.setExecution(exeImpl);
- //更换执行人
- task.setAssignee(assignee);
- task.setCreateTime(new Date());
- task.setSignalling(true);
- //task.setNew(true);
- //更换流程任务的定义
- if(taskDef!=null){
- task.setTaskDefinition(taskDef);
- }else{
- //查看其是否为开始任务,这表示开始任务TODO
- //String startName=jbpmService.getStartNodeName();
- TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();
- taskDefinition.setName(preTaskName);
- taskDefinition.setPriority(1);
- taskDefinition.setProcessDefinition(pd);
- ActivityImpl startActivityImpl=pd.findActivity(preTaskName);
- ActivityImpl startTaskImpl=pd.createActivity();
- startTaskImpl.setName(preTaskName);
- List outTrans=new ArrayList();
- outTrans.addAll(startActivityImpl.getOutgoingTransitions());
- startTaskImpl.setOutgoingTransitions(outTrans);
- }
- taskService.saveTask(task);
- return task;
- }finally{
- if(env!=null)env.close();
- }
- }
/** * 从当前任务跳回上一任务 * @param curTask 当前任务对象 * @param preTaskName 前一任务名称 * @param assignee 前一任务执行人ID * @return */ public Task jumpToPreTask(Task curTask,String preTaskName,String assignee){ EnvironmentImpl env=null; try{ TaskImpl task=(TaskImpl)curTask; env=((EnvironmentFactory) processEngine).openEnvironment(); ProcessInstance pi=getProcessInstanceByTaskId(curTask.getId()); ProcessDefinitionImpl pd=(ProcessDefinitionImpl)getProcessDefinitionByTaskId(curTask.getId()); TaskDefinitionImpl taskDef= pd.getTaskDefinition(preTaskName); //更换其Execution ExecutionImpl exeImpl=(ExecutionImpl)pi; //更换其活动的定义 Activity preActivity=pd.findActivity(preTaskName); exeImpl.setActivity(preActivity); task.setActivityName(preTaskName); task.setName(preTaskName); task.setDescription(preTaskName); task.setExecution(exeImpl); //更换执行人 task.setAssignee(assignee); task.setCreateTime(new Date()); task.setSignalling(true); //task.setNew(true); //更换流程任务的定义 if(taskDef!=null){ task.setTaskDefinition(taskDef); }else{ //查看其是否为开始任务,这表示开始任务TODO //String startName=jbpmService.getStartNodeName(); TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl(); taskDefinition.setName(preTaskName); taskDefinition.setPriority(1); taskDefinition.setProcessDefinition(pd); ActivityImpl startActivityImpl=pd.findActivity(preTaskName); ActivityImpl startTaskImpl=pd.createActivity(); startTaskImpl.setName(preTaskName); List outTrans=new ArrayList(); outTrans.addAll(startActivityImpl.getOutgoingTransitions()); startTaskImpl.setOutgoingTransitions(outTrans); } taskService.saveTask(task); return task; }finally{ if(env!=null)env.close(); } }
第二种方式在Jbpm4的历史表中并没有记录,但我们可以不用jbpm4自带的流程历史,可以加上我们自己的流程历史,这如下图所示:
目前存在的问题就是不能退回至开始节点,不过有一想法就是可以让动态创建一任务为开始任务,让流程退回这里,但可惜的是,退回是可以,不过再让它往下走的话,就会出现节点类型不能转化的错误。
相关推荐
这个JOffice V1.2 beta版,也就是官方说开源的版本之一。 说实话,这个公司很讨厌,打着开源的幌子来宣传自己的产品,里面的 东西根本没有开源,还很恶心的包留了一部分代码,htcore.jar。 对于这样的开源,我表示...
关于 JOffice1.3使用手册,方便快捷,大家来下载
提供流程定义、流程设置、流程版本更变,流程任务管理,流程实例管理,流程表单管理,流程表单在线义、模板表单,流程历史查询,查看我的任务,任务回退等丰富流程开发管理。 9 人力管理 10 报表管理 11 公文管理 ...
joffice技术框架介绍。
// 将所有重要的初始化放置在 InitInstance 中 } // 唯一的一个 CChatApp 对象 CChatApp theApp; // CChatApp 初始化 BOOL CChatApp::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定...
office文档转pdf后,再转swf,最终显示需要的一些工具及jar包,包括一个office转pdf转swf的java文件。因目前可上传的文件大小限制,OpenOffice安装文件未上传,工具目前最新版本为3.4.1,请另行下载
JOffice中的权限管理是基于角色的管理策略,采用Spring Security2的配置方式,同时能够结合EXT3来进行整个系统的权限管理,通过使用配置文件,进行整个系统的功能集中管理,包括系统左边的导航菜单,数据列表中的...
用cmd命令打jar包 目标——将D:\myfile目录下的所有文件及文件夹打包到license.jar包中 步骤——1.用cd命令跳转至D:\myfile目录下 2.输入命令jar cvf license.jar *.* mysql->source F:/joffice131.sql
JoPro是一个生产力和办公套件,将文字处理器,电子表格设计器,演示设计器和svg查看器集成到一个应用程序中! 基于Netbeans平台。 图像和代码由Anthony Goubard设计。 最初称为Joffice。
JOffVis 一个基于 Java Swing 的工具,用于可视化 ...先决条件:1) Java SDK 72) Maven 3要编译应用程序,请运行以下命令mvn 干净编译要启动应用程序,请运行以下命令mvn exec:java -Dexec.mainClass="joffice.gui.App