1. 程式人生 > >【Activiti】從入門到放棄——流程變數

【Activiti】從入門到放棄——流程變數

概念
流程變數在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些引數都為流程變數的範圍。流程變數的作用域範圍是流程例項。也就是說各個流程例項的流程變數是不相互影響的。流程例項結束完成以後流程變數還儲存在資料庫中(存放到流程變數的歷史表中)。
在這裡插入圖片描述
新增和獲取流程變數
1:流程變數是什麼:流程變數在整個工作流中扮演很重要的作用
2:有什麼用:在流程中傳遞資訊(共享資訊)
3:設計思想(儘量瞭解)
4:操作:設定\獲取
步驟:1繪製流程定義圖2部署流程3啟動流程4測試
1.流程圖
在這裡插入圖片描述
部署流程定義

@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();	
	}

啟動流程例項

@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
	}

設定流程變數

@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這個表新增資料

獲取流程變數

/**
	 * 獲取流程變數的方式:
	 * @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
模擬流程變數的設定和獲取的場景

/**
	 * 模擬檢視設定變數和獲取變數的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表示流程變數的值