全网最新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企业实战教程<监听器篇>