• EL为表达式语言(Expression Language)
  • UEL统一表达式语言(Unified Expression Language)

    UEL表达式描述

  • 表达式以“${”开始,以“}”结束,例如${day>100}

  • 支持逻辑运算${userName==”bajie”} and pwd==”123”
  • 支持变量与实体类赋值

例如一个流程,有两个任务节点,第一个任务节点有一个day变量,day=5,第二个任务节点,day=6,在activiti6之前,后者是可以覆盖前者的,但是在activit7中,后者是不会覆盖前者的,所以建议使用activiti7中,不要使用流程变量覆盖操作

对应Activiti数据表

  • act_ru_variable运行时参数表
  • act_hi_varinst 历史参数表

    UEL表达式的保留字

    保留字不要作为变量名去使用
and eq gt
instanceof div or
le false empty
not Lt ge

UEL表达式的运算符

image.png

运算符 功能 示例 结果
+ ${1+1} 2
-

任务发布的时候带参数

activiti:assignee=”${zhiXingRen}” 指定执行人

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
    <process id="myProcess_UEL_V1" name="processName" isExecutable="true">
        <startEvent id="starteventId" name="开始"></startEvent>
        <userTask id="usertaskId" name="uel任务节点"
                  activiti:assignee="${zhiXingRen}"></userTask>
        <endEvent id="endeventId" name="End"></endEvent>
        <sequenceFlow sourceRef="starteventId" targetRef="usertaskId"/>
        <sequenceFlow sourceRef="usertaskId" targetRef="endeventId"/>
    </process>
</definitions>
package com.torey.activiti7_workflow;

import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
public class Part6_UEL {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    /**
     * 启动流程参数,用参数指定执行人
     */
    @Test
    public void initProcessInstanceWithArgs(){
        //流程变量
        Map<String,Object> variables=new HashMap<>();
        variables.put("zhiXingRen","wukong");
        ProcessInstance processInstance =  runtimeService
                .startProcessInstanceByKey("myProcess_UEL_V1",
                        "businessId",variables);
        System.out.println("流程实例ID:" + processInstance.getId());
    }
 }

任务执行的时候带参数

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
    <process id="myProcess_UEL_V2" name="UEL流程变量V2" isExecutable="true">
        <startEvent id="starteventId" name="开始"></startEvent>
        <userTask id="usertaskId" name="uel任务节点"
                  activiti:assignee="bajie"></userTask>
        <exclusiveGateway id="exclusiveGatewayId1"></exclusiveGateway>
        <userTask id="userTaskId1" activiti:assignee="wuKong" name="悟空审核"/>
        <userTask id="userTaskId2" activiti:assignee="tangCeng" name="唐曾审核"/>
        <endEvent id="endeventId" name="End"></endEvent>
        <sequenceFlow sourceRef="starteventId" targetRef="usertaskId"/>
        <sequenceFlow sourceRef="usertaskId" targetRef="exclusiveGatewayId1"/>
        <sequenceFlow name="小于等于100" sourceRef="exclusiveGatewayId1" targetRef="userTaskId1">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pay<=100}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow name="大于100" sourceRef="exclusiveGatewayId1" targetRef="userTaskId2">
            <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pay>100}]]></conditionExpression>
        </sequenceFlow>
        <sequenceFlow sourceRef="userTaskId1" targetRef="endeventId"/>
        <sequenceFlow sourceRef="userTaskId2" targetRef="endeventId"/>
    </process>
</definitions>
 /**
     * 完成任务带参数
     */
    @Test
    public void completeTaskWithArgs(){
        Map<String,Object> variables=new HashMap<>();
        variables.put("pay",99);
        String assignee="bajie";
        List<Task> taskList = taskService.createTaskQuery()
                .taskAssignee(assignee).list();
        if (null==taskList ||taskList.size()==0) {
            System.out.println("不存在该执行人" + assignee);
            return;
        }
        System.out.println(assignee+"的任务有"+taskList.size()+"个");
        for (Task task : taskList) {
            taskService.complete(task.getId(),variables);
        }
        taskList = taskService.createTaskQuery()
                .taskAssignee(assignee).list();
        System.out.println(assignee+"的任务执行完成,任务有"+taskList.size()+"个");
    }

启动流程实例,带实体类

package com.torey.activiti7_workflow;

import java.io.Serializable;

public class UEL_POJO implements Serializable {
    //属性必须都要小写,否则访问不了
    private String zhixingren;
    private String pay;

    public String getZhixingren() {
        return zhixingren;
    }

    public void setZhixingren(String zhixingren) {
        this.zhixingren = zhixingren;
    }

    public String getPay() {
        return pay;
    }

    public void setPay(String pay) {
        this.pay = pay;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="实体类任务" activiti:assignee="${uelpojo.zhixingren}"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="候选人任务" activiti:candidateUsers="${houxuanren}"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
</definitions>
  /**
     * 启动流程参数,使用实体类
     */
    public void initProcessInstanceWithClassArgs(){
        //流程变量
        Map<String,Object> variables=new HashMap<>();
        UEL_POJO uel_pojo=new UEL_POJO();
        uel_pojo.setZhixingren("张三");
        variables.put("uelpojo",uel_pojo);
        ProcessInstance processInstance =  runtimeService
                .startProcessInstanceByKey("myProcess",
                        "businessId",variables);
        System.out.println("流程实例ID:" + processInstance.getId());
    }

任务完成环节带参数,指定多个候选人

    /**
     * 任务完成环节带参数,指定多个候选人
     */
    @Test
    public void initProcessInstanceWithCandiDateArgs(){
        String assignee="张三";
        Map<String,Object> variables=new HashMap<>();
        variables.put("houxuanren","wukong,tangceng");
        List<Task> taskList = taskService.createTaskQuery()
                .taskAssignee(assignee).list();
        if (null==taskList ||taskList.size()==0) {
            System.out.println("不存在该执行人" + assignee);
            return;
        }
        System.out.println(assignee+"的任务有"+taskList.size()+"个");
        for (Task task : taskList) {
            taskService.complete(task.getId(),variables);
        }
        taskList = taskService.createTaskQuery()
                .taskAssignee(assignee).list();
        System.out.println(assignee+"的任务执行完成,任务有"+taskList.size()+"个");
    }

直接指定变量

image.png

    /**
     * 直接指定流程变量
     * 流程变量分为:全局变量和局部变量
     */
    public void otherArgs(){
        runtimeService.setVariable("","","");
        runtimeService.setVariables("",null);
        taskService.setVariable("","","");
        taskService.setVariables("",null);
    }
    /**
     * 局部变量,只在当前节点有用,能找到,在其他节点,找不到
     */
    public void otherLocalArgs(){
        runtimeService.setVariableLocal("","","");
        runtimeService.setVariablesLocal("",null);
        taskService.setVariableLocal("","","");
        taskService.setVariablesLocal("",null);
    }