Activiti流程变量

1. 流程变量的含义:

  我们可以在业务系统和流程系统当中,通过流程变量来制定对应的分支,如:员工请假
  请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务

2. 流程变量的数据类型:

  string,double,boolean,short,long,Integer,binary,date日期
  serializable,如果流程变量需要用到pojo当中的属性字段,则该pojo需要实现序列化接口

3. 流程变量的作用域

  1.默认情况下,流程变量存在整个流程实例当中,每一个环节都可以获取到该变量,称之为global,类似于Java全局变量
  2.任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local 变量。类似于Java局部变量

4.流程变量案例:

   请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务

                    4.1 定义流程图,在流程线上设置流程变量的条件

      

 

 

 

 

                    4.2 定义POJO,要去实现serializable接口

      

/**
 * 业务实体
 */
public class Holiday implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String holidayName; //申请人
    private Date startDate; //开始时间
    private Date endDate;   //结束时间
    private Integer num;    //请假天数
    private String reason;  //请假事由
    private String type;    //请假类型

    public Integer getId() {

        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getHolidayName() {
        return holidayName;
    }

    public void setHolidayName(String holidayName) {
        this.holidayName = holidayName;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}


                    4.3 流程部署

/**
     * 流程部署
     */
    @Test
    public void deployment() {
        //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RepositoryService对象进行流程部署
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("holiday/holiday2.bpmn")     //加载流程文件
                .addClasspathResource("holiday/holiday2.png")
                .name("请假流程-流程变量")       //设置流程名称
                .deploy();                      //部署

        //输出部署信息
        System.out.println("流程名称:" + deployment.getName());
        System.out.println("流程ID:" + deployment.getId());
        System.out.println("流程Key:" + deployment.getKey());
    }

 


                    4.4 启动流程实例

/**
     * 启动流程实例
     */
    @Test
    public void startInstance() {
        //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //设置流程变量
        Holiday holiday = new Holiday();
        holiday.setNum(3);
        //定义一个Map集合,存放流程变量的值
        Map<String, Object> assMap = new HashMap<>();
        assMap.put("holiday", holiday);
        //启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday2");
        System.out.println("流程实例启动成功~");
    }

 

 
                    4.5 测试流程执行

      小于三天lisi执行完后直接到zhaoliu代办

 

     如果请假4天,则需要流转到wangwu审批通过后才能到zhaoliu

 

 

 

 

5. 任务执行时,设置流程变量    

                /**
                 * 任务执行时,设置流程变量
                 */
                @Test
                public void runTask() {


                    //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
                    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                    //获取一个TaskService对象
                    TaskService taskService = processEngine.getTaskService();
                    //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
                    /**
                     * taskCandidateOrAssigned匹配规则:1.Assigned   2.配置bpmn文件中定义的值
                     * taskAssignee匹配规则:1.Assigned
                     */
                    /*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/
                    List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("holiday2").list();
                    //分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);
                    for (Task task : list) {
                        System.out.println("任务名称:" + task.getName());
                        System.out.println("任务执行人:" + task.getAssignee());
                        System.out.println("任务ID:" + task.getId());
                        //设置流程变量
                        Holiday holiday = new Holiday();
                        holiday.setNum(5);
                        //定义一个Map集合,存放流程变量的值
                        Map<String, Object> assMap = new HashMap<>();
                        assMap.put("holiday", holiday);
                        //处理任务
                        taskService.complete(task.getId(),assMap);
                        System.out.println("流程实例ID:" + task.getProcessInstanceId());
                    }
                }

 

6. 通过流程实例ID设置流程变量的值

执行lisi分支任务之前,执行此方法设置值

                /**
                 * 获取到流程实例ID,跟据流程实例设置流程变量的值
                 */
                @Test
                public void getInstanceVar(){
                    //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
                    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                    //获取RuntimeService
                    RuntimeService runtimeService = processEngine.getRuntimeService();
                    //设置流程变量
                    Holiday holiday = new Holiday();
                    holiday.setNum(3);
                    //设置流程变量
                    runtimeService.setVariable("25001","holiday",holiday);
                }

 

7. 根据任务ID,设置流程变量

                /**
                 * 根据任务ID,设置流程变量
                 */
                @Test
                public void runTask() {
                    //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
                    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                    //获取一个TaskService对象
                    TaskService taskService = processEngine.getTaskService();
                    //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
                    /**
                     * taskCandidateOrAssigned匹配规则:1.Assigned   2.配置bpmn文件中定义的值
                     * taskAssignee匹配规则:1.Assigned
                     */
                    /*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/
                    List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("holiday2").list();
                    //分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);
                    for (Task task : list) {
                        System.out.println("任务名称:" + task.getName());
                        System.out.println("任务执行人:" + task.getAssignee());
                        System.out.println("任务ID:" + task.getId());
                        //设置流程变量
                        Holiday holiday = new Holiday();
                        holiday.setNum(5);
                        taskService.setVariable(task.getId(),"holiday",holiday);
                        //处理任务
                        taskService.complete(task.getId());
                        System.out.println("流程实例ID:" + task.getProcessInstanceId());
                    }
                }

 


            
  注意问题:
                1、如果UEL 表达式中流程变量名不存在则报错。
                2、如果UEL 表达式中流程变量值为空NULL,流程不按UEL 表达式去执行,而流程结束 。
                3、如果UEL 表达式都不符合条件,流程结束
                4、如果连线不设置条件,会走flow 序号小的那条线

 

 

 


       

posted @ 2020-04-06 18:45  怀鑫  阅读(850)  评论(0编辑  收藏  举报