![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM0ADMyAjNmFjM0kzN3QmYyYzX0QDNxgTMwMzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
流程變量
流程執行個體按步驟執行時,需要使用一些資料。在Flowable中,這些資料稱作變量(variable),并會存儲在資料庫中。變量可以用在表達式中(例如在排他網關中用于選擇正确的出口路徑),也可以在Java服務任務(service task)中用于調用外部服務(例如為服務調用提供輸入或結果存儲),等等。
流程執行個體可以持有變量(稱作流程變量 process variables);使用者任務以及執行(executions)——流程目前活動節點的指針——也可以持有變量。流程執行個體可以持有任意數量的變量,每個變量存儲為ACT_RU_VARIABLE資料庫表的一行。
所有的startProcessInstanceXXX方法都有一個可選參數,用于在流程執行個體建立及啟動時設定變量。例如,在RuntimeService中:
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);
也可以在流程執行中加入變量。例如,(RuntimeService):
void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);
1.全局變量
流程變量的預設作用域是流程執行個體。當一個流程變量的作用域為流程執行個體時,可以稱為 global 變量
注意:如: Global變量:userId(變量名)、zhangsan(變量值)
global 變量中變量名不允許重複,設定相同名稱的變量,後設定的值會覆寫前設定的變量值。
2. 局部變量
任務和執行執行個體僅僅是針對一個任務和一個執行執行個體範圍,範圍沒有流程執行個體大, 稱為 local 變量。
Local 變量由于在不同的任務或不同的執行執行個體中,作用域互不影響,變量名可以相同沒有影響。Local 變量名也可以和 global 變量名相同,沒有影響。
3.案例講解
需求:員工建立出差申請單,由部門經理稽核,部門經理申請通過後3天以下由财務直接申批,3天以上先由總經理審批,總經理審批通過後再由财務審批。
連接配接先設定條件
部署流程
@Test
public void deploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("出差申請單.bpmn20.xml")
.name("請假流程...")
.category("請假") // 分類
.tenantId("dpb") // 租戶id
.deploy();
System.out.println("deploy.getId() = " + deploy.getId());
System.out.println("deploy.getName() = " + deploy.getName());
System.out.println("deploy.getCategory() = " + deploy.getCategory());
}
啟動流程執行個體:并且指定全局流程變量
/**
* 在啟動流程執行個體的時候設定流程變量
*/
@Test
public void runProcess(){
// 擷取流程引擎對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 啟動流程執行個體通過 RuntimeService 對象
RuntimeService runtimeService = processEngine.getRuntimeService();
// 設定流程變量
Map<String,Object> variables = new HashMap<>();
// 設定assignee的取值
variables.put("assignee0","張三");
variables.put("assignee1","李四");
variables.put("assignee2","王五");
variables.put("assignee3","趙财務");
// 啟動流程執行個體,第一個參數是流程定義的id
ProcessInstance processInstance = runtimeService
.startProcessInstanceById("evection:1:4",variables);// 啟動流程執行個體
// 輸出相關的流程執行個體資訊
System.out.println("流程定義的ID:" + processInstance.getProcessDefinitionId());
System.out.println("流程執行個體的ID:" + processInstance.getId());
System.out.println("目前活動的ID:" + processInstance.getActivityId());
}
完成Task任務,同時也可以指定流程變量
/**
* 完成任務時指定流程變量
*/
@Test
public void completeTask(){
// 擷取流程引擎對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionId("evection:1:4")
.taskAssignee("李四")
.singleResult();
// 添加流程變量
Map<String, Object> map = task.getProcessVariables();
map.put("num",4);
// 完成任務
taskService.complete(task.getId(),map);
}
/**
* 通過目前任務設定
*/
@Test
public void currentTask(){
// 目前待辦任務id
// 擷取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionId("evection:1:4")
.taskAssignee("王五")
.singleResult();
// 添加流程變量
Map<String, Object> map = task.getProcessVariables();
map.put("num",1);
// 一次設定多個值 設定局部變量
taskService.setVariables(task.getId(), map);
}