• Activiti7之流程变量


    Activiti中个人任务分配
    分配任务负责人:
    固定分配,每一个任务都是固定的人进行执行


    表达式分配:
    UEL表达式,统一表达式语言,在activiti当中支持两种形式,一种是value,另外一种是method形式

    •  创建流程图,给每一个环节制定assignee值,通过UEL表达式分配任务负责人
    •  流程部署
    • 创建流程实例,制定任务执行人

    value表达式分配

    代码:

    首先,先部署一个流程

     1     /**
     2      * 流程部署
     3      * `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程文件信息
     4      * `act_re_deployment` 流程部署信息,包含流程名称,ID,Key等
     5      * `act_re_procdef` 流程定义信息
     6      */
     7     @Test
     8     public void deployment(){
     9         //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
    10         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    11         //获取RepositoryService对象进行流程部署
    12         RepositoryService repositoryService = processEngine.getRepositoryService();
    13         //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
    14         Deployment deployment = repositoryService.createDeployment()
    15                 .addClasspathResource("flowchart/process.bpmn")     //加载流程文件
    16                 .addClasspathResource("flowchart/process.png")
    17                 .name("请假流程")       //设置流程名称
    18                 .key("processKey")
    19                 .deploy();              //部署
    20 
    21         //输出部署信息
    22         System.out.println("流程名称:"+deployment.getName());
    23         System.out.println("流程ID:"+deployment.getId());
    24         System.out.println("流程Key:"+deployment.getKey());
    25     }
    部署流程

    接下来,就可以在创建流程实例的把每个任务的执行人传过去了

     1  /**
     2      * 启动一个流程实例
     3      */
     4     @Test
     5     public void getInstance(){
     6         //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
     7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     8         //获取RuntimeService
     9         RuntimeService runtimeService = processEngine.getRuntimeService();
    10         //定义一个Map集合,存放assignee的值
    11         Map<String,Object> assMap=new HashMap<>();
    12         assMap.put("assignee01","zhangsan");
    13         assMap.put("assignee02","lisi");
    14         assMap.put("assignee03","wangwu");
    15         assMap.put("assignee04","zhaoliu");
    16         //启动一个流程实例
    17         ProcessInstance myProcess = runtimeService.startProcessInstanceByKey("myProcess", assMap);
    18         System.out.println("流程实例Name:"+myProcess.getName());
    19     }
    创建流程实例,并将任务负责人赋上值

    处理任务,进行查看,传入的值是否存在

     1    /**
     2      * 任务处理:当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看到该信息
     3      */
     4     @Test
     5     public void completeTask(){
     6         //获取processEngine对象
     7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     8         RuntimeService runtimeService = processEngine.getRuntimeService();
     9         //获取一个TaskService对象
    10         TaskService taskService = processEngine.getTaskService();
    11         //获取张三的任务
    12         Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess").singleResult();
    13         //任务审批
    14         taskService.complete(task.getId());
    15     }
    任务处理

    没有报错在数据库查看一下当前任务,到部门经理审批了,而且部门经理审批的负责人是lisi,证明使用表达式分配成功

    流程变量

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

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

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

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

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

    流程图

     

    启动流程实例

    测试请假天数为5天

     1  /**
     2      * 根据任务ID,设置流程变量
     3      */
     4     @Test
     5     public void runTask() {
     6         //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
     7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     8         //获取一个TaskService对象
     9         TaskService taskService = processEngine.getTaskService();
    10         //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
    11         /**
    12          * taskCandidateOrAssigned匹配规则:1.Assigned   2.配置bpmn文件中定义的值
    13          * taskAssignee匹配规则:1.Assigned
    14          */
    15 
    16         List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("myProcess").list();
    17         for (Task task : list) {
    18             System.out.println("任务名称:" + task.getName());
    19             System.out.println("任务执行人:" + task.getAssignee());
    20             System.out.println("任务ID:" + task.getId());
    21             //设置流程变量
    22             //天数
    23             Integer day=5;
    24             taskService.setVariable(task.getId(),"num",day);
    25             //处理任务
    26             taskService.complete(task.getId());
    27             System.out.println("流程实例ID:" + task.getProcessInstanceId());
    28         }
    29     }        
    测试请假天数为5天

    结果:运行成功

    查看数据库的,当前任务是总经理审批

     测试请假天数为2天

     1  /**
     2      * 根据任务ID,设置流程变量
     3      */
     4     @Test
     5     public void runTask() {
     6         //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
     7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     8         //获取一个TaskService对象
     9         TaskService taskService = processEngine.getTaskService();
    10         //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
    11         /**
    12          * taskCandidateOrAssigned匹配规则:1.Assigned   2.配置bpmn文件中定义的值
    13          * taskAssignee匹配规则:1.Assigned
    14          */
    15 
    16         List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("myProcess").list();
    17         for (Task task : list) {
    18             System.out.println("任务名称:" + task.getName());
    19             System.out.println("任务执行人:" + task.getAssignee());
    20             System.out.println("任务ID:" + task.getId());
    21             //设置流程变量
    22             //请假天数
    23             Integer day=2;
    24             taskService.setVariable(task.getId(),"num",day);
    25             //处理任务
    26             taskService.complete(task.getId());
    27             System.out.println("流程实例ID:" + task.getProcessInstanceId());
    28         }
    29     }
    测试请假天数为2天

    结果:运行成功

    查看数据库的当前任务是人事同意


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

  • 相关阅读:
    c# WinForm 文本输入对话框
    C# 打印 长字符串自动换行
    Jquery通过AJAX从后台获取数据显示在表格上(复选)
    jquery通过AJAX从后台获取信息并显示在表格上的类
    迟来的总结与规划
    Tools
    HTML+CSS 学习清单
    JQuery 入门学习列表
    Git(Mac OSX下)
    dom 元素占据高度
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12649687.html
Copyright © 2020-2023  润新知