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 如何配置springboot跳轉html頁面(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--http跳轉https
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