Activiti工作流--流程变量的设置与应用--之六

流程变量

在流程执行或者任务执行过程中,用于设置和获取变量,工作流引擎通过使用流程变量在溜车鞥的执行过程中传递参数。

流程变量的作用域

只对应一个流程实例,也就是各个流程之间的变量是相互不影响的。

流程变量的设置

流程变量可以在流程实例启动的时候,在任务执行的过程中,在任务执行完毕饿时候进行设置。

先获取连接

private ProcessEngine processEngine;
   
@Before
public void initProcessEngine(){
   processEngine = ProcessEngines.getDefaultProcessEngine();
}
  1. 流程定义与部署
    设计一个财务报账的流程,并且部署成功,生成一个流程定义
@Test
public void testProcessDeployment(){
   Deployment deployment = processEngine.getRepositoryService()
   							.createDeployment()
   							.addClasspathResource("diagram/approve.bpmn")
   							.addClasspathResource("diagram/approve.png")
   							.name("财务报账")
   							.deploy();
   System.out.println("流程部署ID:"+deployment.getId());//60001
   System.out.println("流程的名称:"+deployment.getName());
}

approve.bpmn代码

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="approve" name="approveProcess" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="报账申请" activiti:assignee="王五"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="财务审批" activiti:assignee="赵六"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_approve">
    <bpmndi:BPMNPlane bpmnElement="approve" id="BPMNPlane_approve">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="250.0" y="90.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="80.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="480.0" y="80.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="630.0" y="90.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="285.0" y="107.0"></omgdi:waypoint>
        <omgdi:waypoint x="330.0" y="107.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="435.0" y="107.0"></omgdi:waypoint>
        <omgdi:waypoint x="480.0" y="107.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="585.0" y="107.0"></omgdi:waypoint>
        <omgdi:waypoint x="630.0" y="107.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

流程图
流程图
2. 启动流程

@Test
public void testStartProcess(){
   String processDefinitionKey = "approve";
   ProcessInstance processInstance = processEngine.getRuntimeService()
   	.startProcessInstanceByKey(processDefinitionKey);
   System.out.println("流程部署ID:"+processInstance.getId());
   System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
   System.out.println("流程实例ID:"+processInstance.getProcessInstanceId());//62501
}
  1. 查询个人任务 ,设置流程变量

设置流程变量有三种方式(taskService和runtimeService)
单个设置
map集合设置
javaBean设置(序列化)

@Test
public void testSetVariable(){
	String assignee = "王五";
	String processInstanceId = "62501";
	List<Task> list = processEngine.getTaskService()
						.createTaskQuery()
						.taskAssignee(assignee)
						.processInstanceId(processInstanceId)
						.list();
	if (list != null && list .size() > 0) {
		for (Task task : list) {
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("任务ID:"+task.getId());
			System.out.println("任务名称:"+task.getName());
			System.out.println("任务创建时间:"+task.getCreateTime());
		}
	}
	String taskId = "62504";
	//设置流程变量,当任务id相同是,后面的值会覆盖前面的值
	/**
	 * 可以通过processEngine.getTaskService().setVariable(taskId taskid
	 * , variableName 变量名称
	 * , value 变量名称的值
	 * )
	 */
	//第一种方式
	/*processEngine.getTaskService().setVariable(taskId, "报账原因", "出差");
	processEngine.getTaskService().setVariable(taskId, "报账金额", 10000);
	processEngine.getTaskService().setVariable(taskId, "报账时间", new Date());*/
	//第二种方式
	/*Map<String, Object> map = new HashMap<String,Object>();
	map.put("报账原因", "餐费");
	map.put("报账金额", 1000);
	map.put("报账时间", new Date());
	processEngine.getTaskService().setVariables(taskId, map);*/
	//第三种方式,是通过bean的序列化的方式,往bean里面赋值,此時的報賬信息是存在流程圖的表中act_ge_bytearray表中
	ApproveForm approveForm = new ApproveForm();
	approveForm.setApproveReason("餐費");
	approveForm.setApproveMoney("1000");
	approveForm.setDate(new Date());
	processEngine.getTaskService().setVariable(taskId, "報賬信息", approveForm);
}
  1. 获取流程变量

类似于设置流程变量的接口和方法

@Test
public void testGetVariable(){
   String assignee = "赵六";
   String processInstanceId = "62501";
   List<Task> tasks = processEngine.getTaskService()
   					.createTaskQuery()
   					.taskAssignee(assignee)
   					.processInstanceId(processInstanceId)
   					.list();
   if (tasks != null && tasks.size() > 0) {
   	for (Task task : tasks) {
   		System.out.println("流程定义ID:"+task.getProcessDefinitionId());
   		System.out.println("流程实例ID:"+task.getProcessInstanceId());
   		System.out.println("执行对象ID:"+task.getExecutionId());
   		System.out.println("任务ID:"+task.getId());
   		System.out.println("任务名称:"+task.getName());
   		System.out.println("任务创建时间:"+task.getCreateTime());
   	}
   }
   String taskId = "62504";
   ApproveForm approveForm = (ApproveForm)processEngine.getTaskService().getVariable(taskId, "報賬信息");
   System.out.println("报账信息金额:"+approveForm.getApproveMoney());
   System.out.println("报账原因:"+approveForm.getApproveReason());
   System.out.println("报账时间:"+approveForm.getDate());
}
  1. 历史流程变量
/**
 * 当某个任务结束以后,在任务表act_ru_task中的记录会被删除 ,
 * 但是act_hi_taskinst记录的endtime会加上 ,所以我们可以从这个表查询我们的任务执行历史记录
 *  
 * 
 */
@Test
public void testQueryHistoryTask(){
	String assignee = "王五";
	List<HistoricTaskInstance> historyTaskList = processEngine.getHistoryService()
								.createHistoricTaskInstanceQuery()
								.taskAssignee(assignee)
								.list();
	if(historyTaskList!=null&&historyTaskList.size()>0){
		for(HistoricTaskInstance hisTask:historyTaskList){
			System.out.println("流程定义ID:"+hisTask.getProcessDefinitionId());
			System.out.println("流程实例ID:"+hisTask.getProcessInstanceId());
			System.out.println("执行对象ID:"+hisTask.getExecutionId());
			System.out.println("历史任务ID:"+hisTask.getId());//任务ID:12502
			System.out.println("历史任务名称:"+hisTask.getName());
			System.out.println("历史任务的结束时间:"+hisTask.getEndTime());
			System.out.println("---------------------");

			
		}
	}
}

/**
 * 当某个流程实例执行完以后以后,在流程实例表表act_ru_variable中的记录会被删除 ,
 * 但是 act_hi_varinst表中存储了历史记录
 * 
 */
@Test
public void testQueryHistoryVariables(){
	String processInstanceId = "50001";
	 List<HistoricVariableInstance> hisVariableList = processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()
				.processInstanceId(processInstanceId)
				.list();
	if(hisVariableList != null && hisVariableList.size() > 0){
		for(HistoricVariableInstance historicVariableInstance :hisVariableList){
			System.out.println("流程定义ID:"+historicVariableInstance.getProcessInstanceId());
 			System.out.println("历史流程变量名称:"+historicVariableInstance.getVariableName());
 			System.out.println("历史流程变量value:"+historicVariableInstance.getValue());
			System.out.println("---------------------");

		}
	}
}

【上一篇:Activiti工作流–流程启动的相关操作–之五】
【下一篇:Activiti工作流–流程变量应用之一:选择连线–之七】

猜你喜欢

转载自blog.csdn.net/changqi008/article/details/83040888