一、應用場景
當前activiti已經成爲十分主流的流程框架,可是畢竟是老美的東西,在中國不免會水土不服,當業務涉及到一些回退,或者駁回的操做時,該框架並不能很好的實現咱們的業務,框架
此時咱們要作的就是對其進行改造,讓他認識到中國特點社會主義的好。ide
二、解決方案
1、關於回退,咱們在進行流程的操做的時候不免會手殘,開始了一段讓人心驚膽戰的錯誤操做,此時第一時間是想着如何挽回本身得出錯誤,撤回該流程,很少說直接上代碼this
1 /** 2 * @params taskId 你想tiao回到那一任務節點Id 3 * 4 */ 5 6 public void taskRollback(String taskId){ 7 8 //根據要跳轉的任務ID獲取其任務 9 HistoricTaskInstance hisTask = activitiEnginUtil.getHistoryService() 10 .createHistoricTaskInstanceQuery().taskId(taskId) 11 .singleResult(); 12 //進而獲取流程實例 13 ProcessInstance instance = activitiEnginUtil.getRuntimeServic() 14 .createProcessInstanceQuery() 15 .processInstanceId(hisTask.getProcessInstanceId()) 16 .singleResult(); 17 //取得流程定義 18 ProcessDefinitionEntity definition = (ProcessDefinitionEntity) activitiEnginUtil.getRepositoryService().getProcessDefinition(hisTask.getProcessDefinitionId()); 19 //獲取歷史任務的Activity 20 ActivityImpl hisActivity = definition.findActivity(hisTask.getTaskDefinitionKey()); 21 //實現跳轉 22 activitiEnginUtil.getTaskManagementService().executeCommand(new JumpCmd(instance.getId(), hisActivity.getId())); 23 }
1 /** 2 * 由於activiti的具體服務執行是運用可命令模式 3 4 * 因此咱們在進行動態任務節點跳轉的時候要實現該接口 5 */ 6 7 public class JumpCmd implements Command<ExecutionEntity>{ 8 9 private String processInstanceId; 10 private String activityId; 11 public static final String REASION_DELETE = "deleted"; 12 13 public JumpCmd(String processInstanceId, String activityId) { 14 this.processInstanceId = processInstanceId; 15 this.activityId = activityId; 16 } 17 18 @Override 19 public ExecutionEntity execute(CommandContext commandContext) { 20 ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findExecutionById(processInstanceId); 21 22 executionEntity.destroyScope(REASION_DELETE); //刪除的緣由 23 ProcessDefinitionImpl processDefinition = executionEntity.getProcessDefinition(); 24 ActivityImpl activity = processDefinition.findActivity(activityId); 25 executionEntity.executeActivity(activity); 26 27 return executionEntity; 28 } 29 30 }
2、關於流程的駁回,即拒絕某一個流程,此時有多種辦法能夠實現該功能, 不過目前最經常使用的一種方法就是運用上一個節點流向來代替當前節點的流向,進而達到一個駁回的目的spa
具體代碼實現以下code
1 /** 2 3 * @params curTask 即當前任務 4 */ 5 6 public void rejectFlow(Task curTask) { 7 //獲取任務ID 而後查詢到當前任務節點 8 curTask.getProcessDefinitionId(); 9 ProcessDefinitionEntity processDefinitionEntity = (org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity) activitiEnginUtil.getRepositoryService(). 10 createProcessDefinitionQuery().processDefinitionId(curTask.getProcessDefinitionId()).singleResult(); 11 // 取得上一步活動的節點流向 12 ActivityImpl curActivity = processDefinitionEntity.findActivity(curTask.getTaskDefinitionKey()); 13 List<PvmTransition> incomingTransitions = curActivity.getIncomingTransitions(); 14 15 //清空指定節點全部流向並暫時先將全部流向變量暫時存儲在一個新的集合(主要是爲後來恢復正常流程走向作準備) 16 List<PvmTransition> pvmTransitionList = new ArrayList<PvmTransition>(); 17 18 List<PvmTransition> outgoingTransitions = curActivity.getOutgoingTransitions(); 19 20 for (PvmTransition pvmTransition: outgoingTransitions) { 21 pvmTransitionList.add(pvmTransition); 22 } 23 outgoingTransitions.clear(); 24 25 //建立新的流向而且設置新的流向的目標節點 (將該節點的流程走向都設置爲上一節點的流程走向,目的是至關於造成一個迴路) 26 List<TransitionImpl> newTransitionList = new ArrayList<TransitionImpl>(); 27 for (PvmTransition pvmTransition : incomingTransitions) { 28 PvmActivity source = pvmTransition.getSource(); 29 ActivityImpl inActivity = processDefinitionEntity.findActivity(source.getId()); 30 TransitionImpl newOutgoingTransition = curActivity.createOutgoingTransition(); 31 newOutgoingTransition.setDestination(inActivity); 32 newTransitionList.add(newOutgoingTransition); 33 } 34 35 //完成任務(流程走向上一節點) 36 TaskService taskService = activitiEnginUtil.getTaskService(); 37 List<Task> taskList = activitiEnginUtil.getTaskService().createTaskQuery().processInstanceId(curTask.getProcessInstanceId()).list(); 38 for (Task task : taskList) { 39 taskService.complete(task.getId()); 40 activitiEnginUtil.getHistoryService().deleteHistoricTaskInstance(task.getId()); 41 42 } 43 44 // 恢復方向(實現駁回功能後恢復原來正常的方向) 45 for (TransitionImpl transitionImpl : newTransitionList) { 46 curActivity.getOutgoingTransitions().remove(transitionImpl); 47 } 48 49 for (PvmTransition pvmTransition : pvmTransitionList) { 50 outgoingTransitions.add(pvmTransition); 51 } 52 53 } 54 55