Activiti工作流之流程變數
阿新 • • 發佈:2018-12-19
以請假單為例, 流程變數的意義在於將請假單跟這個流程繫結在一起, 流程走到哪裡, 請假單的狀態就跟到哪裡, 相當於定義了一個流程變數來儲存相對應的狀態.
流程變數存在兩個級別位置, 一是流程例項級別的的流程變數(在流程例項啟動時就將流程變數放入), 二是流程任務級別的流程變數(在執行當前任務時將流程變數放入)
9張表:
SELECT * FROM act_re_deployment; -- 一 流程部署表 SELECT * FROM act_ge_bytearray; -- 二 流程二進位制表 SELECT * FROM act_re_procdef; -- 三 流程定義表 SELECT * FROM act_ru_execution; -- 四 流程正在執行表 SELECT * FROM act_hi_procinst; -- 五 流程例項歷史表 SELECT * FROM act_ru_task; -- 六 流程當前任務表 SELECT * FROM act_hi_taskinst; -- 七 流程歷史任務表 SELECT * FROM act_hi_actinst; -- 八 流程歷史活動節點表 SELECT * FROM act_ru_variable; -- 九 流程變量表 SELECT * FROM act_hi_varinst; -- 十 流程變數歷史表
先決條件:
//定義一個成員變數 RepositoryService repositoryService; RuntimeService runtimeService; TaskService taskService; /** * 獲取流程引擎 */ @Before public void setUp() throws Exception { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); repositoryService = processEngine.getRepositoryService(); runtimeService = processEngine.getRuntimeService(); taskService = processEngine.getTaskService(); } /** * 新增流程例項級別的流程變數並啟動流程 */ @Test public void startProcessInstanceWithVariables() { Map<String, Object> map = new HashMap<String, Object>(); map.put("請假天數", 3); map.put("請假原因", "出國留學了"); map.put("請假開始時間", new Date()); runtimeService.startProcessInstanceByKey("activiti_leave", map); }
① 流程例項級別的流程變數(流程例項範圍大, 能被範圍小的流程任務獲取到)
流程任務物件/流程正在執行物件查詢流程變數測試程式碼:
/** * 根據辦理人查詢任務並找出流程變數 */ @Test public void queryTaskByAssignee(){ String assignee = "employee"; List<Task> taskList = taskService.createTaskQuery() .processDefinitionKey("activiti_leave") .taskAssignee(assignee) .orderByTaskCreateTime() .desc() .list(); Task task = taskList.get(0); Map<String, Object> map = taskService.getVariables(task.getId()); System.out.println(map); List<Execution> executionList = runtimeService.createExecutionQuery() .processDefinitionKey("activiti_leave") .orderByProcessInstanceId() .asc() .list(); Execution execution = executionList.get(0); Map<String, Object> map1 = runtimeService.getVariables(execution.getId()); System.out.println(map1); }
小結: 在流程例項級別上的流程變數, 當流程任務物件所有節點都執行完成之後, 整條流程例項就已經結束了, 此時的流程變數就消失了, 也就無法再根據流程任務物件來拿流程變量了
② 流程任務級別的流程變數
/**
* 在特定的任務下放入流程變數
*/
@Test
public void setVariablesInTask(){
String assignee = "employee";
Task task = taskService.createTaskQuery()
.processDefinitionKey("activiti_leave")
.taskAssignee(assignee)
.singleResult();
// taskService.setVariable(task.getId(), "請假天數", 10);
// taskService.setVariable(task.getId(), "請假原因", "旅遊");
// taskService.setVariable(task.getId(), "開始時間", new Date());
//或者採用下面的map方式
Map<String, Object> map = new HashMap<String, Object>();
map.put("請假天數", 11);
map.put("請假原因", "任性罷了");
map.put("開始時間", new Date());
taskService.setVariables(task.getId(), map);
}
/**
* 取出流程變數
*/
@Test
public void getVariablesInTask(){
String assignee = "employee";
Task task = taskService.createTaskQuery().processDefinitionKey("activiti_leave").taskAssignee(assignee).singleResult();
Integer days = (Integer) taskService.getVariable(task.getId(), "請假天數");
String reason = (String) taskService.getVariable(task.getId(), "請假原因");
Date startTime = (Date) taskService.getVariable(task.getId(), "開始時間");
System.out.println(days);
System.out.println(reason);
System.out.println(startTime);
}
還有一種通過物件的方式新增流程變數的, 具體用法跟上面差不多, 就不貼出程式碼了, 但是注意要在類進行序列化, 並且提供UID.
小結: 在流程任務物件級別上的流程變數, 當前任務以及之後的任務能夠通過當前正在執行的物件(因為該流程變數掛載在當前正在執行的物件上)來獲得到流程變數, 但是在當前任務之前的則無法獲取該流程變數.
Activiti系列回顧: