import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;
/**
* 在執行流程的過程中產生數據稱爲流程變量
* 1、流程變量的生命週期
* 就是流程實例
* 2、流程變量和流程實例的關係
* 流程變量必須和流程實例綁定在一起
* 3、通過什麼樣的方法把一個流程變量存放在流程實例中
* 4、通過什麼樣的方法把一個流程變量從流程實例中提取出來
* 5、把一個對象放入到流程變量中,該對象必須實現對象的序列化
* @author zd
*
*/
public class VariablesTest {
/**
* 涉及到的表
* act_hi_varinst varinst:變量實例
* act_ru_variable 存放當前正在執行的流程實例的流程變量
* execution_id_:流程實例ID
* proc_inst_id_:流程實例ID
* 可以根據流程實例ID獲取到該流程實例的流程變量
*/
@Test
public void testStartPI(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("當啓動流程實例的時候", "啓動流程實例的流程變量");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
//當啓動流程實例的時候添加流程變量
.startProcessInstanceByKey("qingjia", variables);
}
/**
* 在完成任務的時候,設置流程變量
*/
@Test
public void testFinishTask(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("請假天數", 3);
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("805", variables);
}
/**
* 在流程實例的任何時候(只要流程實例沒有結束),設置流程變量
*/
@Test
public void testSetVariablesWhenPI(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
/**
* executionId 針對哪一個流程實例設置流程變量
* variableName 變量的名稱
* value 變量的值
*/
.setVariable("801", "aaa", "aaa");
}
/**
* 怎麼樣得到流程變量
*/
@Test
public void testGetVariables(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取指定的流程實例下面的所有的流程變量
Map<String, Object> variables = processEngine.getRuntimeService()
.getVariablesLocal("801");
for (Entry<String, Object> entry:variables.entrySet()) {
if(entry.getValue() instanceof Person){
Person person = (Person)entry.getValue();
System.out.println(person.getName());
}else{
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
}
/**
* 在流程實例的任何時候(只要流程實例沒有結束),設置流程變量
*/
@Test
public void testSetVariables_Object_WhenPI(){
Person person = new Person();
person.setPid(1L);
person.setName("王二麻子");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
/**
* executionId 針對哪一個流程實例設置流程變量
* variableName 變量的名稱
* value 變量的值
*/
.setVariable("801", "person", person);
}
}
person類
import java.io.Serializable;
public class Person implements Serializable{
private Long pid;
private String name;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
給任務賦值任務的執行人
在進入該節點之前就能確定任務的執行者
流程圖中設置流程變量,如下:
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;
/**
* <userTask id="申請請假" name="申請請假" activiti:assignee="#{applicator}"></userTask>
* 如果一個任務節點的執行人是通過上面的形式賦值的,那麼在進入該節點之前,必須給變量applicator賦值(通過流程變量)
* @author zd
*
*/
public class Task1Test {
@Test
public void testDeploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("com/itheima10/activiti/task/task1.bpmn")
.deploy();
}
/**
* 在啓動流程實例的時候,設置流程變量,給aplicator賦值
*/
@Test
public void testStartPI(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("applicator", "張三");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
.startProcessInstanceById("myProcess:1:1204",variables);
}
/**
* 在完成請假申請任務的時候,設置流程變量
*/
@Test
public void testFinishApplicatorTask(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("manager", "李四");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("1305", variables);
}
/**
* 在完成部門經理審批的任務的時候,設置流程變量,給總經理任務的執行人賦值
*/
@Test
public void testFinishManagerTask(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("boss", "王五");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("1403", variables);
}
/**
* 完成總經理的任務
*/
@Test
public void testFinishBossTask(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("1503");
}
}
在進入該節點之後,纔要確定節點的執行者是誰
流程圖如下:
1、可以通過MyTaskListener的方式給任務賦值執行人
<userTask id="部門經理審批" name="部門經理審批">
<extensionElements>
<activiti:taskListener event="create" class="com.itheima10.activiti.task.MyTaskListener"></activiti:taskListener>
</extensionElements>
</userTask>
當進入上述的userTask節點之後,立刻執行MyTaskListener的notify方法
delegateTask.setAssignee(manager);就是給MyTaskListener所在的任務節點賦值任務的執行人
說明:該類是由activiti內部調用的,不是由spring容器產生的,所以在notify方法中沒有辦法使用spring的聲明式事務處理產生事務
2、可以通過代碼的方式設置任務的執行人
processEngine.getTaskService()
.setAssignee(taskId, userId);
通過該方式也可以給正在執行的任務賦值任務的執行人
package com.itheima10.activiti.task;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class Task2Test {
@Test
public void testDeploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("com/itheima10/activiti/task/task2.bpmn")
.deploy();
}
/**
* 啓動流程實例,並且給流程變量 applicator,manager賦值
*/
@Test
public void testStartPI(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("applicator", "張三");
variables.put("manager","李四");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
.startProcessInstanceById("task2:1:2104", variables);
}
/**
* 根據張三查詢任務
*/
@Test
public void testQueryTaskByAssignee(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
List<Task> tasks = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee("張三")
.orderByTaskCreateTime()
.desc()
.list();
for (Task task : tasks) {
System.out.println(task.getAssignee());
System.out.println(task.getName());
}
}
@Test
public void testFinishTask(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService().complete("2206");
}
}
package com.itheima10.activiti.task;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MyTaskListener implements TaskListener{
/**
*
*/
private static final long serialVersionUID = 1830618442071409874L;
@Override
public void notify(DelegateTask delegateTask) {
String manager = delegateTask.getVariable("manager").toString();
delegateTask.setAssignee(manager);
/**
* 獲得spring容器中的bean
* WebApplicationContext ac =
* WebApplicationContextUtils.
* getWebApplicationContext(ServletActionContext.getServletContext());
IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService");
*/
}
}