前言
工作流中会带有参数跟着流程走,例如我们的请假例子,请假一定要有请假天数、请假原因和开始时间等参数,这些参数要跟着流程走让经理和老板看到你请假的具体信息。今天就讲这些参数是如何添加到流程中并获取显现。
两种变量添加方式
- 流程实例上的变量
/*
* 流程实例级别的变量(在流程实例启动时就把变量放到正在执行的流程对象中)
*/
@Test
public void startProcessInstanceWithVarivablue(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("请假天数", 3);
map.put("请假原因", "旅游去");
map.put("请假开始时间", new Date());
//在流程实例上添加的变量影响范围:当前流程实例下的所有任务都能获取到流程变量,正在执行的流程对象也能获得到变量
//当流程实例结束时流程变量消失,正在执行的对象消失,流程变量历史表保留变量
//影响的表act_ru_variable和act_hi_varinst.
runtimeService.startProcessInstanceByKey("activiti_leave", map);
}
从代码中可以看出该流程变量是在流程启动时就添加到流程实例中的。下边的代码是如何获取该变量。
@Test
public void SelectVarivablue(){
List<Execution> executionList = runtimeService.createExecutionQuery()
.processDefinitionKey("activiti_leave")
.orderByProcessInstanceId()
.asc()
.list();
Execution execution = executionList.get(0);
Map<String,Object> map = runtimeService.getVariables(execution.getId());
System.out.println(map);
}
2.当前任务中来储存流程变量
/*
* 在当前任务中来储存流程变量,流程的变量储存在正在执行的流程对象上,当前任务后面的所有任务就都能拿到流程变量
*/
@Test
public void putVariablesIntask(){
String assignee = "employnee";
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<String,Object> map = new HashMap<String,Object>();
map.put("请假天数", 3);
map.put("请假原因", "旅游去");
map.put("请假开始时间", new Date());
//当任务完成时设置流程变量
taskService.complete(task.getId(), map);
}
在当前任务中来储存流程变量也分为两种,从上边的代码中也可以看出一种是直接用taskService.setVariable方法(注解掉的部分)设置,另一中是先放在map中再任务完成时添加。
下边是对应上边两种变量设置方法的获取方法
//第一种
@Test
public void getVariablesIntask(){
String assignee = "employnee";
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);
}
//第二种
@Test
public void getVariablesIntaskWithMap(){
String assignee = "employnee";
Task task = taskService.createTaskQuery()
.processDefinitionKey("activiti_leave")
.taskAssignee(assignee)
.singleResult();
Map<String,Object> map = taskService.getVariables(task.getId());
System.out.println(map);
}
以上两种获取方式都是缺点节点的任务只有一个时使用的,如果有多个则需要判断是那个,就使用如下方法
@Test
public void getVariablesIntaskWithMap(){
String assignee = "employnee";
List<Task> taskList = taskService.createTaskQuery()//创建任务 查询对象
.processDefinitionKey("activiti_leave")//根据流程定义key查询
.taskAssignee(assignee)//根据办理人查询
.orderByTaskCreateTime()
.desc()
.list();
//获取第一个任务
Task task = taskList.get(0);
Map<String,Object> map = taskService.getVariables(task.getId());
System.out.println(map);
}
注意事项:
添加的变量可以是自定义的类型,使用自定义的pojo要注意必须实现序列化接口并添加uid,具体的使用方式大家百度吧。