《Activiti/Flowable 深入BPM工作流》-什么是流程变量?

 

 

           《Activiti/Flowable  深入BPM工作流》-什么是流程变量?

 

 

一. 问题: 


       1. 什么是流程变量?

       2. 什么是global流程变量, local变量?

       3.当前流程实例如何设置?

 

 

二. 详情

     

 1. 什么是流程变量?

           解答: 流程 的运转需要靠流程变量,业务系统和activiti结合, 流程变量就是在activiti管理工作流是根据管理需要而设置的变

量.例如在请假流程流转时,请假大于三天则由总经理审核,否则由人事直接审核,请假天数就可以设置为流程变量,在流程流转时使

用.

 

注意: 

    1.1.  为什么不建议通过activiti的api查询流程变量来实现业务查询?

解答: 虽然流程变量中可用存储业务数据,可用通过activiti的api查询流程变量从而实现 查询业务数据, 但是不建议这么使用, 因为业务数据查询由业务系统负责,

activiti设置流程变量是为了流程执行需要而创建的.

 

   1.2.  为什么用pojo存储到流程变量,一定要实现序列化接口Serializable?

解答: 为了防止由于新增字段无法反序列化,需要生产serialVersionID.

 

   1.3.  流程变量的作用域有哪些?

流程变量默认作用域是一个流程实例(processInstance), 也可以是一个任务(task)或一个执行实例(execution). 这三个作用域流程实例的范围最大,成Global变量.

任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,成为local变量.

 

   特点:

     1.  global变量中变量名不能重复. 设置相同名称的变量,后设置的值会覆盖前面的变量值.

     2. Local变量名可以重复,也可以和global名相同.  local变量由于在不同任务或不同的执行实例中, 作用域互不影响,变量名可以

相同,没有影响.

 

 

2. 什么是global流程变量? global流程变量 案例

请假流程

(1). 需求

   员工创建请假申请单, 由部门经理审核,部门经理审核通过三天及三天以下由人事经理直接审核, 否则由总经理审核, 总经理审核通过再由人事经理存档.

流程图如下: holiday.bpmn

《Activiti/Flowable 深入BPM工作流》-什么是流程变量?_第1张图片

 

(2). 流程定义

请假大于等于三天连线条件:

《Activiti/Flowable 深入BPM工作流》-什么是流程变量?_第2张图片

 

请假天数小于三天连线条件:

《Activiti/Flowable 深入BPM工作流》-什么是流程变量?_第3张图片

 

(3). 设置global流程变量:

  在部门经理审核设置流程变量, 变量值为请假单信息(包括请假天数),部门经理审核后可根据流程变量的值来觉得流程走向.

下面是具体的code实现

holiday.bpmn部署,启动及任务办理设置.

// 新的请假流程定义的部署
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 得到 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("holiday.bpmn")
//                .addClasspathResource("studentHoliday.png")
                .name("请假流程2020-5-20")
                .deploy();

        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
        System.out.println(deploy.getKey());
    }

 

// 启动流程实例,同时还要设置流程变量的值
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 3.流程定义的key问题.
        String processDefinitionKey = "myProcess_1";

        // 初始化
        Map map = new HashMap();
        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        holiday.setHolidayName("请假审批 2020-5-20");
        map.put("holiday", holiday);

        // 4.启动流程实例,兵器而设置变量的值
        //runtimeService.startProcessInstanceByKey("myProcess_1");
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,map);

        // 5.输出实例信息;
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());
        System.out.println(processInstance.getId());
    }

 

任务变量是设置

  在完成任务是设置流程变量, 流程变量只有在该流程完成后其他节点才可能使用该变量,它的作用域是整个流程实例,如果设置的流程变量的key在流程实例中已经存在相同名字,则后设置的变量覆盖前面设置的变量.

这里需要在创建请假单任务完成(以下是通过当前任务id设置任务的)

// 处理任务---zhangsan   / lisi --判断流程变量的请假天数, 目前是1天-->分支:人事经理
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 TaskService
        TaskService taskService = processEngine.getTaskService();

        // 3. 查询当前用户是否有任务
        String taskId = "2508";
//        String key="myProcess_1";
//        Task task = taskService.createTaskQuery()
//                .processDefinitionKey(key)
//                .taskAssignee("zhangsan").singleResult();


        Map map = new HashMap();
        Holiday holiday = new Holiday();
        holiday.setNum(2F);
        holiday.setHolidayName("请假审批 2020-5-19");
        map.put("holiday", holiday);


        // 4. 判断task!=null,说明当前用户有任务
        if(taskId!=null){
            taskService.complete(taskId,map);
            System.out.println("任务执行完成");
        }
    }

 

    3. 当前流程实例如何设置?

 解答: 需要通过当前任务设置流程变量, 需要指定当前任务id, 如果当前执行的任务id不存在则抛出异常. 任务办理时也是通过map设置流程变量,一次可以设置多个变量.

通过流程实例id设置全局变量, 该流程实例必须是未执行完成的.

 

public void setGlobalVariableByExecutionId(){
    //当前流程实例执行 id,通常设置为当前执行的流程实例
    String executionId="2501";
    RuntimeService runtimeService = processEngine.getRuntimeService();
    Holiday holiday = new Holiday();
    holiday.setNum(3);
    //通过流程实例 id设置流程变量
    runtimeService.setVariable(executionId, "holiday", holiday);
    //一次设置多个值
    //runtimeService.setVariables(executionId, variables)
   }

 

注意: 

   executionId必须当前未结束的流程实例的执行id,通常用此id设置流程实例的id,

   当然也可以通过RuntimeService.getVariable()获取流程变量.

 

 

 

 

 

你可能感兴趣的:(activiti7,BPM,Flowable,Activiti,工作流,RuntimeService)