Activiti7工作流引擎之流程变量

目录

 

流程变量类型

流程变量作用域

流程变量使用

设置流程控制变量

 设置 global 流程变量有四种

设置 local 流程变量有两种

未解决的问题


流程变量类型

流程控制变量分为九大类型

注意:如果是将对象存储到流程变量中,必须要实现序列化接口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);
	}
	

上图执行过程中报错了(待解决

流程加入流程控制变量进行工作流分支控制,当请假天数大于三天必须由总经理审批,否则由部门领导同意审批即可存档。


 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值