activiti学习之流程变量

目录

定义

类型

作用域:

Local变量

流程变量的使用方法

实例

设置流程实例的三种方式

        方式一:启动流程时设置流程变量

        方式二:在任务办理时设置流程变量

        方式三:通过当前流程实例设置

Local 流程变量的设置

        添加

        查看

组任务

        基本步骤

        查询组任务

        拾取任务

        归还任务

        交接任务


定义

        流程变量在Activiti 中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti 结合时少不了流程变量,流程变量就是activiti 在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以设置为流程变量,在流程流转时使用。

类型

        如果将实体 存入到流程变量中,则实体必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要横撑serialVersionUid

作用域:

        流程变量的作用域可以是一个流程实例(processInstence),或者一个任务(Task),或者一个执行实例(execution)

Local变量

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

        Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响,Local变量也可以和global变量名相同,没有影响!

流程变量的使用方法

        - 在属性上使用UEL表达式
        可以在assignee 处设置UEL表达式,表达式的值为任务的负责人,比如:${assigness},assigness 就是一个流程变量名称

        - 在连线上使用UEL表达式,决定流程走向
        比如:${price<10000},price 就是一个流程变量名称,uel表达式结果为一个布尔类型

实例

        员工创建出差申请单,由部门经理审核,部门经理审核通过后,出差三天以下由财务直接审批,三天以上先由总经理审核,总经理审核通过再由财务审批。

设置流程实例的三种方式

        方式一:启动流程时设置流程变量

       在启动流程时设置流程变量,变量的作用域是整个流程实例。
       通过Map<key,value>
设置流程变量,map中可以设置多个变量,这个key就是流程变量的名字

        方式二:在任务办理时设置流程变量

        在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用域是整个流程实
例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替换前边设置的变量。

        方式三:通过当前流程实例设置

        通过流程实例id 设置全局变量,该流程实例必须未执行完成。
/**
     * 通过任务实例来设置流程变量
     *
     * @author 15821
     * @date 2021-12-08 15:41
     */
    @Test
    public void testProcessInstanceIdSetVariables() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        // 获取 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionKey("evection-global").list();

        Evection evection = new Evection();
        evection.setNum(2d);
        for (ProcessInstance instance : processInstances) {
            runtimeService.setVariables("17501", Map.of("assigness02", "王经理"
                    , "assigness03", "李总经理"
                    , "evection", evection));
        }
    }

Local 流程变量的设置

        local流程变量的作用域只在当前任务节点下可用

        添加

@Test
    public void testTaskCompleteSetLocalVariables() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery().taskAssignee("").list();
        for (Task task : tasks) {
//            System.out.println(task.getId());
            taskService.setVariableLocal(task.getId(),"evection","local-variable");
        }
    }

        查看

 @Test
    public void testTaskCompleteGetLocalVariables() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery().taskAssignee("王经理").list();
        for (Task task : tasks) {
            System.out.println(taskService.getVariableLocal("22502", "evection"));
        }
    }

如果任务完成后,可以通过查看历史信息进行查看

@Test
    public void testFindHisLocalVariable() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        HistoryService historyService = processEngine.getHistoryService();
        List<HistoricTaskInstance> instances = historyService.createHistoricTaskInstanceQuery().includeTaskLocalVariables().list();
        for (HistoricTaskInstance instance : instances) {
            System.out.println("==============================");
            System.out.println("任务id:" + instance.getId());
            System.out.println("任务名称:" + instance.getName());
            System.out.println("任务负责人:" + instance.getAssignee());
            System.out.println("任务local变量:" + instance.getTaskLocalVariables());
        }
    }

组任务

        在流程定义中,在任务节点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。这个情况,可以给任务设置多个候选人,从候选人中选择参与者来完成任务

        基本步骤

        查询组任务-> 拾取任务-> 查询个人任务-> 办理个人任务

        查询组任务

/**
     * 查询组任务
     * @update 2021-12-10 11:53 by 15821
     */
    @Test
    public void testGroupTaskList(){
        // 流程实例 的KEY
        String key = "evectionGroup";
        String candidateUser = "经理";
        //1. 创建 processsEngine
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUser)
                .list();
        for (Task task : tasks){
            System.out.println("流程实例的ID:"+task.getProcessInstanceId());
            System.out.println("任务ID:"+task.getId());
            System.out.println("任务负责人:"+task.getAssignee());
        }
    }

        拾取任务

/**
     * 候选人拾取任务
     * @update 2021-12-10 11:54 by 15821
     */
    @Test
    public void claimTask(){
        //1. 创建 processsEngine
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        // 当前任务的ID
        String taskId = "57502";
        // 候选人
        String candidateUser = "经理";
        // 事务任务
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskCandidateUser(candidateUser)
                .singleResult();
        if(task!=null){
            taskService.claim(taskId,candidateUser);
            System.out.println("taskId : "+taskId+"、用户:'"+candidateUser+"'拾取任务成功");
        }
    }

        归还任务

/**
     * 归还任务
     * @update 2021-12-10 12:11 by 15821
     */
    @Test
    public void testAssigneeToGroupTask(){
        //1. 创建 processsEngine
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        // 当前任务的ID
        String taskId = "57502";
        // 任务负责人
        String assigness = "经理";
        // 事务任务
        TaskService taskService = processEngine.getTaskService();
        // 通过 任务id 和负责人查询任务
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskAssignee(assigness)
                .singleResult();
        if(task!=null){
            // 归还任务
            taskService.setAssignee(taskId,null);
            System.out.println("taskId : "+taskId+"、用户:'"+assigness+"'归还任务成功");
        }
    }

        交接任务

/**
     * 任务的交接
     * @update 2021-12-10 12:11 by 15821
     */
    @Test
    public void testAssigneeToCandidateUser(){
        // 当前任务的ID
        String taskId = "57502";
        // 任务负责人
        String assigness = "经理";

        // 任务候选人
        String candidateUser = "副经理";
        // 事务任务
        //1. 创建 processsEngine
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        // 通过 任务id 和负责人查询任务
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskAssignee(assigness)
                .singleResult();
        if(task!=null){
            // 交接任务
            taskService.setAssignee(taskId,candidateUser);
            System.out.println("taskId : "+taskId+"、用户:'"+assigness+"'交接任务成功");
        }
    }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪家李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值