Activiti_流程变量

1、概念

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。

2、添加和设置流程变量

1:流程变量是什么:流程变量在整个工作流中扮演很重要的作用

2:有什么用:在流程中传递信息(共享信息)

3:设计思想(尽量了解)

4:操作:设置\获取

 ------

  步骤:

1绘制流程定义图2部署流程3启动流程4测试

2.1、流程图

2.2、部署流程定义

@Test
	public void deployTest() {
		//获取核心对象
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//获取服务
		RepositoryService repositoryService = processEngine.getRepositoryService();
		//操作
		DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
		deploymentBuilder
				.name("请假流程")//设置部署名称
				.addClasspathResource("ProcessVarTest.bpmn")
				.addClasspathResource("ProcessVarTest.png");
		deploymentBuilder.deploy();	
	}

 2.3、启动流程实例

@Test
	public void  startProcessTest() throws Exception {
		//创建核心对象
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//获取服务
		RuntimeService runtimeService = processEngine.getRuntimeService();
		String processDefinitionKey="ProcessVarTestId";
		Map<String,Object> variables=new HashMap<>();
		variables.put("剩余年假天数", 3);
		variables.put("剩余病假天数", 10);
		//操作:启动的时候设置流程变量
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
		System.out.println("pId="+processInstance.getId());//2501
	}

 2.4、设置流程变量

@Test
	public void  setVarTest() throws Exception {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		String processInstanceId="2501";
		String assignee="小莉";
		
		//通过任务服务获取这个流程实例中  小莉的唯一的一个任务
		Task task = taskService.createTaskQuery()
		.processInstanceId(processInstanceId)//在一次流程实例中一个人的任务是唯一的
		.taskAssignee(assignee)
		.singleResult();
		System.out.println(task);
		
		//设置一个流程变量
		String taskId = task.getId();
		taskService.setVariable(taskId, "请假人", assignee);
		Map<String,Object> variables=new HashMap<>();
		variables.put("请假原因","想男朋友了");//设置String
		variables.put("请假天数", 3);//设置Integer
		variables.put("是否扣工资",true);//设置boolean:存long型:1true;0false
		variables.put("请假开始时间", new Date());//设置Date类型
		variables.put("扣多少钱", 666.666d);//设置Double
		//设置多个流程变量:
		taskService.setVariables(taskId, variables);
		
		//完成任务的时候设置:
		Map<String,Object> variables1=new HashMap<>();
		variables1.put("叫老板", "亲爱的老板,我真的要回去找男朋友,很急的。。。。。");
		taskService.complete(taskId, variables1);
	}

 说明:

1)流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置

2)基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。

3)Javabean类型设置流程变量,需要这个javabean实现了Serializable接口

4)设置流程变量的时候,向act_ru_variable这个表添加数据

2.5、获取流程变量

/**
	 * 获取流程变量的方式:
	 * @throws Exception
	 */
	@Test
	public void  getVarTest() throws Exception {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		String processInstanceId="2501";
		String assignee="美丽";
		//一个流程实例中,一个办理人只有一个任务
		Task task = taskService.createTaskQuery().
				processInstanceId(processInstanceId).
				taskAssignee(assignee)
				.singleResult();
		String taskId=task.getId();
		
		Map<String, Object> variables = taskService.getVariables(taskId);
		System.out.println("所有的流程变量:"+variables);
		Map<String, Object> variables2 = taskService.getVariables(taskId, Arrays.asList("请假天数","叫老板"));
		System.out.println("批量获取流程变量:"+variables2);
		Double money = (Double) taskService.getVariable(taskId, "扣多少钱");
		System.out.println("获取一个变量:"+money);
		Date beginDate = taskService.getVariable(taskId, "请假开始时间",Date.class);
		System.out.println("获取一个变量:"+beginDate);
	}

说明:

1)流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的

2)使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。

3)Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID

2.6、模拟流程变量的设置和获取的场景

/**
	 * 模拟查看设置变量和获取变量的api,目的是整理属性api
	 * //设置流程变量:4种
			//①:启动流程的时候设置
			//②:任务完成的时候设置
			//③:runtimeService设置
			//④:taskService设置
		//获取流程变量:2种
			//①:runtimeService获取变量
			//②:taskService获取变量
	 * @throws Exception
	 */
	@Test
	public void  setVarAndGetVarTest() throws Exception {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RuntimeService runtimeService = processEngine.getRuntimeService();
		TaskService taskService = processEngine.getTaskService();
		//设置流程变量:4种
			//①:启动流程的时候设置
				//runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
			//②:任务完成的时候设置
				//taskService.complete(taskId, variables);
			//③:runtimeService设置
		 		//runtimeService.setVariable(executionId, variableName, value);//存一个
		 		//runtimeService.setVariables(executionId, variables);//存多个
			//④:taskService设置
				//taskService.setVariable(taskId, variableName, value);//存一个
				//taskService.setVariables(taskId, variables);//存多个
		//获取流程变量:2种
			//①:runtimeService获取变量
				//runtimeService.getVariables(executionId)//获取所有
				//runtimeService.getVariables(executionId, variableNames)//批量获取
				//runtimeService.getVariable(executionId, variableName);//获取一个,但是要强转
				//runtimeService.getVariable(executionId, variableName, variableClass)//获取一个,带泛型,不强转
			//②:taskService获取变量
				//taskService.getVariables(taskId)//获取所有
				//taskService.getVariables(taskId, variableNames)//批量获取
				//taskService.getVariable(taskId, variableName);//获取一个,但是要强转
				//taskService.getVariable(taskId, variableName, variableClass)//获取一个,带泛型,不强转
	}

说明:

1)RuntimeService对象可以设置流程变量和获取流程变量

2)TaskService对象可以设置流程变量和获取流程变量

3)流程实例启动的时候可以设置流程变量

4)任务办理完成的时候可以设置流程变量

5)流程变量可以通过名称/值的形式设置单个流程变量

6)流程变量可以通过Map集合,同时设置多个流程变量

                Map集合的key表示流程变量的名称

                Map集合的value表示流程变量的值

3、流程变量类型

从图中可以看出包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。如果想用javabean 作为流程变量,有两种情况:

   1、是hibernate的实体类型(持久化类、映射文件)

            主键的类型必须是long或者string

   2、实现Serializable接口即可

3. 1、实现了Serializable的JavaBean

步骤如下:

1)加一个javabean,这个javabean实现了Serializable接口

public class Person implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -3517396639445147065L;
	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + "]";
	}

	public Person(Long id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

}

2)添加流程变量

@Test
	public void  setVarTest() throws Exception {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		String processInstanceId="2501";
		String assignee="小莉";
		
		//通过任务服务获取这个流程实例中  小莉的唯一的一个任务
		Task task = taskService.createTaskQuery()
		.processInstanceId(processInstanceId)//在一次流程实例中一个人的任务是唯一的
		.taskAssignee(assignee)
		.singleResult();
		System.out.println(task);
		
		//设置一个流程变量
		String taskId = task.getId();
		
		//流程变量设置java对象:
		taskService.setVariable(taskId, "我是一个java对象", new Person(1L,"大花"));
		taskService.complete(taskId);
	}

3)获取流程变量

@Test
	public void  getVarTest() throws Exception {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		String processInstanceId="2501";
		String assignee="美丽";
		//一个流程实例中,一个办理人只有一个任务
		Task task = taskService.createTaskQuery().
				processInstanceId(processInstanceId).
				taskAssignee(assignee)
				.singleResult();
		String taskId=task.getId();
		Person person = taskService.getVariable(taskId, "我是一个java对象",Person.class);
		System.out.println("我是一个java对象:"+person);
	}

3.2、hibernate的实体类

步骤:

1)增加持久化类Form

注意:这个是实体类必须为final

2)增加映射文件Form.hbm.xml

3)在jbpm.hibernate.cfg.xml中添加映射文件

  1. 查询时用下面的方法:

猜你喜欢

转载自blog.csdn.net/weixin_42560234/article/details/84638595