任务回退的工做能够有两种实现方式: java
1. 完成当前任务,产生新的后退任务 测试
2. 不须要完成当前任务,让当前任务直接指向后退的节点。 spa
第一种方式,是joffice1提供的实现,其实现原理就须要有一个completeTask与newTask的动做。在jbpm4的流程历史中有记录这个跳转的过程, .net
第二种方式是joffice2提供的实现,其没有ComplteTask与newTask的动做,只有changeTaskDefintion与change assignee的动做。 code
如下为其实现的代码细节,测试过能够使用, 对象
/** * 从当前任务跳回上一任务 * @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自带的流程历史,能够加上咱们本身的流程历史,这以下图所示: ip
目前存在的问题就是不能退回至开始节点,不过有一想法就是能够让动态建立一任务为开始任务,让流程退回这里,但惋惜的是,退回是能够,不过再让它往下走的话,就会出现节点类型不能转化的错误。 get