当前位置: 首页 > news >正文

Springboot +Flowable,会签、或签简单使用(二)

一.简介

**会签:**在一个流程中的某一个 Task 上,这个 Task 需要多个用户审批,当多个用户全部审批通过,或者多个用户中的某几个用户审批通过,就算通过。
例如:之前的请假流程,假设这个请假流程需要组长和经理都审批了,才算审批通过,那么就需要设置这个 Task 是会签节点。

**或签:**意思就是 A 的请假流程提交给 B、C、D,但是并不需要 B/C/D 同时审批通过,只需要 B/C/D 中的任意一个审批即可,这就是或签,注意,我这里的表述,只需要 B/C/D 任意一个审批即可,这个审批即可以是审批通过,也可以是审批拒绝,反正只要审批,这个 UserTask 就算完成了。

二.会签流程图

首先来画一下这个请假流程图,这个流程图基本上还是和之前的一样,截图如下:
在这里插入图片描述

三.请假处理

1.前端提交请假流程

接下来看下前端如何提交请假申请,页面如下:
在这里插入图片描述
对应的 HTML 代码如下:

<h1>提交请假申请</h1>
<table><tr><td>请输入请假天数:</td><td><el-input type="text" v-model="afl.days"/></td></tr><tr><td>请输入请假理由:</td><td><el-input type="text" v-model="afl.reason"/></td></tr><tr><td>审批人:</td><td><el-select v-model="afl.approveUsers" style="width: 226px" placeholder="请选择审批人" multiple><el-optionv-for="item in users":key="item.id":label="item.username":value="item.username"/></el-select></td></tr>
</table>
<el-button type="primary" @click="submit">提交请假申请</el-button>

跟之前不同的是,这里的下拉框是多选的,当用户提交请假申请的时候,可以选择多个审批人,多个审批人的值将保存在 afl.approveUsers 变量中。
再来看提交请假方法,代码如下:

submit() {let _this = this;axios.post('/ask_for_leave', this.afl).then(function (response) {if (response.data.status == 200) {//提交成功_this.$message.success(response.data.msg);_this.search();} else {//提交失败_this.$message.error(response.data.msg);}}).catch(function (error) {console.log(error);});
},

请求的参数截图如下:
在这里插入图片描述
看下这里提交的三个请求参数:

  1. approveUsers:这是审批当前流程的三个用户,当这三个用户都审批通过后,请假流程就通过了。
  2. days:这是请假的天数。
  3. reason:这是请假理由。

2.服务端处理请假请求

服务端如何处理这个请假请求,代码如下:

@Transactional
public RespBean askForLeave(AskForLeaveVO askForLeaveVO) {Map<String, Object> variables = new HashMap<>();askForLeaveVO.setName(SecurityContextHolder.getContext().getAuthentication().getName());variables.put("name", askForLeaveVO.getName());variables.put("days", askForLeaveVO.getDays());variables.put("reason", askForLeaveVO.getReason());variables.put("userTasks", askForLeaveVO.getApproveUsers());try {runtimeService.startProcessInstanceByKey("holidayRequest", askForLeaveVO.getName(), variables);return RespBean.ok("已提交请假申请");} catch (Exception e) {e.printStackTrace();}return RespBean.error("提交申请失败");
}

可以看到,从前端一共传递过来三个参数,但是执行这个流程需要四个参数,其中一个 name 表示当前登录的用户名,也就是这个请假是谁发起的。另外三个参数就是前端传来的参数。

3.服务端返回待审批数据

接下来看下服务端如何返回待审批数据,代码如下:

/***待审批列表*/
public RespBean leaveList() {String identity = SecurityContextHolder.getContext().getAuthentication().getName();//找到所有分配给你的任务List<Task> tasks = taskService.createTaskQuery().taskAssignee(identity).list();//重新组装返回的数据,为每个流程增加任务 id,方便后续执行批准或者拒绝操作List<Map<String, Object>> list = new ArrayList<>();for (int i = 0; i < tasks.size(); i++) {Task task = tasks.get(i);Map<String, Object> variables = taskService.getVariables(task.getId());variables.put("id", task.getId());list.add(variables);}return RespBean.ok("加载成功", list);
}

页面如下:
在这里插入图片描述
这个整体上分了两步:

  1. 首先查询出来当前用户所有待审批的 Task。
  2. 查询出来这些 Task 上的 variables,这是一个 Map 集合,然后我们再手动加上 id 这个参数。
    最后将组装好的 list 弄成一个 JSON 返回即可。

4.服务端批准 OR 拒绝

服务端批准或者拒绝请假流程,代码如下:

public RespBean askForLeaveHandler(ApproveRejectVO approveRejectVO) {try {Task task = taskService.createTaskQuery().taskId(approveRejectVO.getTaskId()).singleResult();boolean approved = approveRejectVO.getApprove();Map<String, Object> variables = new HashMap<String, Object>();variables.put("approved", approved);variables.put("approveUser#" + task.getAssignee(), SecurityContextHolder.getContext().getAuthentication().getName());taskService.complete(task.getId(), variables);return RespBean.ok("操作成功");} catch (Exception e) {e.printStackTrace();}return RespBean.error("操作失败");
}

批准或者拒绝,最主要的参数就是 approved,true 表示批准,false 表示拒绝。

另一方面,由于现在是会签,我们需要知道目前谁已经审批了,谁还没审批,所以这里额外多加了一个参数 approveUser#XXX,表示审批这个节点的用户名(也就是当前登录用户)。

注意这个参数的 key 我没有固定,主要是因为这个节点会有多个人审批,如果固定的话,后面审批的人会覆盖掉前面的人,所以这个节点的 key 设置成动态的了,approveUser# 后面加上处理这个节点的用户名。

相关文章:

Springboot +Flowable,会签、或签简单使用(二)

一.简介 **会签&#xff1a;**在一个流程中的某一个 Task 上&#xff0c;这个 Task 需要多个用户审批&#xff0c;当多个用户全部审批通过&#xff0c;或者多个用户中的某几个用户审批通过&#xff0c;就算通过。 例如&#xff1a;之前的请假流程&#xff0c;假设这个请假流程…...

将核心交换机配置为NTP服务器

AR配置外源NTP 1&#xff0e;配置ntp <XQ-R1220>sys [XQ-R1220]ntp-service unicast-server 120.25.115.20 #阿里云ntp [XQ-R1220]ntp-service unicast-server 203.107.6.88 #阿里云ntp 2&#xff0e;查看ntp状态 <XQ-R1220>display ntp status clock sta…...

application.properties文件注释

这是一个常用的Spring Boot配置文件 在这里&#xff0c;我们可以配置应用程序的各种属性 服务器端口号 server.port8080 数据库配置 spring.datasource.urljdbc:mysql://localhost:3306/test spring.datasource.usernameroot spring.datasource.password123456 spring.datasou…...

MySql查询报错this is incompatible with sql_mode=only_full_group_by

错误示例 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘yiliaohaocai_new.a.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 原因 SQL …...

VMware Workstation 网络备忘 + 集群规模

概述 在虚拟机中部署服务&#xff0c;进行IP规划&#xff0c;进行相关的前期准备 3 张网卡 2个不同的网段 1个NAT 概述截图 NAT 截图 VMnet0 截图 VMnet1 截图 总结&#xff1a; 网卡&#xff08;网络适配器&#xff09;名称IP网段备注NATens33192.168.139.0VMnet0ens34VMne…...

被裁现状,给找工作的同学一些建议

2022 到 2023 国内知名互联网公司腾讯、阿里、百度、快手、滴滴、京东、阿里、爱奇艺、知乎、字节跳动、小米等公司均有裁员&#xff0c;其中有不少公司&#xff0c;在过去年的一整年&#xff0c;进行了多轮裁员&#xff0c;以下是网传的一张 “2022 年裁员企业名单”。 这些裁…...

编程到底难在哪里?

编程是一门非常有挑战性的技术&#xff0c;能够让人们使用计算机来完成各种任务。它不仅需要掌握各种计算机语言和框架&#xff0c;还需要在实际应用中充分发挥自己的专业知识和创造力。 然而&#xff0c;对于初学者来说&#xff0c;在编程过程中遇到的难点可能是多方面的。以…...

C++ 仿函数(一)

目录 一、仿函数是什么&#xff1f; 二、仿函数的特点 1.仿函数在使用时&#xff0c;可以像普通函数那样调用, 可以有参数&#xff0c;可以有返回值 2.仿函数超出普通函数的概念&#xff0c;可以有自己的状态 ​编辑3.仿函数可以作为参数传递。 三、谓词 一元谓词示例&a…...

MATLAB连续LTI系统的时域分析(十)

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握利用MATLAB对系统进行时域分析的方法&#xff1b; 2&#xff09;掌握连续时间系统零输入响应的求解方法&#xff1b; 3&#xff09;掌握连续时间系统零状态响应、冲激响应和…...

HBuilderX使用

HBuilderX使用&#xff08;Vue前后端分离&#xff09; 概述&#xff1a;DCloud开发者后台 DAccount Service 1、官网下载开发工具&#xff1a;HBuilderX-高效极客技巧 注意&#xff1a;安装目录路径中不能出现中文特殊字符&#xff0c;否则会造成项目无法编译。比如C:/Progr…...

【JavaSE】多态(多态实现的条件 重写 向上转移和向下转型 向上转型 向下转型 多态的优缺点 避免在构造方法种调用重写的方法)

文章目录 多态多态实现的条件重写向上转移和向下转型向上转型向下转型 多态的优缺点避免在构造方法种调用重写的方法 多态 一种事物&#xff0c;多种形态。 多态的概念&#xff1a;去完成某个行为&#xff0c;当不同对象去完成时会产生出不同的状态。 多态实现的条件 1.必须…...

MySQL学习---13、存储过程与存储函数

1、存储过程概述 MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将负杂的SQL逻辑封装在一起&#xff0c;应用程序无序关注存储过程和函数内部复杂的SQL逻辑&#xff0c;而只需要简单的调用存储过程和函数就可以。 1.1 理解 含义&#xff1a;存储过程的英文是Sto…...

Mysql日志管理、备份与恢复

文章目录 一、Mysql日志管理1.mysql日志2.日志种类3.日志的查询4.配置日志文件 二、Mysql备份与分类1.数据备份的重要性 一、Mysql日志管理 1.mysql日志 Mysql的日志默认保存位置为/usr/local/mysql/date&#xff0c;Mysql的日志配置文件为/etc/my.cnf&#xff0c;里面有一个…...

STM32单片机声控语音识别RGB彩灯多种模式亮度可调WS2812彩灯

实践制作DIY- GC0129-语音识别RGB彩灯 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别RGB彩灯 二、功能介绍&#xff1a; STM32F103C系列最小系统板5VUSB电源64个灯珠的WS2812灯板1个开关键&#xff08;3档亮度调节&#xff09;1个模式切换键&#xff08;白灯 红灯…...

高校9大学术工具推荐,一定要用起来哦!

1、文献管理工具&#xff1a;例如EndNote、Mendeley和Zotero&#xff0c;这些工具可以帮助您整理、管理和引用文献。 2、数据分析工具&#xff1a;例如SPSS、R和Python等&#xff0c;用于进行统计分析和数据处理。 3、学术写作工具&#xff1a;例如LaTeX和Microsoft Word&…...

记一次压力测试

性能测试文档 背景 为对产品性能有一定了解&#xff0c;现将产品展开一次性能测试&#xff1b; 环境与工具 本章为基本工具准备及linux命令说明&#xff0c;无先后顺序。 Xshell工具 本文使用Xshell在Windows界面下远程登录linux主机安装Xshell直接全部选择默认选项即可&…...

一个文明是否有竞争力,在很大程度上取决于信息传递的效率。

文章目录 引言I 有效地传递信息1.1 信息传播分类1.2 信息传递的有效性II 科技进步的必要条件和充分条件2.1 能量总量2.2 能量密度2.3 衡量科技成就的大小2.4 科学的诞生的意义:获得叠加式收益引言 科技进步的必要条件是能量总量,而充分条件是能量密度。一个文明是否有竞争力,…...

测试4年,跳槽一次涨8k,我跳了3次···

最近有人说&#xff0c;现在测试岗位初始工资太低了&#xff0c;有些刚刚入行的程序员朋友说自己工资连5位数都没有.....干了好几年也没怎么涨。看看别人动辄月薪2-3万&#xff0c;其实我想说也没那么难。说下如何高效地拿到3w。 1.暂且把刚入行的条件设低些吧&#xff0c;大专…...

Redis 入门教程(简单全面版)

1 安装&#xff1a; 1.1 生产环境安装 注意&#xff1a; 1、如果安装过程有问题可以参考源代码中的 README.md 文件 2、如果服务器只安装一个 redis 通常选择 /usr/local/redis 作为安装目录&#xff0c;如果安装多台则建议带上 服务名称 区分&#xff08;建议带上 服务名称 区…...

java并发-AQS

当我们使用Java并发编程时&#xff0c;我们经常会听到“AQS”的概念。AQS代表“AbstractQueuedSynchronizer”&#xff0c;是Java并发包中的一个重要组件。AQS提供了一个框架&#xff0c;使得开发者可以轻松地实现各种同步器&#xff0c;例如锁&#xff0c;信号量&#xff0c;倒…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...