所谓变量就是在流程执行过程中需要获取的数据,而这些数据是我们设置好的,这些数据在activiti中称之为变量。
变量从作用域的角度来来看分为两种:
流程实例变量:在启动流程时设置,整个流程实例中均可获取到,部署好的流程会创建多个流程实例,每个流程实例中的变量独立,互不影响。
任务的局部变量:在任务创建时或创建后设置,在当前任务中可获取。
流程变量有4中设置方法:
ProcessInstance processInstance= runtimeService.startProcessInstanceByKey("leave1", map);taskService.setVariables(taskId, variables);
taskService.setVariable(taskId, "student", student);
taskService.complete(taskId,map);
参考代码:
@RequestMapping(value = "/start",method = RequestMethod.GET) public Map<String,Object> start(@RequestParam String userId){ Map<String,Object> map = new HashMap<>(); Leave leave = new Leave(); leave.setUserId(userId); map.put("leave",leave); ProcessInstance leave1 = runtimeService.startProcessInstanceByKey("leave1", map); String processDefinitionId = leave1.getProcessDefinitionId(); System.out.print("============processDefinitionId:" + processDefinitionId);//流程定义的ID System.out.print("============processInstanceId:" + leave1.getId());//流程实例的ID Map<String, Object> resultMap = new HashMap<>(); resultMap.put("result",leave1); resultMap.put("processDefinitionId",processDefinitionId); resultMap.put("processInstanceId",leave1.getId()); return resultMap; } /** * 设置流程变量数据 */ @Test public void setVariableValues2(){ TaskService taskService=processEngine.getTaskService(); // 任务Service String taskId="15004"; Student student=new Student(); student.setId(1); student.setName("张三"); Map<String, Object> variables=new HashMap<String,Object>(); variables.put("days", 2); variables.put("date", new Date()); variables.put("reason", "发烧"); variables.put("student", student); taskService.setVariables(taskId, variables); } /** * 设置流程变量数据 */ @Test public void setVariableValues(){ TaskService taskService=processEngine.getTaskService(); // 任务Service String taskId="15004"; taskService.setVariable(taskId, "days", 2); taskService.setVariable(taskId, "date", new Date()); taskService.setVariable(taskId, "reason", "发烧"); Student student=new Student(); student.setId(1); student.setName("张三"); taskService.setVariable(taskId, "student", student); // 存序列化对象 }@RequestMapping(value = "/apply",method = RequestMethod.POST) public Map<String,Object> apply(@RequestBody Leave leave){ String taskId = leave.getTaskId(); Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); Map<String,Object> map = new HashMap<>(); // 获取流程参数 对应启动流程时,入参的参数leave Leave variable = (Leave)taskService.getVariable(taskId, "leave"); // 从入参的表单对象中取值,设置流程参数对象的值 variable.setDesc(leave.getDesc()); variable.setStartDate(leave.getStartDate()); variable.setTotalDay(leave.getTotalDay()); variable.setApprover1(leave.getApprover1()); variable.setSubmit(leave.getSubmit()); map.put("leave",variable); taskService.complete(taskId,map); // Map<String, Object> resultMap = ResultMapHelper.getSuccessMap(); Map<String, Object> resultMap = new HashMap<>(); resultMap.put("leave",leave); return resultMap; }
局部变量设置
TaskService taskService=processEngine.getTaskService(); // 任务Service
String taskId="72504";
taskService.setVariableLocal(taskId,"date", new Date());
局部变量用的相对较少,但是有其特殊性,注意其作用域就能很好的控制。