1. 程式人生 > >Activiti+Springboot跳轉到任意節點

Activiti+Springboot跳轉到任意節點

1.TaskFlowControlService 方法類


package com.epf.activiti.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine
.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.impl.RepositoryServiceImpl; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.pvm.PvmActivity; import org.activiti
.engine.impl.pvm.PvmTransition; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl; import org.activiti.engine.impl.pvm.process.TransitionImpl; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task
.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * * <code>TaskFlowControlService</code> (節點自由跳轉) * @author zhouxib * @version V1.0 * @date 2018 2018年8月18日 下午1:51:12 */ @Component public class TaskFlowControlService { @Autowired private TaskService taskService ; @Autowired private ManagementService managementService; @Autowired private HistoryService historyService; @Autowired private RuntimeService runtimeService; @Autowired private RepositoryService repositoryService; public String rollBackWorkFlow(String taskId) { try { Map<String, Object> variables; // 取得當前任務.當前任務節點 HistoricTaskInstance currTask = historyService .createHistoricTaskInstanceQuery().taskId(taskId) .singleResult(); // 取得流程例項,流程例項 ProcessInstance instance = runtimeService .createProcessInstanceQuery() .processInstanceId(currTask.getProcessInstanceId()) .singleResult(); if (instance == null) { // logger.info("流程結束"); // logger.error("出錯啦!流程已經結束"); return "ERROR"; } variables = instance.getProcessVariables(); // 取得流程定義 ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) .getDeployedProcessDefinition(currTask .getProcessDefinitionId()); if (definition == null) { // logger.info("流程定義未找到"); // logger.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.claim(task.getId(), task.getAssignee()); taskService.complete(task.getId(), variables); historyService.deleteHistoricTaskInstance(task.getId()); } // 恢復方向 for (TransitionImpl transitionImpl : newTransitions) { currActivity.getOutgoingTransitions().remove(transitionImpl); } for (PvmTransition pvmTransition : oriPvmTransitionList) { pvmTransitionList.add(pvmTransition); } // logger.info("OK"); // logger.info("流程結束"); return "SUCCESS"; } catch (Exception e) { // logger.error("失敗",e); return "ERROR"; } } /** * 工作流自由跳轉 * @param taskId 要跳轉到的節點名稱 * @return */ public String taskRollback(String taskId){ //根據要跳轉的任務ID獲取其任務 HistoricTaskInstance hisTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult(); // String taskAssignee = hisTask.getAssignee(); //進而獲取流程例項 ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(hisTask.getProcessInstanceId()).singleResult(); //取得流程定義 ProcessDefinitionEntity definition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(hisTask.getProcessDefinitionId()); //獲取歷史任務的Activity ActivityImpl hisActivity = definition.findActivity(hisTask.getTaskDefinitionKey()); //實現跳轉 managementService.executeCommand(new JumpCmd(instance.getId(), hisActivity.getId())); return hisTask.getProcessInstanceId(); } }

2.重寫的Command介面

/**
 * com.epf.activiti.service
 *
 *   ver     date           author
 * ──────────────────────────────────
 *           2018年8月18日         GZEPF
 *
 * Copyright (c) 2018, gomai.
*/

package com.epf.activiti.service;

import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;

/**
 *
 * @author   GZEPF
 * @version  
 * @date     2018年8月18日 下午2:48:21
 */
 public class JumpCmd implements Command<ExecutionEntity>{  

     private String processInstanceId;  
     private String activityId;  
     public static final String REASION_DELETE = "deleted";  

     public JumpCmd(String processInstanceId, String activityId) {  
         this.processInstanceId = processInstanceId;  
         this.activityId = activityId;  
     }  

     public ExecutionEntity execute(CommandContext commandContext) {  
         ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findExecutionById(processInstanceId);  
         executionEntity.destroyScope(REASION_DELETE);  
         ProcessDefinitionImpl processDefinition = executionEntity.getProcessDefinition();  
         ActivityImpl activity = processDefinition.findActivity(activityId);  
         executionEntity.executeActivity(activity);  
         return executionEntity;  
     }  

 }  

3.案例:駁回至第一個環節

@RequestMapping("runbackStater")
public R runbackStater(String processInstanceId){
    //1.獲取需要跳轉的流程環節processid
    List<HistoricTaskInstance> historicTaskInstance= historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().asc().list();
    if(historicTaskInstance!=null && historicTaskInstance.size()>0){
        //2.跳轉到指定節點
        taskFlowControlService.taskRollback(historicTaskInstance.get(0).getId());
        return R.ok("操作成功!");
    }else{
        return R.error("操作失敗!");
    }


}

相關推薦

Activiti+Springboot任意節點

1.TaskFlowControlService 方法類 package com.epf.activiti.service; import java.util.ArrayList; import java.util.List; import ja

Activiti到工作流的任意節點(本例用到上一節點講解即流程回退)

所有用到的service以及實現類都是工作流(Activiti)本身的。 public String taskRollback(String taskId){ //根據要跳轉的任務ID獲取

長按識別二維碼微信喚起喚醒任意url網站地址技術ticket生成規則介面加密php

相信很多朋友遇到過有些網站,可以直接通過一個連線就能讓你的手機開啟微信且跳轉到某個指定的頁面,許多程式設計師很好奇到底是怎麼實現的,到處求這種方法的原始碼,在文字中我會介紹及剖析這種跳轉實現的原理。 微信是個比較封閉的環境,至於為什麼封閉,相信大家都瞭解,在一些應用場景中,我們要用到外部瀏覽器跳

4 如何配置springboothtml頁面(thymeleaf)

  注意: jss .css預設去static檔案中取找             html預設去templates中取去找    1、首先在pom.xml新增對HTML的相關依賴 /*

springboot至html頁面配置

1,首先在pom檔案中引入模板引擎jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

如何利用tr.jd.com喚起微信ticket規則生成方法任意連結網址

function toweixin(){ if (!/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { if (/ baiduboxapp/i.test(navigator.userAgent)) {

如何利用m.jr.jd.com喚起微信ticket規則生成方法任意連結網址

  分析連線是個短鏈:m.jr.jd.com。放瀏覽器裡訪問,解析出完整的地址:http://www.wxticket.com/wb/0e7d51958ac79557b5ecafc582ab62d0.html。開啟偵錯程式看了下,頁面中除了百度統計程式碼外,核心程式碼如下: if(!/(iPho

SpringBoot渲染HTML頁面(詳解)

本文的例項程式碼也會放在文末分享給大家的。正文開始: 目錄 1、 規則 2、 示例 (1) 原理 一、直接訪問 直接訪問說白了就是訪問html頁面的地址前面是沒有資料夾的。如下圖 1、新建一個Spr

如何利用x.elong.com喚起微信ticket規則生成方法任意鏈接網址

app 雲服務 dubo ati php ticket bdb 無法 通過 function toweixin(){ if (!/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { if (

activiti靈活駁回回退操作動態修改流程

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream;

springboot頁面報錯

his application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Nov 15 16:22:13 CST 2017 There was an unexp

SpringBoot頁面詳解+thymeleaf

        初次做SpringBoot,要解決頁面跳轉的問題,這個問題我弄了大半天,弄好後,其實也不算個事,寫出來給大家提個醒!其實不要使用spring boot的@RestController註解,直接使用spring原來的註解@Controller就可以了。示例如下:

springboot頁面

在springboot controller跳轉時請注意 分以下三個步驟 步驟一 在pom.xml新增相關依賴 <!-- 引入了Spring Boot預設的HTTP引擎Tomcat。 --> <dependency> <groupId&g

擴充套件Activiti-5.12輕鬆實現流程節點間自由任意駁回/撤回

由於專案需要,最近對開源工作流引擎Activiti-5.12的功能做了一下擴充套件,實現了以下功能: 1.自由流(流程節點間自由跳轉和任意駁回/撤回) 2.流程會籤任務串並行模式切換 一、自由流在已有流程模型的的基礎上,每個流程例項當前任務可以任意駁回/撤回或者向後續節點任

activiti節點

分享牛原創(尊重原創 轉載對的時候第一行請註明,轉載出處來自分享牛http://blog.csdn.net/qq_30739519)activiti使用的時候,通常需要跟業務緊密的結合在一起,有些業務非常的複雜,比如一個簡單的採購流程:流程如下: 供應商上新商品的時候,提交商

Activiti 節點

package com.Deer.activiti; import java.util.Iterator; import java.util.Map; import org.activiti.engine.impl.interceptor.Command; import org.activiti

springboot--httphttps

boot.s store splay height imp gen package servlet int SSL是為網絡通信提供安全以及保證數據完整性的的一種安全協議,SSL在網絡傳輸層對網絡連接進行加密。 例:cas 的單點登陸就用到了SSL 一、安全證書的生成 1、

SpringBoot---頁面之WebMvcConfigurerAdapter

inf apt col fig 分享 繼承 ima 部分 配置結果 摘要:在springboot中定義自己的方法繼承WebMvcConfigurerAdapter方法可以實現擴展springMvc功能,要全面實現接管springmvc就要在自己的方法上加上@EnableWe

springboot 運行jar jsp頁面

directory instance 文件拷貝 pub embed stl string sch odi pom.xml 添加 <!-- tomcat支持 --> <dependency> <groupId

springBoot 沒有到指定頁面

沒有 auto div spring autoconf clas thymeleaf framework nbsp Whitelabel Error Page 解決辦法,添加依賴: <dependency> <groupId