1. 程式人生 > >工作流activiti的退回和跨節點退回實現java

工作流activiti的退回和跨節點退回實現java

以上是最簡單的審批流程
這裡寫圖片描述
退回到上一級提交人的程式碼如下:

public class ModelRollBack {
private Logger log = LogManager.getLogger(ModelRollBack.class);//日誌檔案
private RuntimeService runtimeService;//
private TaskService taskService;
private RepositoryService repositoryService;
private HistoryService historyService;

private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

  //退回上一個節點
 public String rollBackWorkFlow(String taskId) {

   this.taskService=processEngine.getTaskService();
   this.historyService = processEngine.getHistoryService();
   this.repositoryService = processEngine.getRepositoryService();
   this.runtimeService = processEngine.getRuntimeService();
     try {
         Map<String, Object> variables;
         // 取得當前任務.當前任務節點
         HistoricTaskInstance currTask = historyService
                 .createHistoricTaskInstanceQuery().taskId(taskId)
                 .singleResult();
         // 取得流程例項,流程例項
         ProcessInstance instance = runtimeService
                 .createProcessInstanceQuery()
                 .processInstanceId(currTask.getProcessInstanceId())
                 .singleResult();
         if (instance == null) {
          log.info("流程結束");
             log.error("出錯啦!流程已經結束");
             return "ERROR";
         }
         variables = instance.getProcessVariables();
         // 取得流程定義
         ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
                 .getDeployedProcessDefinition(currTask
                         .getProcessDefinitionId());
         if (definition == null) {
          log.info("流程定義未找到");
             log.error("出錯啦!流程定義未找到");
             return "ERROR";
         }
         // 取得上一步活動
         ActivityImpl currActivity = ((ProcessDefinitionImpl) definition)
                 .findActivity(currTask.getTaskDefinitionKey());

         //也就是節點間的連線
         List<PvmTransition> nextTransitionList = currActivity
                 .getIncomingTransitions();
         // 清除當前活動的出口
         List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
         //新建一個節點連線關係集合

         List<PvmTransition> pvmTransitionList = currActivity
                 .getOutgoingTransitions();
         //
         for (PvmTransition pvmTransition : pvmTransitionList) {
             oriPvmTransitionList.add(pvmTransition);
         }
         pvmTransitionList.clear();

         // 建立新出口
         List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>();
         for (PvmTransition nextTransition : nextTransitionList) {
             PvmActivity nextActivity = nextTransition.getSource();
             ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition)
                     .findActivity(nextActivity.getId());
             TransitionImpl newTransition = currActivity
                     .createOutgoingTransition();
             newTransition.setDestination(nextActivityImpl);
             newTransitions.add(newTransition);
         }
         // 完成任務
         List<Task> tasks = taskService.createTaskQuery()
                 .processInstanceId(instance.getId())
                 .taskDefinitionKey(currTask.getTaskDefinitionKey()).list();
         for (Task task : tasks) {
             taskService.complete(task.getId(), variables);
             historyService.deleteHistoricTaskInstance(task.getId());
         }
         // 恢復方向
         for (TransitionImpl transitionImpl : newTransitions) {
             currActivity.getOutgoingTransitions().remove(transitionImpl);
         }
         for (PvmTransition pvmTransition : oriPvmTransitionList) {
             pvmTransitionList.add(pvmTransition);
         }
         log.info("OK");
         log.info("流程結束");

         return "SUCCESS";
     } catch (Exception e) {
      log.error("失敗");
         log.error(e.getMessage());
         return "ERROR";
     }
 }




 //回退到指定節點
 public String rollBackToAssignWorkFlow(String taskId,String destTaskkey) {
   this.taskService=processEngine.getTaskService();
   this.historyService = processEngine.getHistoryService();
   this.repositoryService = processEngine.getRepositoryService();
   this.runtimeService = processEngine.getRuntimeService();
     try {
         Map<String, Object> variables;
         // 取得當前任務.當前任務節點
         HistoricTaskInstance currTask = historyService
                 .createHistoricTaskInstanceQuery().taskId(taskId)
                 .singleResult();
         // 取得流程例項,流程例項
         ProcessInstance instance = runtimeService
                 .createProcessInstanceQuery()
                 .processInstanceId(currTask.getProcessInstanceId())
                 .singleResult();
         if (instance == null) {
          log.info("流程結束");
             log.error("出錯啦!流程已經結束");
             return "ERROR";
         }
         variables = instance.getProcessVariables();
         // 取得流程定義
         ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
                 .getDeployedProcessDefinition(currTask
                         .getProcessDefinitionId());
         if (definition == null) {
          log.info("流程定義未找到");
             log.error("出錯啦!流程定義未找到");
             return "ERROR";
         }
        //取得當前活動節點
         ActivityImpl currActivity = ((ProcessDefinitionImpl) definition)
                 .findActivity(currTask.getTaskDefinitionKey());

          log.info("currActivity"+currActivity);
          // 取得上一步活動
         //也就是節點間的連線
         //獲取來源節點的關係
         List<PvmTransition> nextTransitionList = currActivity.getIncomingTransitions();

         // 清除當前活動的出口
         List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
         //新建一個節點連線關係集合
         //獲取出口節點的關係
         List<PvmTransition> pvmTransitionList = currActivity
                 .getOutgoingTransitions();
         //
         for (PvmTransition pvmTransition : pvmTransitionList) {
             oriPvmTransitionList.add(pvmTransition);
         }
         pvmTransitionList.clear();

         // 建立新出口
         List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>();
         for (PvmTransition nextTransition : nextTransitionList) {
             PvmActivity nextActivity = nextTransition.getSource();

                         log.info("nextActivity"+nextActivity);

                         log.info("nextActivity.getId()"+nextActivity.getId());

                         //destTaskkey
             ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition)
                    // .findActivity(nextActivity.getId());
               .findActivity(destTaskkey);
             TransitionImpl newTransition = currActivity
                     .createOutgoingTransition();
             newTransition.setDestination(nextActivityImpl);
             newTransitions.add(newTransition);
         }
         // 完成任務
         List<Task> tasks = taskService.createTaskQuery()
                 .processInstanceId(instance.getId())
                 .taskDefinitionKey(currTask.getTaskDefinitionKey()).list();
         for (Task task : tasks) {
             taskService.complete(task.getId(), variables);
             historyService.deleteHistoricTaskInstance(task.getId());
         }
         // 恢復方向
         for (TransitionImpl transitionImpl : newTransitions) {
             currActivity.getOutgoingTransitions().remove(transitionImpl);
         }
         for (PvmTransition pvmTransition : oriPvmTransitionList) {

          pvmTransitionList.add(pvmTransition);
         }
         log.info("OK");
         log.info("流程結束");

         return "SUCCESS";
     } catch (Exception e) {
      log.error("失敗");
         log.error(e.getMessage());
         return "ERROR";
     }
 }   

public static void main(String []args){

ModelRollBack back = new ModelRollBack();
//back.rollBackWorkFlow(“1102”);

back.rollBackToAssignWorkFlow(“2402”, “usertask1”);
}

}

以上程式碼是退回到上一節點,和退回到提交人節點的程式碼

程式碼解析 : 例如 流程開始 走到張三 ,張三提交 ,走到李四 ,李四提交走到王五 。現在王五發現有問題,需要直接退回到 張三,讓張三修改之後再次提交 。

這個過程中當前節點在王五 也就是usertask3 在此過程中我們要理清 節點之間的關係

usertask1—–>usertask2

usertask2——>usertask3

usertask3——->endevent

目前對於uesrtask3來說來源 是usertask2——>usertask3

出口usertask3——>enendevent

所以我們只需要根據流程引擎中的定義將出口替換成usertask1就可以。

在此過程中 PvmTransition 只工作流引擎中 的節點關係維護

ActivityImpl是具體的節點。

ProcessDefinitionEntity是當前流程的定義

目前只研究到這個階段如果需要交流,可以給我留言哦