• activiti(四):关于流程任务的一些操作


    前文:activiti(三):关于流程实例的一些操作

    目录:activiti 目录

    一、任务操作

    任务操作接口:TaskService

    任务表:act_ru_task

    任务历史表:act_hi_taskinst

    1.1 完成任务方法

    • 方法一:直接通过taskId来完成任务

      流程启动后,将会在任务表act_ru_task中创建任务记录,当前待执行任务!

    	/**
         * 完成任务1:通过taskId来完成
         * 因为完成通过TaskService。
         * @author caodahuan
         * @date 2019/8/30
         * @return void
         */
        @Test
        public void complete(){
    
            // 1. 获取到流程引擎
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            /*
             * 2. 对于任务的操作:TaskService。
             * 操作任务表:act_ru_task,此表已经介绍过:存储正在执行的任务,一旦任务执行完,则从此表中移除。
             */
            TaskService taskService = processEngine.getTaskService();
            taskService.complete("107502");
        }
    
    
    • 方法二:在实际中通过代码获取task任务,再获取到ID

          /**
           * 完成任务实例:实际操作中都是通过查库来获取任务,完成任务。
           * @author caodahuan
           * @date 2019/9/2
           * @return void
           */
          @Test
          public void complete1(){
              /*
               * 启动流程
               */
              // 1. 获取到操作流程数据的接口
              RuntimeService service = getService();
      
              /*
               * 2. 根据ID启动流程,返回的是启动流程后的实例
               * 部署流程后,流程数据其实存储在act_re_procdef表中。根据id启动,即根据act_re_procdef表的id启动。
               * 1)根据流程获取流程定义数据的ID
               * 2)根据ID启动流程
               */
              // 部署好的流程定义数据(返回流程实例)
              ProcessDefinition definition = this.getDefinition();
              ProcessInstance instance = service.startProcessInstanceById(definition.getId());
      
              // 3. 获取任务操作接口
              TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
      
              // 4. 由于complete方法是通过taskId来执行,那么先获取Task详情。
              // 4.1 获取任务查询器(这个已经见过多次了)
              TaskQuery taskQuery = taskService.createTaskQuery();
      
              // 4.2 查询任务(通过流程实例来获取任务,部署流程时,已经得到了流程实例)
              Task task = taskQuery.processInstanceId(instance.getId()).singleResult();
      
              // 4.3 通过任务ID来执行任务
              taskService.complete(task.getId());
          }
      
    • 方法三:介绍其他完成任务方法

      /**
           * 其他完成任务方法
           * @author caodahuan
           * @date 2019/9/2
           * @return void
           */
          @Test
          public void completeOther(){
      
              // 1. 获取任务操作接口
              TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
      
              // 直接ID完成任务(已经描述)
              taskService.complete("112509");
      
              // 完成并设置变量:参数1=taskId,参数2=流程变量
              Map<String, Object> params = new HashMap<>();
              params.put("haha","enlo");
              taskService.complete("127503",params);
      
              // 完成并设置变量:参数1=taskId,参数2=流程变量,参数3=瞬时变量
              // 为啥不能用呢,报错:java.lang.ClassCastException,待解决!
              taskService.complete("127503",params,params);
      
              // 完成并设置变量:参数1=taskId,参数2=流程变量,参数3=是否为本地变量
              //如果为true,通过的变量将会随着本任务存亡(本任务结束,变量删除,称之为任务变量(局部)),默认为false,即为complete(String,Map)
              // 那么这时候的变量为流程变量(全局)
              taskService.complete("127503",params,false);
          }
      

      关于流程变量:(传递上下文)

      按照作用域可分为:

      • 流程变量(全局变量):整个流程都可获取到。
      • 本地变量:本任务节点可获取,下个任务节点就拿不到了。

      按照是否存库:

      • 持久变量:在act_ru_variable和act_hi_varinst中插入变量数据
      • 瞬时变量(activiti 6):只有转成持久变量才会存库

    1.2 查询任务

    根据我们以前的经验,查询接口都是通过查询接口,

    任务查询接口:TaskService

    • 方法一:根据查询条件:任务执行人。查询任务

      /**
           * 查询任务:
           * 任务表:act_ru_task,保存当前正在执行中的任务
           * 任务历史表:act_hi_taskinst,保存执行中和已完成的任务,根据是否有end_time标记任务是否完成
           *
           * 方法一:使用任务查询器TaskService,根据查询条件来查询任务。
           * 根据任务执行人查询任务,当前执行人需要处理的所有任务。
           * @author caodahuan
           * @date 2019/9/3
           * @return void
           */
          @Test
          public void queryByAssignee(){
              
              // 1.获取任务操作接口:
              TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
      
              // 2.获取任务查询器(查询接口)
              TaskQuery query = taskService.createTaskQuery();
      
              // 3.查询条件:任务执行人
              query.taskAssignee("公司财务");
      
              // 4.结果收集,获取到list,或者获取到singleResult;
              Task task = query.singleResult();
              
              System.out.println(task.getId());
      
          }
      
    • 方法二:查询所有任务

       /**
           * 查询任务:
           * 任务表:act_ru_task,保存当前正在执行中的任务
           * 任务历史表:act_hi_taskinst,保存执行中和已完成的任务,根据是否有end_time标记任务是否完成
           *
           * 方法二:使用任务查询器TaskService,查询所有任务(执行中任务)。
           * @author caodahuan
           * @date 2019/9/3
           * @return void
           */
          @Test
          public void queryByPrasms(){
      
              // 1.获取任务操作接口:
              TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
      
              // 2.获取任务查询器(查询接口)
              TaskQuery query = taskService.createTaskQuery();
      
              // 3.查询所有任务(多个任务时得到的是list)
              List<Task> list = query.list();
      
              // 4.结果收集
              list.forEach(l -> System.out.println(l.getName()));
      
          }
      
    • 方法三:查询已经完成的任务

      /**
           * 查询任务:查询已经完成任务
           * 任务表:act_ru_task,保存当前正在执行中的任务
           * 任务历史表:act_hi_taskinst,保存执行中和已完成的任务,根据是否有end_time标记任务是否完成
           *
           * 方法三:使用任务查询器TaskService,查询所有任务(执行中任务)。
           * 任务查询器接口:HistoricTaskInstanceQuery
           * @author caodahuan
           * @date 2019/9/3
           * @return void
           */
          @Test
          public void queryHiTask(){
      
              // 1.获取任务操作接口:
              HistoryService historyService = ProcessEngines.getDefaultProcessEngine().getHistoryService();
      
              // 2.获取任务查询器(查询接口)
              HistoricTaskInstanceQuery hisQuery = historyService.createHistoricTaskInstanceQuery();
      
              // 3.查询所有任务(我们已经知道,历史表中有已经完成的任务和正在执行的任务)
              // 查询条件:执行完成(不加条件则查询出所有的任务,执行中和已完成)
              hisQuery.finished();
              List<HistoricTaskInstance> list = hisQuery.list();
      
              // 4.结果收集,获取到list;
              list.forEach(l -> System.out.println(l.getName()));
          }
      
  • 相关阅读:
    解释器
    桥接
    组合
    hbase读性能优化
    Hbase为什么写比读快
    http和https区别
    R apply() 函数和 tapply() 函数
    R 语言 decostand() 函数
    R多行交叉作图
    k-mean 拐点
  • 原文地址:https://www.cnblogs.com/dhcao/p/11457617.html
Copyright © 2020-2023  润新知