Activiti工作流--流程變數的設定與應用--之六
阿新 • • 發佈:2018-12-15
流程變數
在流程執行或者任務執行過程中,用於設定和獲取變數,工作流引擎通過使用流程變數在溜車鞥的執行過程中傳遞引數。
流程變數的作用域
只對應一個流程例項,也就是各個流程之間的變數是相互不影響的。
流程變數的設定
流程變數可以在流程例項啟動的時候,在任務執行的過程中,在任務執行完畢餓時候進行設定。
先獲取連線
private ProcessEngine processEngine;
@Before
public void initProcessEngine(){
processEngine = ProcessEngines.getDefaultProcessEngine ();
}
- 流程定義與部署 設計一個財務報賬的流程,並且部署成功,生成一個流程定義
@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());
}
- 啟動流程
@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
}
- 查詢個人任務 ,設定流程變數
設定流程變數有三種方式(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);
}
- 獲取流程變數
類似於設定流程變數的介面和方法
@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());
}
- 歷史流程變數
/**
* 當某個任務結束以後,在任務表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("---------------------");
}
}
}