流程變量在整個(gè)工作流中扮演很重要的作用
例如:請(qǐng)假流程中有請(qǐng)假天數(shù)、請(qǐng)假原因等一些參數(shù)都為流程變量的范圍。流程變量的作用域范圍是流程實(shí)例。也就是說(shuō)各個(gè)流程實(shí)例的流程變量是不相互影響的。
添加流程變量
1、在啟動(dòng)流程實(shí)例時(shí),可以添加流程變量。
public void startProcess() throws Exception { String processDefinitionKey ="varTest"; // 創(chuàng)建流程變量 Map<String,Object> variables = new HashMap<String,Object>(); variables.put("請(qǐng)假人", "馮小剛"); // 在啟動(dòng)時(shí)設(shè)置流程變量 ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey , variables ); System.out.println("pid:" + pi.getId()); }
說(shuō)明:
1) 在啟動(dòng)流程實(shí)例時(shí),通過(guò)重載startProcessInstanceByKey的方法可以加載流程變量。
2) 第二個(gè)參數(shù)要求是Map<String ,Object>類(lèi)型,意味著可以添加多個(gè)流程變量。
3) 當(dāng)這段代碼執(zhí)行完以后,會(huì)在數(shù)據(jù)庫(kù)表act_ru_variable中添加兩行記錄。
2、在辦理任務(wù)時(shí)
在辦理任務(wù)時(shí),有時(shí)候任務(wù)辦理完成以后,要傳遞一些信息到系統(tǒng)中。這個(gè)時(shí)候可以利用TaskService這個(gè)類(lèi)來(lái)添加流程實(shí)例。
public void setVar() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("manager").processInstanceId(processInstanceId ).singleResult();// String taskId /** * 在辦理過(guò)程中設(shè)置流程變量 */// taskService.setVariable(taskId, variableName, value) // 設(shè)置一個(gè)流程變量 Map<String, Object> variables = new HashMap<>();// variables.put("請(qǐng)假時(shí)間", "2013-11-22");// variables.put("請(qǐng)假天數(shù)", "3"); variables.put("請(qǐng)假天數(shù)", 3); taskService.setVariables(task.getId(), variables ); /** * 在任務(wù)完成時(shí)設(shè)置流程變量 */// taskService.complete(taskId)// Map<String, Object> variables = new HashMap<>();// variables.put("請(qǐng)假原因", "約會(huì)??!");// taskService.complete(task.getId(), variables); }
說(shuō)明:
1) 利用setVariables方法在任務(wù)辦理過(guò)程中添加一批流程變量。
2) 利用setVariable方法在任務(wù)辦理過(guò)程中添加一個(gè)流程變量。
3) TaskService有一個(gè)重載 complete方法
3、執(zhí)行流程實(shí)例時(shí)直接在Execution上設(shè)置流程變量
因?yàn)榱鞒套兞康淖饔糜蚓褪橇鞒虒?shí)例,所以只要設(shè)置就行了,不用管在哪個(gè)階段
public void setVarByExecution() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("manager").processInstanceId(processInstanceId ).singleResult();// String taskId /** * 在辦理過(guò)程中設(shè)置流程變量 */// taskService.setVariable(taskId, variableName, value) // 設(shè)置一個(gè)流程變量 Map<String, Object> variables = new HashMap<>(); variables.put("批注", "好好約會(huì),注意安全!!"); runtimeService.setVariables(task.getExecutionId(), variables); /** * 在任務(wù)完成時(shí)設(shè)置流程變量 */// taskService.complete(taskId)// Map<String, Object> variables = new HashMap<>();// variables.put("請(qǐng)假原因", "約會(huì)!!");// taskService.complete(task.getId(), variables); }
另一種設(shè)置變量的方法:
public void setVarByObj() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("manager").processInstanceId(processInstanceId ).singleResult(); Form form = new Form();//這個(gè)javabean實(shí)現(xiàn)了Serializable接口
form.setName("表單名稱(chēng)");
form.setContent("我是張三,我要請(qǐng)假3天"); taskService.setVariable(task.getId(), "form", form); }
獲取流程變量
可以通過(guò)runTimeService的方法來(lái)獲取流程變量。
public void viewVar() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("user").processInstanceId(processInstanceId ).singleResult(); System.out.println("taskName:" + task.getName());// String variableName = "請(qǐng)假人";// String val = (String)taskService.getVariable(task.getId(), variableName ); Map<String,Object> vars = taskService.getVariables(task.getId()); for (String variableName : vars.keySet()) { String val = (String) vars.get(variableName); System.out.println(variableName + " = " +val); } }
說(shuō)明:這些流程變量是從act_ru_variable這個(gè)表中讀出來(lái)的。
聯(lián)系客服