Activiti流程实例,任务,执行对象控制流程的执行

代码:

package com.ytdx.processInstance;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

/**
 * 流程实例,任务,执行对象控制流程的执行
 * @author lhy
 *
 */
public class ProcessInstanceTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 1.部署流程定义(从zip)
	 */
	@Test
	public void deploymentProcess_zip(){
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("MyProcess.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);
		Deployment deployment = processEngine.getRepositoryService()                    //与流程定义和部署对象相关的Service
				.createDeployment()                                                     //创建一个部署对象
				.name("流程实例定义")                                                         //添加部署的名称
				.addZipInputStream(zipInputStream)                                      //指定zip格式的文件完成部署
				.deploy();                                                              //完成部署
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	/**
	 * 2.启动流程实例
	 */
	@Test
	public void startProcessInstance(){
		String processDefinitionKey = "myProcess";                    //流程定义的key
		ProcessInstance pi = processEngine.getRuntimeService()        //与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);     //使用流程定义的key启动流程实例,key对应myProcess.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
		System.out.println("流程实例ID:"+pi.getId());                    //流程实例ID:1301
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());   //流程定义ID:myProcess:10:1204
	}
	
	/**
	 * 3.查询当前人的个人任务
	 */
	@Test
	public void SelectByPersonalTask(){
		String assignee = "海哥";
		List<Task> list = processEngine.getTaskService()               //与正在执行的任务管理相关的Service
				.createTaskQuery()                                     //创建任务查询对象
				/**查询条件(where部分)*/
				.taskAssignee(assignee)                                //指定个人任务查询,指定办理人
//				.taskCandidateUser(candidateUser)                      //组任务的办理人查询
//				.processDefinitionId(processDefinitionId)              //使用流程定义ID查询
//				.processInstanceId(processInstanceId)                  //使用流程实例ID查询
//				.executionId(executionId)                              //使用执行对象ID查询
				/**排序*/
				.orderByTaskCreateTime().asc()                         //使用创建时间的升序排列
				/**返回结果集*/
//				.singleResult()                                        //返回惟一结果集
//				.count()                                               //返回结果集的数量
//				.listPage(firstResult, maxResults);                    //分页查询
				.list();                                               //返回列表
		if(list!=null && list.size()>0){
			for(Task task : list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("########################################################");
			}
		}
	}
	
	/**
	 * 4.完成我的任务
	 */
	@Test
	public void completePersonalTask(){
		String taskId = "1304";
		processEngine.getTaskService()                                 //与正在执行的任务管理相关的Service
		             .complete(taskId);
		System.out.println("完成任务:任务ID:"+taskId);
	}
	
	/**
	 * 5.查询流程状态(判断流程正在执行,还是结束)
	 */
	@Test
	public void isProcessEnd(){
		String processInstanceId = "1402";
		ProcessInstance pi = processEngine.getRuntimeService()          //表示正在执行的流程实例和执行对象
				.createProcessInstanceQuery()                           //创建流程实例查询
				.processInstanceId(processInstanceId)                   //使用流程实例ID查询
				.singleResult();
		if(pi == null){
			System.out.println("流程已经结束");
		}else{
			System.out.println("流程没有结束");
		}
	}
	
	/**
	 * 6.查询历史任务(后面讲)
	 */
	@Test
	public void findHistoryTask(){
		String taskAssignee = "海哥";
		List<HistoricTaskInstance> list = processEngine.getHistoryService()         //与历史数据(历史表)相关的Service
				.createHistoricTaskInstanceQuery()                                  //创建历史任务实例查询
				.taskAssignee(taskAssignee)                                         //指定历史任务的办理人
				.list();
		if(list !=null && list.size()>0){
			for(HistoricTaskInstance hti:list){
				System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());
				System.out.println("################################");
			}
		}
	}
	
	/**
	 * 7.查询历史流程实例(后面讲)
	 */
	@Test
	public void findHistoryProcessInstance(){
		String processInstanceId = "1301";
		HistoricProcessInstance hpi = processEngine.getHistoryService()             //与历史数据(历史表)相关的Service
				.createHistoricProcessInstanceQuery()                               //创建历史流程实例查询
				.processInstanceId(processInstanceId)                               //使用流程实例ID查询
				.singleResult();
		System.out.println(hpi.getId()+"    "+hpi.getProcessDefinitionId()+"    "+hpi.getStartTime()+"    "+hpi.getEndTime()+"     "+hpi.getDurationInMillis());
	}
}

总结:

Execution   执行对象

 按流程定义的规则执行一次的过程.

 对应的表:

  act_ru_execution: 正在执行的信息

  act_hi_procinst:已经执行完的历史流程实例信息

  act_hi_actinst:存放历史所有完成的活动

ProcessInstance  流程实例

 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个

注意

    (1)如果是单例流程,执行对象ID就是流程实例ID

    (2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同

    (3)一个流程中,流程实例只有1个,执行对象可以存在多个。

Task 任务

 执行到某任务环节时生成的任务信息。

 对应的表:

  act_ru_task:正在执行的任务信息

  act_hi_taskinst:已经执行完的历史任务信息


猜你喜欢

转载自blog.csdn.net/linhaiyun_ytdx/article/details/80953621