Activiti的學習(四)——流程變數操作、任務型別
阿新 • • 發佈:2018-12-11
ProcessEngine pe = null;
@Before
public void init() {
pe = ProcessEngines.getDefaultProcessEngine();
}
一、流程變數操作
流程變數指的是使用流程變數進行業務資料的傳遞,比如請假的原因、天數等
①在啟動流程例項時設定
在啟動流程例項時,可以新增流程變數。這是新增流程變數的一種時機。
/** * 設定流程變數方式一:在啟動流程例項時設定 */ @Test public void test1() { String processDefinitionKey = "HelloWorldKey"; Map<String, Object> variables = new HashMap<String, Object>(); variables.put("key1", "value1"); variables.put("key2", 200); ProcessInstance pi = pe.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables); System.out.println(pi.getId()); }
說明:
- 在啟動流程例項時,通過過載startProcessInstanceByKey的方法可以載入流程變數。
- 第二個引數要求是Map<String ,Object>型別,意味著可以新增多個流程變數。
- 當這段程式碼執行完以後,會在資料庫表act_ru_variable中新增兩行記錄。
②在辦理任務時設定
在辦理任務時,有時候任務辦理完成以後,要傳遞一些資訊到系統中。這個時候可以利用TaskService這個類來新增流程例項。
/** * 設定流程變數方式二:在辦理任務時設定 */ @Test public void test3() { String taskId = "50006"; Map<String, Object> variables = new HashMap<String, Object>(); variables.put("user", new User(1,"小王")); pe.getTaskService().complete(taskId, variables); }
③流程變數支援的型別
Jdk中提供的資料型別(String、Integer、List 、Map…),自定義的實體類(要求實現序列化介面 Serializable)
如圖是從官網列出來的流程變數的型別:
④使用RuntimeService方法獲取流程變數
可以通過runTimeService的方法來獲取流程變數。說明:這些流程變數是從act_ru_variable這個表中讀出來的。
/** * 獲取流程變數方式:使用RuntimeService的方法獲取 */ @Test public void test6() { String executionId = "2501"; Map<String, Object> variables = pe.getRuntimeService().getVariables(executionId); // System.out.println(variables); Set<String> set = variables.keySet();// key2 key1 user for (String key : set) { Object value = variables.get(key); System.out.println(key + " = " + value); } Object value = pe.getRuntimeService().getVariable(executionId, "user"); System.out.println(value); }
二、任務的型別
①個人任務
由某一個負責辦理,在任務表中通過assignee欄位記錄
②公共任務(組任務)
當前的任務可以由多個人辦理, 可以在設計流程圖時指定多個辦理人
/*
* 公共任務測試
*/
public class PublicTask {
ProcessEngine pe=null;
@Before
public void init(){
pe = ProcessEngines.getDefaultProcessEngine();
}
/**
* 01-部署流程定義
*/
@Test
public void test1(){
DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("Demo.bpmn");
deploymentBuilder.addClasspathResource("Demo.png");
Deployment deployment = deploymentBuilder.deploy();
System.out.println("流程定義部署成功...");
}
/**
* 02-查詢流程定義列表
*/
@Test
public void test2() {
// 流程定義查詢物件,用於查詢表act_re_procdef
ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
// 新增排序條件
query.orderByProcessDefinitionVersion().desc();
// 新增分頁查詢
query.listPage(0, 10);
List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() + "--" + pd.getName()+"--key:"+pd.getKey());
}
}
/**
* 03-啟動流程例項
*/
@Test
public void test3(){
String processDefinitionId="myProcess:1:60004";
pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
System.out.println("流程例項定義成功.....");
}
/**
* 04-辦理個人任務
*/
@Test
public void test4(){
String taskId="62504";
pe.getTaskService().complete(taskId);
System.out.println("任務辦理成功....");
}
/**
* 05-查詢公共任務列表
*/
@Test
public void test5(){
TaskQuery query = pe.getTaskService().createTaskQuery();
//根據候選人過濾
String candidateUser="小黑";
query.taskCandidateUser(candidateUser);
List<Task> list = query.list();
for (Task task : list) {
System.out.println(task.getName()+"----"+task.getId());
}
}
/**
* 06-拾取任務(將公共任務變為個人任務)
*/
@Test
public void test6(){
String userId="小黑";
String taskId="65002";
pe.getTaskService().claim(taskId, userId);
System.out.println("任務拾取成功..");
}
/**
* 07-查詢個人任務列表
*/
@Test
public void test7() {
TaskQuery query = pe.getTaskService().createTaskQuery();
String assignee = "小黑";
query.taskAssignee(assignee);
List<Task> list = query.list();
for (Task task : list) {
System.out.println("待辦任務ID:"+task.getId());
System.out.println("待辦任務名稱:"+task.getName());
System.out.println("任務建立時間:"+task.getCreateTime());
System.out.println("任務辦理人:"+task.getAssignee());
System.out.println("流程例項ID:"+task.getProcessInstanceId());
System.out.println("執行物件ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
}
}
/**
* 08-辦理任務
*/
@Test
public void test9(){
String taskId= "65002";
pe.getTaskService().complete(taskId);
System.out.println("辦理完成,任務ID是:"+taskId);
}
}
③接收任務
接收任務不是由某個人負責辦理,而是通過signal方法讓流程執行的
/**
* 接受任務測試
*/
public class ReceiveTaskTest {
ProcessEngine pe=null;
@Before
public void init(){
pe = ProcessEngines.getDefaultProcessEngine();
}
/**
* 01-部署流程定義
*/
@Test
public void test1(){
DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("Demo1.bpmn");
deploymentBuilder.addClasspathResource("Demo1.png");
Deployment deployment = deploymentBuilder.deploy();
System.out.println("流程定義部署成功...");
}
/**
* 02-查詢流程定義列表
*/
@Test
public void test2() {
// 流程定義查詢物件,用於查詢表act_re_procdef
ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
// 新增排序條件
query.orderByProcessDefinitionVersion().desc();
// 新增分頁查詢
query.listPage(0, 10);
List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() + "--" + pd.getName()+"--key:"+pd.getKey());
}
}
/**
* 03-啟動流程例項
*/
@Test
public void test3(){
String processDefinitionId="myProcess:2:75004";
pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
System.out.println("流程例項定義成功.....");
}
/**
* 04-辦理任務
*/
@Test
public void test4(){
String taskId = "77504";
pe.getTaskService().complete(taskId );
}
/**
* 05-查詢流程例項列表,查詢act_ru_execution表
*/
@Test
public void test9() {
// 流程例項查詢物件,查詢act_ru_execution表
ProcessInstanceQuery query = pe.getRuntimeService().createProcessInstanceQuery();
query.processDefinitionKey("myProcess");
query.orderByProcessInstanceId().desc();
query.listPage(0, 2);
List<ProcessInstance> list = query.list();
for (ProcessInstance pi : list) {
System.out.println(pi.getId() + " " + pi.getActivityId());
}
}
/**
* 06-處理接收任務
*/
@Test
public void test5(){
String executionId = "77501";
pe.getRuntimeService().signal(executionId);
}
}