Activiti 自由跳转两种实现方式-自我总结

package com.zdc.test;

import java.util.List;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
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.RuntimeServiceImpl;
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.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.ReadOnlyProcessDefinition;
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.repository.DeploymentBuilder;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class TestBuildTables {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	/**
	 * 部署流程
	 */
	public void DeploymentProcess(){
		DeploymentBuilder builder = processEngine.getRepositoryService().createDeployment();
	      builder.addClasspathResource("ziyouliu.bpmn");
	      builder.addClasspathResource("ziyouliu.png");
	      builder.deploy();
		System.out.println("创建成功");
	}
	
	/**
	 * 启动流程
	 */
	
	public void  StartProcess(){
		 ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById("ziyouliu:1:4");
		 String id = processInstance.getId();
	     System.out.println("启动流程成功,流程的Id是:"+id);
	}
	 /**
	  * 查询所有的活动节点
	  */
	public void  queryAllActivities(){
		
		RepositoryService repositoryService = processEngine.getRepositoryService();
		ReadOnlyProcessDefinition deployedProcessDefinition = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition("ziyouliu:1:4");
	    List<ActivityImpl> activities = (List<ActivityImpl>) deployedProcessDefinition.getActivities();
	    for (ActivityImpl activityImpl : activities) {
			System.out.println(activityImpl.getId()+"活动节点的名称:"+activityImpl.getProperty("name"));
			
		}
	}
	   /**
	    *  根据ActivityId 查询出来想要活动Activity
	    * @param id
	    * @return
	    */
       public ActivityImpl  queryTargetActivity(String id){
		
		RepositoryService repositoryService = processEngine.getRepositoryService();
		ReadOnlyProcessDefinition deployedProcessDefinition = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition("ziyouliu:1:4");
	    List<ActivityImpl> activities = (List<ActivityImpl>) deployedProcessDefinition.getActivities();
	    for (ActivityImpl activityImpl : activities) {
			if(activityImpl.getId().equals(id)){
				return activityImpl;
			}
		 }
	    return null;
	}
	/**
	 * 查询当前的活动节点
	 */
	public ActivityImpl qureyCurrentTask(String processDefinitionId){
		RuntimeService runtimeService = processEngine.getRuntimeService();
//		String processDefinitionId="ziyouliu:1:4";
	    Execution execution = runtimeService.createExecutionQuery().processDefinitionId(processDefinitionId).singleResult();
	    String activityId = execution.getActivityId();
	    ActivityImpl currentActivity = queryTargetActivity(activityId);
	    System.out.println(currentActivity.getId()+""+currentActivity.getProperty("name"));
	    return currentActivity;
	}
	
	
	 
	
	/**
	 * 第一种自由跳转的方式:
	 *   这种方式是通过 重写命令  ,推荐这种方式进行实现(这种方式的跳转,最后可以通过taskDeleteReason 来进行查询 )
	 */
	
	 public void jumpEndActivity(){
		   //当前节点
		 ActivityImpl currentActivityImpl = qureyCurrentTask("ziyouliu:1:4");
		  //目标节点
		 ActivityImpl targetActivity = queryTargetActivity("shenchajigou");
		  //当前正在执行的流程实例Id
		 final String executionId="7501";
		
		 ((RuntimeServiceImpl)processEngine.getRuntimeService()).getCommandExecutor().execute(new Command<Object>() {
			public Object execute(CommandContext commandContext) {
				ExecutionEntity execution = commandContext.getExecutionEntityManager().findExecutionById(executionId);
		          execution.destroyScope("jump");  //
		          ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
		          ActivityImpl findActivity = processDefinition.findActivity("endevent1");
		          execution.executeActivity(findActivity);
		          return execution;
			  }
		
		   });
		 System.out.println("完成");
	 }
	
    /**
     * 查询跳转  通过 taskDeleteReason 可以设置为废除 等
     * taskDeleteReason  对应数据库表中act_hi_taskinst 的 delete_reason_ 字段;
     * 
     */
	public void queryAbolishActivity()
	{
		HistoryService historyService = processEngine.getHistoryService();
        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processDefinitionId("ziyouliu:1:4").taskDeleteReason("jump").list();
		for (HistoricTaskInstance historicTaskInstance : list) {
			System.out.println("流程的名字是:"+historicTaskInstance.getName()+"分配人:"+historicTaskInstance.getAssignee());
		}
	}
	
	 /**
	  * 第二种自由跳转的方式
	  * 这种是通过改变 流程的路线来进行跳转
	  */
	@Test
	public void JumpEndActivity(){
		 TaskService taskService = processEngine.getTaskService();
		 Task task = taskService.createTaskQuery().processDefinitionId("ziyouliu:1:4").taskAssignee("zuzhang").singleResult();
		 ActivityImpl currentActivity = qureyCurrentTask("ziyouliu:1:4");
		 ActivityImpl targetActivity = queryTargetActivity("endevent1");
		   //通过活动可以获得流程 将要出去的路线,只要更改出去的目的Activity ,就可以实现自由的跳转
		    
		 List<PvmTransition> outgoingTransitions = currentActivity.getOutgoingTransitions();
		  for (PvmTransition pvmTransition : outgoingTransitions) {
			  TransitionImpl transitionImpl= (TransitionImpl)pvmTransition;
			  transitionImpl.setDestination(targetActivity);
		 }
		  taskService.complete(task.getId());
	   
	}
	
	
	
}


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值