1. 程式人生 > >Activiti的學習(四)——流程變數操作、任務型別

Activiti的學習(四)——流程變數操作、任務型別

    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());
	}

說明:

  1. 在啟動流程例項時,通過過載startProcessInstanceByKey的方法可以載入流程變數。
  2. 第二個引數要求是Map<String ,Object>型別,意味著可以新增多個流程變數。
  3. 當這段程式碼執行完以後,會在資料庫表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);
	}
}