全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<UEL表达式篇>

Posted DT辰白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<UEL表达式篇>相关的知识,希望对你有一定的参考价值。


前言

在上面的文章中,我们实现了简单的请假申请流程,我是基于固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照 bpmn 的配置去分配任务负责人,在实际项目生产中,肯定不能这么做,我们需要动态分配任务负责人,去完成各个节点应该走的审批流程。


一、表达式分配负责人

1、UEL 表达式

Activiti 使用 UEL 表达式, UEL 是 java EE6 规范的一部分, UEL(Unified Expression Language)即 统一表达式语言, activiti 支持两个 UEL 表达式: UEL-value 和 UEL-method。

1)UEL-value 定义

assignee 这个变量是 activiti 的一个流程变量,可以写${}表达式来动态分配负责人

在这里插入图片描述
在这里插入图片描述

员工申请节点负责人:employeeId
部门经理审批节点负责人:userId

1.部署流程

@PostMapping("deployment")
public Map<String, Object> deployment() { 
Deployment deployment = repositoryService.createDeployment()
		.name("部署请假申请流程")
		.addClasspathResource("processes/MyFlow.bpmn")
		.addClasspathResource("processes/MyFlow.png")
		.deploy();
Map<String, Object> map = new HashMap<>();
map.put("msg", "->>>请假申请部署成功!");
map.put("部署流程ID:", deployment.getId());
map.put("部署流程名称:", deployment.getName());
map.put("部署时间:", deployment.getDeploymentTime());
return map;
}

在这里插入图片描述

2.启动流程

//设置任务委派人
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employeeId", "张三");
variables.put("userId", "李经理");
@PostMapping("startProcess")
public Map<String, Object> startProcess(String deploymentId) {
	//获取流程定义(根据部署流程ID查询act_re_procdef表信息)
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
	//设置任务委派人
	Map<String, Object> variables = new HashMap<String, Object>();
	variables.put("employeeId", "张三");
	variables.put("userId", "李经理");
	//根据流程定义key来启动流程定义,返回流程实例
	ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinition.getKey(),variables);
	Map<String, Object> map = new HashMap<>();
	map.put("流程实例ID: ", pi.getId());
	map.put("流程定义ID: ",pi.getProcessDefinitionId());
	return map;
}

在这里插入图片描述
在这里插入图片描述

3.我的待办

.singleResult() //返回惟一结果集
.count() //返回结果集的数量
.listPage(firstResult, maxResults); //分页查询
.list(); //集合分页查询

@PostMapping("myTask")
public Map<String, Object> myTask(String name) {
	Task task = taskService.createTaskQuery().taskAssignee(name).singleResult();
	//任务列表的展示
	Map<String, Object> map = new HashMap<>();
		map.put("流程实例ID:", task.getProcessInstanceId());
		map.put("任务ID:", task.getId());
		map.put("任务负责人:", task.getAssignee());
		map.put("任务名称:", task.getName());
	return map;
}

在这里插入图片描述

4.执行任务

@PostMapping("startTask")
public Map<String, Object> startTask(String name) {
	//根据流程实例ID和用户名来查询,唯一确定一条当前需要处理的任务
	Task task = taskService.createTaskQuery()
			.taskAssignee(name)
			.singleResult();
	
	Map<String, Object> map = new HashMap<>();
	map.put("msg", name + "->>>提交了任务!");
	
	//执行审批流程
	taskService.complete(task.getId());
	map.put("result1", name + "->>>的审批结束!");
	
	//查询下一个任务点
	map.put("result2", name + "->>>前往下一个任务节点!");
	List<Task> taskList = taskService.createTaskQuery().list();
	if(!taskList.isEmpty()) {
		for(Task task1 : taskList){
    		map.put("流程实例ID:", task1.getProcessInstanceId());
    		map.put("任务ID:", task1.getId());
    		map.put("任务负责人:", task1.getAssignee());
    		map.put("任务名称:", task1.getName());
        }
	}else {
		map.put("msg", "整个流程审批任务结束!!!");
	}
	return map;
}

在这里插入图片描述

2、UEL-method 方式

userBean 是 spring 容器中的一个 bean,表示调用该 bean 的 getUserId()方法。

在这里插入图片描述
在这里插入图片描述

1.创建SpringBean

@Component
public class UserBean {
	
	public String getEmpId() {
		return "张三";
	}
	
	public String getUserId() {
		return "李经理";
	}

}

2.部署流程

Deployment deployment = repositoryService.createDeployment()
				.name("部署请假申请流程")
				.addClasspathResource("processes/MyFlowBean.bpmn")
				.addClasspathResource("processes/MyFlowBean.png")
				.deploy();

3.启动流程

/**
 * 启动流程实例
 * @return
 */
@PostMapping("startProcess")
public Map<String, Object> startProcess(String deploymentId) {
	//获取流程定义(根据部署流程ID查询act_re_procdef表信息)
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
	//根据流程定义key来启动流程定义,返回流程实例
	ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinition.getKey());
	Map<String, Object> map = new HashMap<>();
	map.put("流程实例ID: ", pi.getId());
	map.put("流程定义ID: ",pi.getProcessDefinitionId());
	return map;
}

在这里插入图片描述
当我们启动流程实例成功后,惊喜的事发生了,查看数据库,正在运行的任务表:

在这里插入图片描述
自动获取我们userBean里面的方法,并且设置了负责人;

4.执行任务

@PostMapping("startTask")
public Map<String, Object> startTask(String name) {
	//根据流程实例ID和用户名来查询,唯一确定一条当前需要处理的任务
	Task task = taskService.createTaskQuery()
			.taskAssignee(name)
			.singleResult();
	
	Map<String, Object> map = new HashMap<>();
	map.put("msg", name + "->>>提交了任务!");
	
	//执行审批流程
	taskService.complete(task.getId());
	map.put("result1", name + "->>>的审批结束!");
	
	//查询下一个任务点
	map.put("result2", name + "->>>前往下一个任务节点!");
	List<Task> taskList = taskService.createTaskQuery().list();
	if(!taskList.isEmpty()) {
		for(Task task1 : taskList){
    		map.put("流程实例ID:", task1.getProcessInstanceId());
    		map.put("任务ID:", task1.getId());
    		map.put("任务负责人:", task1.getAssignee());
    		map.put("任务名称:", task1.getName());
        }
	}else {
		map.put("msg", "整个流程审批任务结束!!!");
	}
	return map;
}

在这里插入图片描述

3、UEL-method 与 UEL-value 结合

${empService.findManagerForEmployee(employeeId)}
empService是spring 容器的一个bean,findManagerForEmployee是该bean的一个方法,employeeId是activiti
流程变量, employeeId作为参数传到 empService.findManagerForEmployee 方法中。

在这里插入图片描述
在这里插入图片描述

1.创建Service

创建根据ID查询用户名称的接口

在这里插入图片描述
接口实现类
在这里插入图片描述
SQL部分
在这里插入图片描述

2.创建Spring Bean

@Component
public class EmpService {

	@Autowired
	private UserService userService;
	
	public String findManagerForEmployee(Integer employeeId) {
		System.out.println("bean1->>>"+employeeId);
		//return "张三";
		return userService.findManagerForEmployee(employeeId);
	}
	
	public String findManagerForUser(Integer userId) {
		System.out.println("bean2->>>"+userId);
		//return "李经理";
		return userService.findManagerForUser(userId);
	}
}

3.部署流程

Deployment deployment = repositoryService.createDeployment()
				.name("部署请假申请流程")
				.addClasspathResource("processes/MyFlowService.bpmn")
				.addClasspathResource("processes/MyFlowService.png")
				.deploy();

在这里插入图片描述

4.启动流程

重要>>>去数据库查询我们的负责人


@PostMapping("startProcess")
public Map<String, Object> startProcess(String deploymentId) {
	//获取流程定义(根据部署流程ID查询act_re_procdef表信息)
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
	//设置任务委派人---重要>>>去数据库查询我们的负责人
	Map<String, Object> variables = new HashMap<String, Object>();
	variables.put("employeeId", 1);
	variables.put("userId", 2);
	//根据流程定义key来启动流程定义,返回流程实例
	ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinition.getKey(),variables);
	Map<String, Object> map = new HashMap<>();
	map.put("流程实例ID: ", pi.getId());
	map.put("流程定义ID: ",pi.getProcessDefinitionId());
	return map;
}

在这里插入图片描述
启动流程,查询第一个节点负责人:

在这里插入图片描述

任务表记录:
在这里插入图片描述

5.待办任务

@PostMapping("myTask")
public Map<String, Object> myTask(String name) {
	Task task = taskService.createTaskQuery().taskAssignee(name).singleResult();
	//任务列表的展示
	Map<String, Object> map = new HashMap<>();
		map.put("流程实例ID:", task.getProcessInstanceId());
		map.put("任务ID:", task.getId());
		map.put("任务负责人:", task.getAssignee());
		map.put("任务名称:", task.getName());
	return map;
}

在这里插入图片描述

5.执行任务

@PostMapping("startTask")
public Map<String, Object> startTask(String name) {
	//根据流程实例ID和用户名来查询,唯一确定一条当前需要处理的任务
	Task task = taskService.createTaskQuery()
			.taskAssignee(name)
			.singleResult();
	
	Map<String, Object> map = new HashMap<>();
	map.put("msg", name + "->>>提交了任务!");
	
	//执行审批流程
	taskService.complete(task.getId());
	map.put("result1", name + "->>>的审批结束!");
	
	//查询下一个任务点
	map.put("result2", name + "->>>前往下一个任务节点!");
	List<Task> taskList = taskService.createTaskQuery().list();
	if(!taskList.isEmpty()) {
		for(Task task1 : taskList){
    		map.put("流程实例ID:", task1.getProcessInstanceId());
    		map.put("任务ID:", task1.getId());
    		map.put("任务负责人:", task1.getAssignee());
    		map.put("任务名称:", task1.getName());
        }
	}else {
		map.put("msg", "整个流程审批任务结束!!!");
	}
	return map;
}

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<入门篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<流程挂起与激活篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<监听器篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<监听器篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<流程挂起与激活篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>