《Activiti工作流框架》专题(六)-Activiti工作流框架任务类型

1.个人任务

由某一个负责办理,在任务表中通过assignee字段记录

2.公共任务(组任务)

当前的任务可以由多个人办理, 可以在设计流程图时指定多个办理人
在这里插入图片描述
测试:

/*
 * 公共任务测试
 */
public class PublicTask {
    
    
	
	ProcessEngine pe=null;

	@Before
	public void init(){
    
    
		pe = ProcessEngines.getDefaultProcessEngine();
	}
	
	/**
	 * 01-部署流程定义
	 */
	@Test
	public void test1(){
    
    
		DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
		deploymentBuilder.addClasspathResource("Demo.bpmn");
		deploymentBuilder.addClasspathResource("Demo.png");
		Deployment deployment = deploymentBuilder.deploy();
		System.out.println("流程定义部署成功...");
	}
	
	/**
	 * 02-查询流程定义列表
	 */
	@Test
	public void test2() {
    
    
		// 流程定义查询对象,用于查询表act_re_procdef
		ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
		// 添加排序条件
		query.orderByProcessDefinitionVersion().desc();
		// 添加分页查询
		query.listPage(0, 10);
		List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) {
    
    
			System.out.println(pd.getId() + "--" + pd.getName()+"--key:"+pd.getKey());
		}
	}
	
	/**
	 * 03-启动流程实例
	 */
	@Test
	public void test3(){
    
    
		String processDefinitionId="myProcess:1:60004";
		pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
		System.out.println("流程实例定义成功.....");
	}
	
	/**
	 * 04-办理个人任务
	 */
	@Test
	public void test4(){
    
    
		String taskId="62504";
		pe.getTaskService().complete(taskId);
		System.out.println("任务办理成功....");
	}
	
	/**
	 * 05-查询公共任务列表
	 */
	@Test
	public void test5(){
    
    
		TaskQuery query = pe.getTaskService().createTaskQuery();
		//根据候选人过滤
		String candidateUser="小黑";
		query.taskCandidateUser(candidateUser);
		List<Task> list = query.list();
		for (Task task : list) {
    
    
			System.out.println(task.getName()+"----"+task.getId());
		}
	}
	
	/**
	 * 06-拾取任务(将公共任务变为个人任务)
	 */
	@Test
	public void test6(){
    
    
		String userId="小黑";
		String taskId="65002";
		pe.getTaskService().claim(taskId, userId);
		System.out.println("任务拾取成功..");
	}
	
	/**
	 * 07-查询个人任务列表
	 */
	@Test
	public void test7() {
    
    
		TaskQuery query = pe.getTaskService().createTaskQuery();
		String assignee = "小黑";
		query.taskAssignee(assignee);
		List<Task> list = query.list();
		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());
		}
	}
		
	/**
	 * 08-办理任务
	 */
	@Test
	public void test9(){
    
    
		String taskId= "65002";
		pe.getTaskService().complete(taskId);
		System.out.println("办理完成,任务ID是:"+taskId);
	}
}

3.接收任务

接收任务不是由某个人负责办理,通过signal方法让流程执行的
在这里插入图片描述

/**
 * 接受任务测试
 */
public class ReceiveTaskTest {
    
    

	ProcessEngine pe=null;

	@Before
	public void init(){
    
    
		pe = ProcessEngines.getDefaultProcessEngine();
	}
	
	/**
	 * 01-部署流程定义
	 */
	@Test
	public void test1(){
    
    
		DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
		deploymentBuilder.addClasspathResource("Demo1.bpmn");
		deploymentBuilder.addClasspathResource("Demo1.png");
		Deployment deployment = deploymentBuilder.deploy();
		System.out.println("流程定义部署成功...");
	}
	
	/**
	 * 02-查询流程定义列表
	 */
	@Test
	public void test2() {
    
    
		// 流程定义查询对象,用于查询表act_re_procdef
		ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
		// 添加排序条件
		query.orderByProcessDefinitionVersion().desc();
		// 添加分页查询
		query.listPage(0, 10);
		List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) {
    
    
			System.out.println(pd.getId() + "--" + pd.getName()+"--key:"+pd.getKey());
		}
	}
	
	/**
	 * 03-启动流程实例
	 */
	@Test
	public void test3(){
    
    
		String processDefinitionId="myProcess:2:75004";
		pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
		System.out.println("流程实例定义成功.....");
	}
	
	/**
	 * 04-办理任务
	 */
	@Test
	public void test4(){
    
    
		String taskId = "77504";
		pe.getTaskService().complete(taskId );
	}
	
	/**
	 * 05-查询流程实例列表,查询act_ru_execution表
	 */
	@Test
	public void test9() {
    
    
		// 流程实例查询对象,查询act_ru_execution表
		ProcessInstanceQuery query = pe.getRuntimeService().createProcessInstanceQuery();
		query.processDefinitionKey("myProcess");
		query.orderByProcessInstanceId().desc();
		query.listPage(0, 2);
		List<ProcessInstance> list = query.list();
		for (ProcessInstance pi : list) {
    
    
			System.out.println(pi.getId() + " " + pi.getActivityId());
		}
	}
	
	/**
	 * 06-处理接收任务
	 */
	@Test
	public void test5(){
    
    
		String executionId = "77501";
		pe.getRuntimeService().signal(executionId);
	}
}

4.接收任务案例

接收任务(ReceiveTask)即等待任务,接收任务是一个简单任务,它会等待对应消息的到达。当前,官方只实现

了这个任务的java语义。 当流程达到接收任务,流程状态会保存到数据库中。在任务创建后,意味着流程会进入等

待状态,直到引擎接收了一个特定的消息, 这会触发流程穿过接收任务继续执行。

流程图
在这里插入图片描述
流程演示

package cn.gome.j_receiveTask;
 
import java.io.InputStream;
 
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
 
public class ReceiveTaskTest {
    
    
	
	//流程引擎对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义+启动流程实例*/
	@Test
	public void deployementAndStartProcess(){
    
    
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png");
		
		//1.部署流程定义
		Deployment deployment = processEngine.getRepositoryService()
				.createDeployment()//创建部署对象
				.addInputStream("receiveTask.bpmn", inputStreamBpmn)
				.addInputStream("receiveTask.png", inputStreamPng)
				.deploy();
		System.out.println("部署ID:" + deployment.getId());
		
		//2.启动流程实例
		ProcessInstance pi = processEngine.getRuntimeService()
				.startProcessInstanceByKey("receiveTask");//使用流程定义的key的最新版本启动流程
		System.out.println("流程实例ID:"+pi.getId());
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
		
		//3.查询执行对象表,使用流程实例ID和当前活动的名称(receivetask1)
		String processInstanceId = pi.getId();//得到流程实例ID
		Execution execution1 = processEngine.getRuntimeService()
				.createExecutionQuery()
				.processInstanceId(processInstanceId)//流程实例ID
				.activityId("receivetask1")//当前活动的名称
				.singleResult();
		
		//4.使用流程变量设置当日的销售额
		processEngine.getRuntimeService().setVariable(execution1.getId(), "当日销售额", 20000);
		
		//5.向后执行一步
		processEngine.getRuntimeService()
			.signal(execution1.getId());
		
		//6.查询执行对象表,使用流程实例ID和当前活动的名称(receivetask2)
		Execution execution2 = processEngine.getRuntimeService()
				.createExecutionQuery()
				.processInstanceId(processInstanceId)
				.activityId("receivetask2")
				.singleResult();
		
		//7.获取流程变量,给老板发送短信
		Integer value = (Integer) processEngine.getRuntimeService()
				.getVariable(execution2.getId(), "当日销售额");
		System.out.println("给老板发送短信:内容,当日销售额:"+value);
		
		//8.向后执行一步
		processEngine.getRuntimeService()
				.signal(execution2.getId());
		
		//9.判断流程是否结束
		ProcessInstance nowPi = processEngine.getRuntimeService()
				.createProcessInstanceQuery()
				.processInstanceId(pi.getId())
				.singleResult();
		if(nowPi == null){
    
    
			System.out.println("流程结束");
		}
	}

}

说明:与用户任务(UserTask)不同的是,接收任务(ReceiveTask)创建后,会进入一个等待状态,一般指机器自动完成,但需要耗费一定时间的工作,当完成工作后后,向后推移流程,在上面的代码中也就是向下执行一步,使用runtimeService.signal(executionId),传递接收执行对象的id。

猜你喜欢

转载自blog.csdn.net/BruceLiu_code/article/details/113643655