(八)Activiti之流程变量和局部流程变量

一、流程变量

  1.1  概念

(八)Activiti之流程变量和局部流程变量

  • 如果,当流程走到"学生请假"这个任务节点的时候,此时可以用TaskService设置流程变量,变量值包含请假人、请假时间、请假理由等信息,这些信息存在表act_ru_variable中,当"学生请假"这个任务节点完成之后,“班长审批”这个任务节点可以看到"学生请假"任务节点设置的所有流程变量值(请假人等信息),“班主任审批”这个任务节点也可以看到"学生请假"任务节点设置的所有流程变量值。 但是当整个流程走完的时候,运行时的表(以act_ru开头的表)数据清空,自然也就读取不到。

 

  1.2  设置流程变量

  • 本章案例是执行完学生请假流程中的 1.2  启动流程实例之后在执行,此时流程走到下图红圈这个任务节点,设置请假人信息。

(八)Activiti之流程变量和局部流程变量

 

    
    /**
     * 设置流程变量数据
     */
    @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); // 存序列化对象
    }
  • taskId="15004"; 是由“学生请假”这个任务节点的id
  • 注意:Student 必须序列化。
  • 结果如下图,说明流程变量的值已经存入表中:

(八)Activiti之流程变量和局部流程变量

 

   1.3  获取流程变量

  •  上述步骤在“学生请假”任务节点设置流程变量之后,接着运行学生请假流程中的 1.4  张三完成学生请假任务,即流程走到下图,获取流程变量值。

 (八)Activiti之流程变量和局部流程变量

    /**
     * 获取流程变量数据
     */
    @Test
    public void getVariableValues(){
        TaskService taskService=processEngine.getTaskService(); // 任务Service
        String taskId="20002";
        Integer days=(Integer) taskService.getVariable(taskId, "days");
         Date date=(Date) taskService.getVariable(taskId, "date");
        String reason=(String) taskService.getVariable(taskId, "reason");
        Student student=(Student) taskService.getVariable(taskId, "student"); 
        System.out.println("请假天数:"+days);
        System.out.println("请假日期:"+date);
        System.out.println("请假原因:"+reason);
        System.out.println("请假对象:"+student.getId()+","+student.getName());
    }
  • taskId="20002";  20002是“班长审批”任务的id
  • 结果如下图,成功获取到流程变量。

(八)Activiti之流程变量和局部流程变量

 

   1.4  另一种方法(将数据存在map中)设置流程变量

    /**
     * 设置流程变量数据
     */
    @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 getVariableValues2(){
        TaskService taskService=processEngine.getTaskService(); // 任务Service
        String taskId="20002";
        Map<String,Object> variables=taskService.getVariables(taskId);
        Integer days=(Integer) variables.get("days");
        Date date=(Date) variables.get("date");
        String reason=(String) variables.get("reason");
        Student student=(Student)variables.get("student"); 
        System.out.println("请假天数:"+days);
        System.out.println("请假日期:"+date);
        System.out.println("请假原因:"+reason);
        System.out.println("请假对象:"+student.getId()+","+student.getName());
    }

 

 二、流程局部变量

  • 局部流程变量只能在该任务节点中设置和获取。如下图,“学生请假”任务节点设置的流程局部变量只能在该“学生请假”节点获取,“班长审批”节点或者"班主任审批"节点获取就为空。

(八)Activiti之流程变量和局部流程变量

  • 设置局部流程变量
    TaskService taskService=processEngine.getTaskService(); // 任务Service
        String taskId="72504";
        taskService.setVariableLocal(taskId,"date", new Date());
  • 获取局部流程变量
    TaskService taskService=processEngine.getTaskService(); // 任务Service
        String taskId="80002";  
        Date date=(Date) taskService.getVariableLocal(taskId, "date");