目录
流程变量类型
流程控制变量分为九大类型
注意:如果是将对象存储到流程变量中,必须要实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要生成serialVersionUID.(否则报如下错误)
org.activiti.engine.ActivitiException: couldn't find a variable type that is able to serialize org.wxy.com.model.Holiday@1d0d6318
at org.activiti.engine.impl.variable.DefaultVariableTypes.findVariableType(DefaultVariableTypes.java:62)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.createVariableInstance(VariableScopeImpl.java:868)
at org.activiti.engine.impl.persistence.entity.ExecutionEntityImpl.createVariableInstance(ExecutionEntityImpl.java:534)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.createVariableLocal(VariableScopeImpl.java:789)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:666)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:616)
流程变量作用域
流程变量的作用域默认是一个流程实例(processInstance),也可以是一个任务(task)或一个执行实例 (execution),这三个作用域流程实例的范围最大,可以称为 global 变量,任务和执行实例仅仅是针对 一个任务和一个执行实例范围,范围没有流程实例大,称为 local 变量。
流程变量使用
global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。
Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。
Local 变量名也可以和 global 变量名相同,没有影响。
设置流程控制变量
设置 global 流程变量有四种
第一种:启动流程时设置
//流程实例的启动
@Test
public void testprocessstart(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义key
String processDefinitionKey = "myProcess";
//创建流程启动对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//业务id
String businessKey = "1";
//在启动流程实例时设置流程变量
//定义流程变量为每个流程中的每个环节分配负责人
Map<String, Object> variables = new HashMap<String, Object>();
//员工填写申请当
variables.put("staff", "员工王五");
//设置部门领导审批负责人
variables.put("divManager", "张三");
//设置总经理审批负责人
variables.put("genManager", "李四");
//设置请假天数
Holiday holiday = new Holiday();
holiday.setNum(3);
variables.put("holiday", holiday);
//设置流程变量assignee
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey, variables);
System.out.println("活动id:"+ processInstance.getActivityId());
System.out.println("实例id:"+ processInstance.getProcessInstanceId());
}
启动后设置变量会在act_ru_variable表生成设置的变量信息
第二种:任务办理时设置
//任务办理时设置设置变量
@Test
public void testDealingSetVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义key
//创建流程启动对象
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//查询当前用户的任务
Task task = taskService.createTaskQuery().
processDefinitionKey(processDefinitionKey).
taskAssignee(" 员工王五").singleResult();
String taskId = task.getId();
//定义流程变量为每个流程中的每个环节分配负责人
Map<String, Object> variables = new HashMap<String, Object>();
//设置请假天数
Holiday holiday = new Holiday();
holiday.setNum(3);
variables.put("holiday", holiday);
taskService.complete(taskId,variables);
}
测试员工王五提交请假审情单,且设置请假三天时,然后由部门领导审批,最后直接人事存档
@Test
public void testDealingSetVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义key
//创建流程启动对象
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//查询当前用户的任务
Task task = taskService.createTaskQuery().
processDefinitionKey(processDefinitionKey).
taskAssignee("张三").singleResult();
String taskId = task.getId();
taskService.complete(taskId);
}
测试发现部门领导审批后直接人事存档,变量生效测试成功。
第三种:通过当前流程实例设置
注意:通过当前流程实例设置前提是,该流程实例必须未执行完成
流程启动时,请假天数变量还未设置
//通过流程实例id来设置(前提是流程实例未执行完成)
@Test
public void testprocessInsIdSetVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//设置
String executionId = "2501";
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置请假天数
Holiday holiday = new Holiday();
holiday.setNum(3);
Map<String, Object> variables = new HashMap<String, Object>();
//员工填写申请当
variables.put("holiday", holiday);
//设置部门领导审批负责人
runtimeService.setVariables(executionId, variables);
}
注:executionId 必须当前未结束 流程实例的执行 id,通常此 id 设置流程实例 的 id。 也可以通过 runtimeService.getVariable()获取流程变量
再次查看变量表
第四种:通过当前任务设置
注:通过任务id,设置变量必须是当前待办的任务,如果任务已经执行在设置会报错!!
当前任务执行到2505
//通过流程任务id来设置
@Test
public void testprocessTaskIdSetVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String executid = "2505";
Task task = taskService.createTaskQuery().executionId(executid).singleResult();
System.out.println("任务id:"+task.getId());
//设置
String taskId = task.getId();
processEngine.getTaskService();
//设置请假天数
Holiday holiday = new Holiday();
holiday.setNum(3);
Map<String, Object> variables = new HashMap<String, Object>();
//员工填写申请当
variables.put("holiday", holiday);
//设置部门领导审批负责人
taskService.setVariables(taskId, variables);
}
设置 local 流程变量有两种
第一种:任务办理时设置
局部设置设置是setVariablesLocal : taskService.setVariablesLocal(taskId, variables)
全局变量设置setVariables:taskService.setVariables(taskId, variables)
流程启动后进入第一个环节 员工王五填写请假单,在该节点设置变量
//局部变量设置(任务办理是设置)
@Test
public void testTaskHandlingSetLocalVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务id
String taskId = "2508";
TaskService taskService = processEngine.getTaskService();
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
Holiday holiday = new Holiday ();
holiday.setNum(4);
// 定义流程变量
//变量名是holiday,变量值是holiday对象
variables.put("holiday", holiday);
// 设置local变量,作用域为该任务
taskService.setVariablesLocal(taskId, variables);
taskService.complete(taskId);
}
测试在该环节设置变量后,到部门经理审批后使用holiday变量不生效,则设置本地变量生效。
部门领导审批后,变量未生效,说明设置局部变量生效,测试成功 !!!!!!。
第二种:通过当前任务设置
说明此时进入部门领导审批环节,end_time_为空,说明该任务还未执行
部门领导当前任务id是5005
//局部变量设置(2通过当前任务设置)
@Test
public void testTaskHandlingSetLocalVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务id
String taskId = "5005";
TaskService taskService = processEngine.getTaskService();
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
Holiday holiday = new Holiday ();
holiday.setNum(4);
// 定义流程变量
//变量名是holiday,变量值是holiday对象
variables.put("holiday", holiday);
// 设置local变量,作用域为该任务
taskService.setVariablesLocal(taskId, variables);
}
在act_ge_bytearray中记录了两次设置局部变量信息
部门经理(张三)处理完任务时报错,由于设置的分支判断在连线设置,部门经理环节设置的为局部变量,这个连线上不能够使用,因此报错!!
未解决的问题
此时如何设置变量,使进入下一个环节。
//局部变量设置(2通过当前任务设置)
@Test
public void testTaskHandlingSetLocalVar(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务id
String taskId = "5005";
TaskService taskService = processEngine.getTaskService();
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
Holiday holiday = new Holiday ();
holiday.setNum(4);
// 定义流程变量
//变量名是holiday,变量值是holiday对象
variables.put("holiday", holiday);
// 设置local变量,作用域为该任务
taskService.setVariables(taskId, variables);
taskService.complete(taskId);
}
上图执行过程中报错了(待解决)
流程加入流程控制变量进行工作流分支控制,当请假天数大于三天必须由总经理审批,否则由部门领导同意审批即可存档。