JOffice2中的JBPM4的任務回退實現

任務回退的工做能夠有兩種實現方式: java

     1. 完成當前任務,產生新的後退任務 測試

     2. 不須要完成當前任務,讓當前任務直接指向後退的節點。 spa

 

第一種方式,是joffice1提供的實現,其實現原理就須要有一個completeTask與newTask的動做。在jbpm4的流程歷史中有記錄這個跳轉的過程, .net

 

第二種方式是joffice2提供的實現,其沒有ComplteTask與newTask的動做,只有changeTaskDefintion與change assignee的動做。 code

 

如下爲其實現的代碼細節,測試過能夠使用, 對象

 

Java代碼
  1. /**  
  2.      * 從當前任務跳回上一任務  
  3.      * @param curTask 當前任務對象  
  4.      * @param preTaskName 前一任務名稱   
  5.      * @param assignee 前一任務執行人ID  
  6.      * @return  
  7.      */  
  8.     public Task jumpToPreTask(Task curTask,String preTaskName,String assignee){   
  9.         EnvironmentImpl env=null;   
  10.         try{   
  11.             TaskImpl task=(TaskImpl)curTask;   
  12.             env=((EnvironmentFactory) processEngine).openEnvironment();   
  13.             ProcessInstance pi=getProcessInstanceByTaskId(curTask.getId());   
  14.                
  15.             ProcessDefinitionImpl pd=(ProcessDefinitionImpl)getProcessDefinitionByTaskId(curTask.getId());   
  16.             TaskDefinitionImpl taskDef= pd.getTaskDefinition(preTaskName);   
  17.             //更換其Execution   
  18.             ExecutionImpl exeImpl=(ExecutionImpl)pi;   
  19.             //更換其活動的定義   
  20.             Activity preActivity=pd.findActivity(preTaskName);   
  21.             exeImpl.setActivity(preActivity);   
  22.             task.setActivityName(preTaskName);   
  23.             task.setName(preTaskName);   
  24.             task.setDescription(preTaskName);   
  25.             task.setExecution(exeImpl);   
  26.             //更換執行人   
  27.             task.setAssignee(assignee);   
  28.             task.setCreateTime(new Date());   
  29.             task.setSignalling(true);   
  30.             //task.setNew(true);   
  31.             //更換流程任務的定義   
  32.             if(taskDef!=null){   
  33.                 task.setTaskDefinition(taskDef);   
  34.             }else{   
  35.                 //查看其是否爲開始任務,這表示開始任務TODO   
  36.                 //String startName=jbpmService.getStartNodeName();   
  37.                 TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl();   
  38.                 taskDefinition.setName(preTaskName);   
  39.                 taskDefinition.setPriority(1);   
  40.                 taskDefinition.setProcessDefinition(pd);   
  41.                    
  42.                 ActivityImpl startActivityImpl=pd.findActivity(preTaskName);   
  43.                    
  44.                 ActivityImpl startTaskImpl=pd.createActivity();   
  45.                 startTaskImpl.setName(preTaskName);   
  46.                 List outTrans=new ArrayList();   
  47.                 outTrans.addAll(startActivityImpl.getOutgoingTransitions());   
  48.                 startTaskImpl.setOutgoingTransitions(outTrans);   
  49.                
  50.             }   
  51.             taskService.saveTask(task);   
  52.             return task;   
  53.         }finally{   
  54.             if(env!=null)env.close();   
  55.         }   
  56.     }   
  57.       
/**
	 * 從當前任務跳回上一任務
	 * @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

相關文章
相關標籤/搜索