From d6688a367dc8dee7c489790daa5389de08e0531a Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期二, 09 七月 2024 10:42:40 +0800
Subject: [PATCH] !562 ♥️发布 5.2.1 正式版本 Merge pull request !562 from 疯狂的狮子Li/dev

---
 ruoyi-extend/ruoyi-snailjob-server/Dockerfile                                                                             |    8 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java |   70 ++++
 ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java                                    |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java                      |    2 
 .run/ruoyi-server.run.xml                                                                                                 |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java                        |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java                       |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java          |    3 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java                     |    2 
 ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java                            |    3 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java                        |    2 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java                     |    5 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java                 |    7 
 .run/ruoyi-monitor-admin.run.xml                                                                                          |    2 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java                       |   37 +
 script/sql/postgres/flowable.sql                                                                                          |   73 ----
 ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java                              |    7 
 .run/ruoyi-snailjob-server.run.xml                                                                                        |    2 
 ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java                                                  |   26 +
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java                           |    2 
 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml                                             |    4 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java                     |   18 
 ruoyi-admin/Dockerfile                                                                                                    |   10 
 script/docker/nginx/conf/nginx.conf                                                                                       |    2 
 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml                                                |    2 
 README.md                                                                                                                 |    4 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java                    |    1 
 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml                                             |   33 -
 ruoyi-admin/src/main/resources/application-prod.yml                                                                       |    8 
 ruoyi-extend/ruoyi-monitor-admin/Dockerfile                                                                               |    6 
 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java                             |    2 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java                        |   11 
 ruoyi-admin/src/main/resources/application-dev.yml                                                                        |    6 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java                   |   10 
 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java                               |   29 +
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java        |   30 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java           |   29 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java               |   22 +
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java                 |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java                 |    2 
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java                                            |    3 
 ruoyi-common/ruoyi-common-bom/pom.xml                                                                                     |    2 
 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm                                              |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java                          |   14 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java                   |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java                    |    2 
 pom.xml                                                                                                                   |    2 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java                |  162 +++++++++
 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java                             |    6 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java         |   55 +++
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java                          |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java                    |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java               |    5 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java                 |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java                                     |    7 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java                          |   12 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java                     |   13 
 ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java  |   35 +
 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java                        |    4 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java                        |    2 
 ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java                         |   24 +
 script/docker/docker-compose.yml                                                                                          |   10 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java                          |    4 
 ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties                                                       |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java                      |    4 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java                      |   18 
 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java                                        |    2 
 ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml                                                 |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java                                  |    8 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java           |    2 
 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java                             |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java                        |    2 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java                       |    6 
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java                                          |    3 
 ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java           |    5 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java                          |   15 
 ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java                      |    9 
 77 files changed, 606 insertions(+), 336 deletions(-)

diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml
index 095b3d7..5b32519 100644
--- a/.run/ruoyi-monitor-admin.run.xml
+++ b/.run/ruoyi-monitor-admin.run.xml
@@ -2,7 +2,7 @@
   <configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
     <deployment type="dockerfile">
       <settings>
-        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.2.0" />
+        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.2.1" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
       </settings>
diff --git a/.run/ruoyi-server.run.xml b/.run/ruoyi-server.run.xml
index 0463c34..9fefae6 100644
--- a/.run/ruoyi-server.run.xml
+++ b/.run/ruoyi-server.run.xml
@@ -2,7 +2,7 @@
   <configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
     <deployment type="dockerfile">
       <settings>
-        <option name="imageTag" value="ruoyi/ruoyi-server:5.2.0" />
+        <option name="imageTag" value="ruoyi/ruoyi-server:5.2.1" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
       </settings>
diff --git a/.run/ruoyi-snailjob-server.run.xml b/.run/ruoyi-snailjob-server.run.xml
index 761915e..914809d 100644
--- a/.run/ruoyi-snailjob-server.run.xml
+++ b/.run/ruoyi-snailjob-server.run.xml
@@ -2,7 +2,7 @@
   <configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
     <deployment type="dockerfile">
       <settings>
-        <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.2.0" />
+        <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.2.1" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
       </settings>
diff --git a/README.md b/README.md
index 7ac5448..ad9c2ce 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
 [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE)
 [![浣跨敤IntelliJ IDEA寮�鍙戠淮鎶(https://img.shields.io/badge/IntelliJ%20IDEA-鎻愪緵鏀寔-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
 <br>
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.2.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.2.1-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
 [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2-blue.svg)]()
 [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
 [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]()
@@ -56,7 +56,7 @@
 | 鏁版嵁鍔犺В瀵�       | 閲囩敤 娉ㄨВ + mybatis 鎷︽埅鍣� 瀵瑰瓨鍙栨暟鎹湡闂磋嚜鍔ㄥ姞瑙e瘑<br/>鏀寔澶氱绛栫暐 濡侭ASE64銆丄ES銆丷SA銆丼M2銆丼M4绛�                                              | 鏃�                                                                                  |
 | 鎺ュ彛浼犺緭鍔犲瘑      | 閲囩敤 鍔ㄦ�� AES + RSA 鍔犲瘑璇锋眰 body 姣忎竴娆¤姹傜閽ラ兘涓嶅悓澶у箙搴﹂檷浣庡彲鐮磋В鎬�                                                                     | 鏃�                                                                                  |
 | 鏁版嵁缈昏瘧        | 閲囩敤 娉ㄨВ + jackson 搴忓垪鍖栨湡闂村姩鎬佷慨鏀规暟鎹� 鏁版嵁杩涜缈昏瘧<br/>鏀寔澶氱妯″紡: `鏄犲皠缈昏瘧` `鐩存帴缈昏瘧` `鍏朵粬鎵╁睍鏉′欢缈昏瘧` 鎺ュ彛鍖栦袱姝ュ嵆鍙畬鎴愯嚜瀹氫箟鎵╁睍 鍐呯疆澶氱缈昏瘧瀹炵幇                   | 鏃�                                                                                  |
-| 澶氭暟鎹簮妗嗘灦      | 閲囩敤 dynamic-datasource 鏀寔涓栭潰澶ч儴鍒嗘暟鎹簱<br/>閫氳繃yml閰嶇疆鍗冲彲鍔ㄦ�佺鐞嗗紓鏋勪笉鍚岀绫荤殑鏁版嵁搴� 涔熷彲閫氳繃鍓嶇椤甸潰娣诲姞鏁版嵁婧�<br/>鏀寔spel琛ㄨ揪寮忎粠璇锋眰澶村弬鏁扮瓑鏉′欢鍒囨崲鏁版嵁婧�            | 鍩轰簬 druid 鎵嬪姩缂栧啓浠g爜閰嶇疆鏁版嵁婧� 閰嶇疆绻佺悙 鏀寔鎬у樊                                                     |
+| 澶氭暟鎹簮妗嗘灦      | 閲囩敤 dynamic-datasource 鏀寔甯傞潰澶ч儴鍒嗘暟鎹簱<br/>閫氳繃yml閰嶇疆鍗冲彲鍔ㄦ�佺鐞嗗紓鏋勪笉鍚岀绫荤殑鏁版嵁搴� 涔熷彲閫氳繃鍓嶇椤甸潰娣诲姞鏁版嵁婧�<br/>鏀寔spel琛ㄨ揪寮忎粠璇锋眰澶村弬鏁扮瓑鏉′欢鍒囨崲鏁版嵁婧�            | 鍩轰簬 druid 鎵嬪姩缂栧啓浠g爜閰嶇疆鏁版嵁婧� 閰嶇疆绻佺悙 鏀寔鎬у樊                                                     |
 | 澶氭暟鎹簮浜嬪姟      | 閲囩敤 dynamic-datasource 鏀寔澶氭暟鎹簮涓嶅悓绉嶇被鐨勬暟鎹簱浜嬪姟鍥炴粴                                                                          | 涓嶆敮鎸�                                                                                |
 | 鏁版嵁搴撹繛鎺ユ睜      | 閲囩敤 HikariCP Spring瀹樻柟鍐呯疆杩炴帴姹� 閰嶇疆绠�鍗� 浠ユ�ц兘涓庣ǔ瀹氭�ч椈鍚嶅ぉ涓�                                                                        | 閲囩敤 druid bug浼楀 绀惧尯缁存姢宸� 娲昏穬搴︿綆 閰嶇疆浼楀绻佺悙鎬ц兘涓�鑸�                                               |
 | 鏁版嵁搴撲富閿�       | 閲囩敤 闆姳ID 鍩轰簬鏃堕棿鎴崇殑 鏈夊簭澧為暱 鍞竴ID 鍐嶄篃涓嶇敤涓哄垎搴撳垎琛� 鏁版嵁鍚堝苟涓婚敭鍐茬獊閲嶅鑰屽彂鎰�                                                                  | 閲囩敤 鏁版嵁搴撹嚜澧濱D 鏀寔鏁版嵁閲忔湁闄� 涓嶆敮鎸佸鏁版嵁婧愪富閿敮涓�                                                     |
diff --git a/pom.xml b/pom.xml
index 900b61b..7094419 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
     <description>RuoYi-Vue-Plus澶氱鎴风鐞嗙郴缁�</description>
 
     <properties>
-        <revision>5.2.0</revision>
+        <revision>5.2.1</revision>
         <spring-boot.version>3.2.6</spring-boot.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile
index 609b04a..10dabc4 100644
--- a/ruoyi-admin/Dockerfile
+++ b/ruoyi-admin/Dockerfile
@@ -1,7 +1,9 @@
+# 璐濆皵瀹為獙瀹� Spring 瀹樻柟鎺ㄨ崘闀滃儚 JDK涓嬭浇鍦板潃 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/server/logs \
     /ruoyi/server/temp \
@@ -9,6 +11,10 @@
 
 WORKDIR /ruoyi/server
 
+# 琛ュ叏alpine闀滃儚缂哄け瀛椾綋闂
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
+RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
+
 ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
 
 EXPOSE ${SERVER_PORT}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index d99af5b..1db68f1 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -1,6 +1,7 @@
 package org.dromara.web.controller;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import cn.dev33.satoken.exception.NotLoginException;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -194,8 +195,26 @@
      */
     @GetMapping("/tenant/list")
     public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
+        // 杩斿洖瀵硅薄
+        LoginTenantVo result = new LoginTenantVo();
+        boolean enable = TenantHelper.isEnable();
+        result.setTenantEnabled(enable);
+        // 濡傛灉鏈紑鍚鎴疯繖鐩存帴杩斿洖
+        if (!enable) {
+            return R.ok(result);
+        }
+
         List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
         List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
+        try {
+            // 濡傛灉鍙秴绠¤繑鍥炴墍鏈夌鎴�
+            if (LoginHelper.isSuperAdmin()) {
+                result.setVoList(voList);
+                return R.ok(result);
+            }
+        } catch (NotLoginException ignored) {
+        }
+
         // 鑾峰彇鍩熷悕
         String host;
         String referer = request.getHeader("referer");
@@ -208,11 +227,8 @@
         // 鏍规嵁鍩熷悕杩涜绛涢��
         List<TenantListVo> list = StreamUtils.filter(voList, vo ->
                 StringUtils.equals(vo.getDomain(), host));
-        // 杩斿洖瀵硅薄
-        LoginTenantVo vo = new LoginTenantVo();
-        vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
-        vo.setTenantEnabled(TenantHelper.isEnable());
-        return R.ok(vo);
+        result.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
+        return R.ok(result);
     }
 
 }
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
index cd33ea4..5d3ebd7 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
@@ -24,7 +24,6 @@
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.config.properties.CaptchaProperties;
-import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.vo.SysClientVo;
 import org.dromara.system.domain.vo.SysUserVo;
@@ -95,7 +94,7 @@
      * @param uuid     鍞竴鏍囪瘑
      */
     private void validateCaptcha(String tenantId, String username, String code, String uuid) {
-        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
+        String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
         String captcha = RedisUtils.getCacheObject(verifyKey);
         RedisUtils.deleteObject(verifyKey);
         if (captcha == null) {
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
index 6694165..01db200 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
@@ -16,6 +16,7 @@
 import org.dromara.common.core.enums.UserStatus;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.user.UserException;
+import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
@@ -83,7 +84,7 @@
         }
         SysSocialVo social;
         if (TenantHelper.isEnable()) {
-            Optional<SysSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
+            Optional<SysSocialVo> opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId()));
             if (opt.isEmpty()) {
                 throw new ServiceException("瀵逛笉璧凤紝浣犳病鏈夋潈闄愮櫥褰曞綋鍓嶇鎴凤紒");
             }
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index e24b265..ea5cafa 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -17,7 +17,7 @@
   token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
   server:
     host: 127.0.0.1
-    port: 1788
+    port: 17888
   # 璇﹁ script/sql/snail_job.sql `sj_namespace` 琛�
   namespace: ${spring.profiles.active}
   # 闅忎富搴旂敤绔彛椋橀��
@@ -96,8 +96,8 @@
     port: 6379
     # 鏁版嵁搴撶储寮�
     database: 0
-    # 瀵嗙爜(濡傛病鏈夊瘑鐮佽娉ㄩ噴鎺�)
-    # password:
+    # redis 瀵嗙爜蹇呴』閰嶇疆
+    password: ruoyi123
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
     # 鏄惁寮�鍚痵sl
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 0192d59..2a4bc11 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -13,14 +13,14 @@
 
 --- # snail-job 閰嶇疆
 snail-job:
-  enabled: false
+  enabled: true
   # 闇�瑕佸湪 SnailJob 鍚庡彴缁勭鐞嗗垱寤哄搴斿悕绉扮殑缁�,鐒跺悗鍒涘缓浠诲姟鐨勬椂鍊欓�夋嫨瀵瑰簲鐨勭粍,鎵嶈兘姝g‘鍒嗘淳浠诲姟
   group: "ruoyi_group"
   # SnailJob 鎺ュ叆楠岃瘉浠ょ墝 璇﹁ script/sql/snail_job.sql `sj_group_config` 琛�
   token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
   server:
     host: 127.0.0.1
-    port: 1788
+    port: 17888
   # 璇﹁ script/sql/snail_job.sql `sj_namespace` 琛�
   namespace: ${spring.profiles.active}
   # 闅忎富搴旂敤绔彛椋橀��
@@ -99,8 +99,8 @@
     port: 6379
     # 鏁版嵁搴撶储寮�
     database: 0
-    # 瀵嗙爜(濡傛病鏈夊瘑鐮佽娉ㄩ噴鎺�)
-    # password:
+    # redis 瀵嗙爜蹇呴』閰嶇疆
+    password: ruoyi123
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
     # 鏄惁寮�鍚痵sl
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index d546275..5388d8c 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -14,7 +14,7 @@
     </description>
 
     <properties>
-        <revision>5.2.0</revision>
+        <revision>5.2.1</revision>
     </properties>
 
     <dependencyManagement>
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java
index 967612e..1342deb 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java
@@ -7,6 +7,7 @@
 
 import java.util.*;
 import java.util.function.BiFunction;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -35,6 +36,34 @@
     }
 
     /**
+     * 鎵惧埌娴佷腑婊¤冻鏉′欢鐨勭涓�涓厓绱�
+     *
+     * @param collection 闇�瑕佹煡璇㈢殑闆嗗悎
+     * @param function   杩囨护鏂规硶
+     * @return 鎵惧埌绗﹀悎鏉′欢鐨勭涓�涓厓绱狅紝娌℃湁鍒欒繑鍥瀗ull
+     */
+    public static <E> E findFirst(Collection<E> collection, Predicate<E> function) {
+        if (CollUtil.isEmpty(collection)) {
+            return null;
+        }
+        return collection.stream().filter(function).findFirst().orElse(null);
+    }
+
+    /**
+     * 鎵惧埌娴佷腑浠绘剰涓�涓弧瓒虫潯浠剁殑鍏冪礌
+     *
+     * @param collection 闇�瑕佹煡璇㈢殑闆嗗悎
+     * @param function   杩囨护鏂规硶
+     * @return 鎵惧埌绗﹀悎鏉′欢鐨勪换鎰忎竴涓厓绱狅紝娌℃湁鍒欒繑鍥瀗ull
+     */
+    public static <E> Optional<E> findAny(Collection<E> collection, Predicate<E> function) {
+        if (CollUtil.isEmpty(collection)) {
+            return Optional.empty();
+        }
+        return collection.stream().filter(function).findAny();
+    }
+
+    /**
      * 灏哻ollection鎷兼帴
      *
      * @param collection 闇�瑕佽浆鍖栫殑闆嗗悎
diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java
index a35cc64..56b7369 100644
--- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java
+++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/handler/OpenApiHandler.java
@@ -11,6 +11,7 @@
 import io.swagger.v3.oas.models.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.dromara.common.core.utils.StreamUtils;
 import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
 import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
 import org.springdoc.core.properties.SpringDocConfigProperties;
@@ -230,7 +231,7 @@
             .flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet());
         methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.tags.Tag.class));
         if (!CollectionUtils.isEmpty(methodTags)) {
-            tagsStr.addAll(methodTags.stream().map(tag -> propertyResolverUtils.resolve(tag.name(), locale)).collect(Collectors.toSet()));
+            tagsStr.addAll(StreamUtils.toSet(methodTags, tag -> propertyResolverUtils.resolve(tag.name(), locale)));
             List<io.swagger.v3.oas.annotations.tags.Tag> allTags = new ArrayList<>(methodTags);
             addTags(allTags, tags, locale);
         }
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java
index aca470f..f8c5cd0 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java
@@ -3,9 +3,10 @@
 import java.lang.annotation.*;
 
 /**
- * 鏁版嵁鏉冮檺
- *
+ * 鏁版嵁鏉冮檺娉ㄨВ锛岀敤浜庢爣璁版暟鎹潈闄愮殑鍗犱綅绗﹀叧閿瓧鍜屾浛鎹㈠��
+ * <p>
  * 涓�涓敞瑙e彧鑳藉搴斾竴涓ā鏉�
+ * </p>
  *
  * @author Lion Li
  * @version 3.5.0
@@ -16,12 +17,16 @@
 public @interface DataColumn {
 
     /**
-     * 鍗犱綅绗﹀叧閿瓧
+     * 鏁版嵁鏉冮檺妯℃澘鐨勫崰浣嶇鍏抽敭瀛楋紝榛樿涓� "deptName"
+     *
+     * @return 鍗犱綅绗﹀叧閿瓧鏁扮粍
      */
     String[] key() default "deptName";
 
     /**
-     * 鍗犱綅绗︽浛鎹㈠��
+     * 鏁版嵁鏉冮檺妯℃澘鐨勫崰浣嶇鏇挎崲鍊硷紝榛樿涓� "dept_id"
+     *
+     * @return 鍗犱綅绗︽浛鎹㈠�兼暟缁�
      */
     String[] value() default "dept_id";
 
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java
index f4351e3..6fd3c3e 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java
@@ -3,7 +3,7 @@
 import java.lang.annotation.*;
 
 /**
- * 鏁版嵁鏉冮檺缁�
+ * 鏁版嵁鏉冮檺缁勬敞瑙o紝鐢ㄤ簬鏍囪鏁版嵁鏉冮檺閰嶇疆鏁扮粍
  *
  * @author Lion Li
  * @version 3.5.0
@@ -13,6 +13,11 @@
 @Documented
 public @interface DataPermission {
 
+    /**
+     * 鏁版嵁鏉冮檺閰嶇疆鏁扮粍锛岀敤浜庢寚瀹氭暟鎹潈闄愮殑鍗犱綅绗﹀叧閿瓧鍜屾浛鎹㈠��
+     *
+     * @return 鏁版嵁鏉冮檺閰嶇疆鏁扮粍
+     */
     DataColumn[] value();
 
 }
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java
index 820b49a..13a7941 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java
@@ -17,7 +17,6 @@
  *
  * @author Lion Li
  */
-
 @Data
 public class BaseEntity implements Serializable {
 
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java
index 3889250..956be9f 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java
@@ -12,6 +12,7 @@
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StreamUtils;
 
 import java.io.Serializable;
 import java.util.Collection;
@@ -34,20 +35,38 @@
 
     Log log = LogFactory.getLog(BaseMapperPlus.class);
 
+    /**
+     * 鑾峰彇褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� V 鐨� Class 瀵硅薄
+     *
+     * @return 杩斿洖褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� V 鐨� Class 瀵硅薄
+     */
     default Class<V> currentVoClass() {
         return (Class<V>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1];
     }
 
+    /**
+     * 鑾峰彇褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� T 鐨� Class 瀵硅薄
+     *
+     * @return 杩斿洖褰撳墠瀹炰緥瀵硅薄鍏宠仈鐨勬硾鍨嬬被鍨� T 鐨� Class 瀵硅薄
+     */
     default Class<T> currentModelClass() {
         return (Class<T>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0];
     }
 
+    /**
+     * 浣跨敤榛樿鐨勬煡璇㈡潯浠舵煡璇㈠苟杩斿洖缁撴灉鍒楄〃
+     *
+     * @return 杩斿洖鏌ヨ缁撴灉鐨勫垪琛�
+     */
     default List<T> selectList() {
         return this.selectList(new QueryWrapper<>());
     }
 
     /**
-     * 鎵归噺鎻掑叆
+     * 鎵归噺鎻掑叆瀹炰綋瀵硅薄闆嗗悎
+     *
+     * @param entityList 瀹炰綋瀵硅薄闆嗗悎
+     * @return 鎻掑叆鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿��
      */
     default boolean insertBatch(Collection<T> entityList) {
         Db.saveBatch(entityList);
@@ -56,7 +75,10 @@
     }
 
     /**
-     * 鎵归噺鏇存柊
+     * 鎵归噺鏍规嵁ID鏇存柊瀹炰綋瀵硅薄闆嗗悎
+     *
+     * @param entityList 瀹炰綋瀵硅薄闆嗗悎
+     * @return 鏇存柊鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿��
      */
     default boolean updateBatchById(Collection<T> entityList) {
         Db.updateBatchById(entityList);
@@ -65,7 +87,10 @@
     }
 
     /**
-     * 鎵归噺鎻掑叆鎴栨洿鏂�
+     * 鎵归噺鎻掑叆鎴栨洿鏂板疄浣撳璞¢泦鍚�
+     *
+     * @param entityList 瀹炰綋瀵硅薄闆嗗悎
+     * @return 鎻掑叆鎴栨洿鏂版搷浣滄槸鍚︽垚鍔熺殑甯冨皵鍊�
      */
     default boolean insertOrUpdateBatch(Collection<T> entityList) {
         Db.saveOrUpdateBatch(entityList);
@@ -74,7 +99,11 @@
     }
 
     /**
-     * 鎵归噺鎻掑叆(鍖呭惈闄愬埗鏉℃暟)
+     * 鎵归噺鎻掑叆瀹炰綋瀵硅薄闆嗗悎骞舵寚瀹氭壒澶勭悊澶у皬
+     *
+     * @param entityList 瀹炰綋瀵硅薄闆嗗悎
+     * @param batchSize  鎵瑰鐞嗗ぇ灏�
+     * @return 鎻掑叆鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿��
      */
     default boolean insertBatch(Collection<T> entityList, int batchSize) {
         Db.saveBatch(entityList, batchSize);
@@ -83,7 +112,11 @@
     }
 
     /**
-     * 鎵归噺鏇存柊(鍖呭惈闄愬埗鏉℃暟)
+     * 鎵归噺鏍规嵁ID鏇存柊瀹炰綋瀵硅薄闆嗗悎骞舵寚瀹氭壒澶勭悊澶у皬
+     *
+     * @param entityList 瀹炰綋瀵硅薄闆嗗悎
+     * @param batchSize  鎵瑰鐞嗗ぇ灏�
+     * @return 鏇存柊鎿嶄綔鏄惁鎴愬姛鐨勫竷灏斿��
      */
     default boolean updateBatchById(Collection<T> entityList, int batchSize) {
         Db.updateBatchById(entityList, batchSize);
@@ -92,7 +125,11 @@
     }
 
     /**
-     * 鎵归噺鎻掑叆鎴栨洿鏂�(鍖呭惈闄愬埗鏉℃暟)
+     * 鎵归噺鎻掑叆鎴栨洿鏂板疄浣撳璞¢泦鍚堝苟鎸囧畾鎵瑰鐞嗗ぇ灏�
+     *
+     * @param entityList 瀹炰綋瀵硅薄闆嗗悎
+     * @param batchSize  鎵瑰鐞嗗ぇ灏�
+     * @return 鎻掑叆鎴栨洿鏂版搷浣滄槸鍚︽垚鍔熺殑甯冨皵鍊�
      */
     default boolean insertOrUpdateBatch(Collection<T> entityList, int batchSize) {
         Db.saveOrUpdateBatch(entityList, batchSize);
@@ -100,12 +137,23 @@
         return true;
     }
 
+    /**
+     * 鏍规嵁ID鏌ヨ鍗曚釜VO瀵硅薄
+     *
+     * @param id 涓婚敭ID
+     * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄
+     */
     default V selectVoById(Serializable id) {
         return selectVoById(id, this.currentVoClass());
     }
 
     /**
-     * 鏍规嵁 ID 鏌ヨ
+     * 鏍规嵁ID鏌ヨ鍗曚釜VO瀵硅薄骞跺皢鍏惰浆鎹负鎸囧畾鐨刅O绫�
+     *
+     * @param id      涓婚敭ID
+     * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄
+     * @param <C>     VO绫荤殑绫诲瀷
+     * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C> C selectVoById(Serializable id, Class<C> voClass) {
         T obj = this.selectById(id);
@@ -115,12 +163,23 @@
         return MapstructUtils.convert(obj, voClass);
     }
 
+    /**
+     * 鏍规嵁ID闆嗗悎鎵归噺鏌ヨVO瀵硅薄鍒楄〃
+     *
+     * @param idList 涓婚敭ID闆嗗悎
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃
+     */
     default List<V> selectVoBatchIds(Collection<? extends Serializable> idList) {
         return selectVoBatchIds(idList, this.currentVoClass());
     }
 
     /**
-     * 鏌ヨ锛堟牴鎹甀D 鎵归噺鏌ヨ锛�
+     * 鏍规嵁ID闆嗗悎鎵归噺鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒楄〃
+     *
+     * @param idList  涓婚敭ID闆嗗悎
+     * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄
+     * @param <C>     VO绫荤殑绫诲瀷
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C> List<C> selectVoBatchIds(Collection<? extends Serializable> idList, Class<C> voClass) {
         List<T> list = this.selectBatchIds(idList);
@@ -130,12 +189,23 @@
         return MapstructUtils.convert(list, voClass);
     }
 
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢Map鏌ヨVO瀵硅薄鍒楄〃
+     *
+     * @param map 鏌ヨ鏉′欢Map
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃
+     */
     default List<V> selectVoByMap(Map<String, Object> map) {
         return selectVoByMap(map, this.currentVoClass());
     }
 
     /**
-     * 鏌ヨ锛堟牴鎹� columnMap 鏉′欢锛�
+     * 鏍规嵁鏌ヨ鏉′欢Map鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒楄〃
+     *
+     * @param map     鏌ヨ鏉′欢Map
+     * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄
+     * @param <C>     VO绫荤殑绫诲瀷
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C> List<C> selectVoByMap(Map<String, Object> map, Class<C> voClass) {
         List<T> list = this.selectByMap(map);
@@ -145,23 +215,47 @@
         return MapstructUtils.convert(list, voClass);
     }
 
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ鍗曚釜VO瀵硅薄
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄
+     */
     default V selectVoOne(Wrapper<T> wrapper) {
         return selectVoOne(wrapper, this.currentVoClass());
     }
 
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ鍗曚釜VO瀵硅薄锛屽苟鏍规嵁闇�瑕佸喅瀹氭槸鍚︽姏鍑哄紓甯�
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @param throwEx 鏄惁鎶涘嚭寮傚父鐨勬爣蹇�
+     * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄
+     */
     default V selectVoOne(Wrapper<T> wrapper, boolean throwEx) {
         return selectVoOne(wrapper, this.currentVoClass(), throwEx);
     }
 
     /**
-     * 鏍规嵁 entity 鏉′欢锛屾煡璇竴鏉¤褰�
+     * 鏍规嵁鏉′欢鏌ヨ鍗曚釜VO瀵硅薄锛屽苟鎸囧畾杩斿洖鐨刅O瀵硅薄鐨勭被鍨�
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @param voClass 杩斿洖鐨刅O瀵硅薄鐨凜lass瀵硅薄
+     * @param <C>     杩斿洖鐨刅O瀵硅薄鐨勭被鍨�
+     * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄锛岀粡杩囩被鍨嬭浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass) {
         return selectVoOne(wrapper, voClass, true);
     }
 
     /**
-     * 鏍规嵁 entity 鏉′欢锛屾煡璇竴鏉¤褰�
+     * 鏍规嵁鏉′欢鏌ヨ鍗曚釜瀹炰綋瀵硅薄锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄
+     * @param throwEx 鏄惁鎶涘嚭寮傚父鐨勬爣蹇�
+     * @param <C>     VO绫荤殑绫诲瀷
+     * @return 鏌ヨ鍒扮殑鍗曚釜VO瀵硅薄锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass, boolean throwEx) {
         T obj = this.selectOne(wrapper, throwEx);
@@ -171,16 +265,32 @@
         return MapstructUtils.convert(obj, voClass);
     }
 
+    /**
+     * 鏌ヨ鎵�鏈塚O瀵硅薄鍒楄〃
+     *
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃
+     */
     default List<V> selectVoList() {
         return selectVoList(new QueryWrapper<>(), this.currentVoClass());
     }
 
+    /**
+     * 鏍规嵁鏉′欢鏌ヨVO瀵硅薄鍒楄〃
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃
+     */
     default List<V> selectVoList(Wrapper<T> wrapper) {
         return selectVoList(wrapper, this.currentVoClass());
     }
 
     /**
-     * 鏍规嵁 entity 鏉′欢锛屾煡璇㈠叏閮ㄨ褰�
+     * 鏍规嵁鏉′欢鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒楄〃
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄
+     * @param <C>     VO绫荤殑绫诲瀷
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C> List<C> selectVoList(Wrapper<T> wrapper, Class<C> voClass) {
         List<T> list = this.selectList(wrapper);
@@ -190,15 +300,31 @@
         return MapstructUtils.convert(list, voClass);
     }
 
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨVO瀵硅薄鍒楄〃
+     *
+     * @param page    鍒嗛〉淇℃伅
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒嗛〉鍒楄〃
+     */
     default <P extends IPage<V>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper) {
         return selectVoPage(page, wrapper, this.currentVoClass());
     }
 
     /**
-     * 鍒嗛〉鏌ヨVO
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀹炰綋瀵硅薄鍒楄〃锛屽苟灏嗗叾杞崲涓烘寚瀹氱殑VO瀵硅薄鍒嗛〉鍒楄〃
+     *
+     * @param page    鍒嗛〉淇℃伅
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @param voClass 瑕佽浆鎹㈢殑VO绫荤殑Class瀵硅薄
+     * @param <C>     VO绫荤殑绫诲瀷
+     * @param <P>     VO瀵硅薄鍒嗛〉鍒楄〃鐨勭被鍨�
+     * @return 鏌ヨ鍒扮殑VO瀵硅薄鍒嗛〉鍒楄〃锛岀粡杩囪浆鎹负鎸囧畾鐨刅O绫诲悗杩斿洖
      */
     default <C, P extends IPage<C>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper, Class<C> voClass) {
+        // 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀹炰綋瀵硅薄鍒楄〃
         List<T> list = this.selectList(page, wrapper);
+        // 鍒涘缓涓�涓柊鐨刅O瀵硅薄鍒嗛〉鍒楄〃锛屽苟璁剧疆鍒嗛〉淇℃伅
         IPage<C> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
         if (CollUtil.isEmpty(list)) {
             return (P) voPage;
@@ -207,8 +333,16 @@
         return (P) voPage;
     }
 
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ绗﹀悎鏉′欢鐨勫璞★紝骞跺皢鍏惰浆鎹负鎸囧畾绫诲瀷鐨勫璞″垪琛�
+     *
+     * @param wrapper 鏌ヨ鏉′欢Wrapper
+     * @param mapper  杞崲鍑芥暟锛岀敤浜庡皢鏌ヨ鍒扮殑瀵硅薄杞崲涓烘寚瀹氱被鍨嬬殑瀵硅薄
+     * @param <C>     瑕佽浆鎹㈢殑瀵硅薄鐨勭被鍨�
+     * @return 鏌ヨ鍒扮殑绗﹀悎鏉′欢鐨勫璞″垪琛紝缁忚繃杞崲涓烘寚瀹氱被鍨嬬殑瀵硅薄鍚庤繑鍥�
+     */
     default <C> List<C> selectObjs(Wrapper<T> wrapper, Function<? super Object, C> mapper) {
-        return this.selectObjs(wrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
+        return StreamUtils.toList(this.selectObjs(wrapper), mapper);
     }
 
 }
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
index 40b7530..6ca9b27 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
@@ -4,10 +4,10 @@
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Data;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.sql.SqlUtil;
-import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -19,7 +19,6 @@
  *
  * @author Lion Li
  */
-
 @Data
 public class PageQuery implements Serializable {
 
@@ -56,6 +55,9 @@
      */
     public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;
 
+    /**
+     * 鏋勫缓鍒嗛〉瀵硅薄
+     */
     public <T> Page<T> build() {
         Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM);
         Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE);
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java
index a4b6799..8ecfb54 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java
@@ -14,7 +14,6 @@
  *
  * @author Lion Li
  */
-
 @Data
 @NoArgsConstructor
 public class TableDataInfo<T> implements Serializable {
@@ -53,6 +52,9 @@
         this.total = total;
     }
 
+    /**
+     * 鏍规嵁鍒嗛〉瀵硅薄鏋勫缓琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄
+     */
     public static <T> TableDataInfo<T> build(IPage<T> page) {
         TableDataInfo<T> rspData = new TableDataInfo<>();
         rspData.setCode(HttpStatus.HTTP_OK);
@@ -62,6 +64,9 @@
         return rspData;
     }
 
+    /**
+     * 鏍规嵁鏁版嵁鍒楄〃鏋勫缓琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄
+     */
     public static <T> TableDataInfo<T> build(List<T> list) {
         TableDataInfo<T> rspData = new TableDataInfo<>();
         rspData.setCode(HttpStatus.HTTP_OK);
@@ -71,6 +76,9 @@
         return rspData;
     }
 
+    /**
+     * 鏋勫缓琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄
+     */
     public static <T> TableDataInfo<T> build() {
         TableDataInfo<T> rspData = new TableDataInfo<>();
         rspData.setCode(HttpStatus.HTTP_OK);
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java
index 93487e9..5084424 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java
@@ -1,8 +1,8 @@
 package org.dromara.common.mybatis.enums;
 
-import org.dromara.common.core.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.dromara.common.core.utils.StringUtils;
 
 /**
  * 鏁版嵁搴撶被鍨�
@@ -33,8 +33,17 @@
      */
     SQL_SERVER("Microsoft SQL Server");
 
+    /**
+     * 鏁版嵁搴撶被鍨�
+     */
     private final String type;
 
+    /**
+     * 鏍规嵁鏁版嵁搴撲骇鍝佸悕绉版煡鎵惧搴旂殑鏁版嵁搴撶被鍨�
+     *
+     * @param databaseProductName 鏁版嵁搴撲骇鍝佸悕绉�
+     * @return 瀵瑰簲鐨勬暟鎹簱绫诲瀷鏋氫妇鍊硷紝濡傛灉鏈壘鍒板垯杩斿洖 null
+     */
     public static DataBaseType find(String databaseProductName) {
         if (StringUtils.isBlank(databaseProductName)) {
             return null;
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java
index 9ea66b0..455cecb 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java
@@ -1,19 +1,22 @@
 package org.dromara.common.mybatis.enums;
 
-import org.dromara.common.core.utils.StringUtils;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.helper.DataPermissionHelper;
 
 /**
- * 鏁版嵁鏉冮檺绫诲瀷
+ * 鏁版嵁鏉冮檺绫诲瀷鏋氫妇
  * <p>
- * 璇硶鏀寔 spel 妯℃澘琛ㄨ揪寮�
- * <p>
- * 鍐呯疆鏁版嵁 user 褰撳墠鐢ㄦ埛 鍐呭鍙傝�� LoginUser
- * 濡傞渶鎵╁睍鏁版嵁 鍙娇鐢� {@link DataPermissionHelper} 鎿嶄綔
- * 鍐呯疆鏈嶅姟 sdss 绯荤粺鏁版嵁鏉冮檺鏈嶅姟 鍐呭鍙傝�� SysDataScopeService
- * 濡傞渶鎵╁睍鏇村鑷畾涔夋湇鍔� 鍙互鍙傝�� sdss 鑷缂栧啓
+ * 鏀寔浣跨敤 SpEL 妯℃澘琛ㄨ揪寮忓畾涔� SQL 鏌ヨ鏉′欢
+ * 鍐呯疆鏁版嵁锛�
+ * - {@code user}: 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅锛屽弬鑰� {@link LoginUser}
+ * 鍐呯疆鏈嶅姟锛�
+ * - {@code sdss}: 绯荤粺鏁版嵁鏉冮檺鏈嶅姟锛屽弬鑰� {@link ISysDataScopeService}
+ * 濡傞渶鎵╁睍鏁版嵁锛屽彲浠ラ�氳繃 {@link DataPermissionHelper} 杩涜鎿嶄綔
+ * 濡傞渶鎵╁睍鏈嶅姟锛屽彲浠ラ�氳繃 {@link ISysDataScopeService} 鑷缂栧啓
+ * </p>
  *
  * @author Lion Li
  * @version 3.5.0
@@ -29,36 +32,50 @@
 
     /**
      * 鑷畾鏁版嵁鏉冮檺
+     * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} )`
+     * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0`
      */
     CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "),
 
     /**
      * 閮ㄩ棬鏁版嵁鏉冮檺
+     * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#deptName} = #{#user.deptId}`
+     * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0`
      */
     DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "),
 
     /**
      * 閮ㄩ棬鍙婁互涓嬫暟鎹潈闄�
+     * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )}`
+     * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0`
      */
     DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "),
 
     /**
      * 浠呮湰浜烘暟鎹潈闄�
+     * 浣跨敤 SpEL 琛ㄨ揪寮忥細`#{#userName} = #{#user.userId}`
+     * 濡傛灉涓嶆弧瓒虫潯浠讹紝鍒欎娇鐢ㄩ粯璁� SQL 琛ㄨ揪寮忥細`1 = 0`
      */
     SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 ");
 
     private final String code;
 
     /**
-     * 璇硶 閲囩敤 spel 妯℃澘琛ㄨ揪寮�
+     * SpEL 妯℃澘琛ㄨ揪寮忥紝鐢ㄤ簬鏋勫缓 SQL 鏌ヨ鏉′欢
      */
     private final String sqlTemplate;
 
     /**
-     * 涓嶆弧瓒� sqlTemplate 鍒欏~鍏�
+     * 濡傛灉涓嶆弧瓒� {@code sqlTemplate} 鐨勬潯浠讹紝鍒欎娇鐢ㄦ榛樿 SQL 琛ㄨ揪寮�
      */
     private final String elseSql;
 
+    /**
+     * 鏍规嵁鏋氫妇浠g爜鏌ユ壘瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param code 鏋氫妇浠g爜
+     * @return 瀵瑰簲鐨勬灇涓惧�硷紝濡傛灉鏈壘鍒板垯杩斿洖 null
+     */
     public static DataScopeType findCode(String code) {
         if (StringUtils.isBlank(code)) {
             return null;
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java
index a66908f..99e6b38 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java
@@ -3,12 +3,12 @@
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpStatus;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.satoken.utils.LoginHelper;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.reflection.MetaObject;
 
 import java.util.Date;
 
@@ -21,21 +21,28 @@
 @Slf4j
 public class InjectionMetaObjectHandler implements MetaObjectHandler {
 
+    /**
+     * 鎻掑叆濉厖鏂规硶锛岀敤浜庡湪鎻掑叆鏁版嵁鏃惰嚜鍔ㄥ~鍏呭疄浣撳璞′腑鐨勫垱寤烘椂闂淬�佹洿鏂版椂闂淬�佸垱寤轰汉銆佹洿鏂颁汉绛変俊鎭�
+     *
+     * @param metaObject 鍏冨璞★紝鐢ㄤ簬鑾峰彇鍘熷瀵硅薄骞惰繘琛屽~鍏�
+     */
     @Override
     public void insertFill(MetaObject metaObject) {
         try {
             if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) {
+                // 鑾峰彇褰撳墠鏃堕棿浣滀负鍒涘缓鏃堕棿鍜屾洿鏂版椂闂达紝濡傛灉鍒涘缓鏃堕棿涓嶄负绌猴紝鍒欎娇鐢ㄥ垱寤烘椂闂达紝鍚﹀垯浣跨敤褰撳墠鏃堕棿
                 Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime())
                     ? baseEntity.getCreateTime() : new Date();
                 baseEntity.setCreateTime(current);
                 baseEntity.setUpdateTime(current);
+
+                // 濡傛灉鍒涘缓浜轰负绌猴紝鍒欏~鍏呭綋鍓嶇櫥褰曠敤鎴风殑淇℃伅
                 if (ObjectUtil.isNull(baseEntity.getCreateBy())) {
                     LoginUser loginUser = getLoginUser();
                     if (ObjectUtil.isNotNull(loginUser)) {
                         Long userId = loginUser.getUserId();
-                        // 褰撳墠宸茬櫥褰� 涓� 鍒涘缓浜轰负绌� 鍒欏~鍏�
+                        // 濉厖鍒涘缓浜恒�佹洿鏂颁汉鍜屽垱寤洪儴闂ㄤ俊鎭�
                         baseEntity.setCreateBy(userId);
-                        // 褰撳墠宸茬櫥褰� 涓� 鏇存柊浜轰负绌� 鍒欏~鍏�
                         baseEntity.setUpdateBy(userId);
                         baseEntity.setCreateDept(ObjectUtil.isNotNull(baseEntity.getCreateDept())
                             ? baseEntity.getCreateDept() : loginUser.getDeptId());
@@ -47,19 +54,24 @@
         }
     }
 
+    /**
+     * 鏇存柊濉厖鏂规硶锛岀敤浜庡湪鏇存柊鏁版嵁鏃惰嚜鍔ㄥ~鍏呭疄浣撳璞′腑鐨勬洿鏂版椂闂村拰鏇存柊浜轰俊鎭�
+     *
+     * @param metaObject 鍏冨璞★紝鐢ㄤ簬鑾峰彇鍘熷瀵硅薄骞惰繘琛屽~鍏�
+     */
     @Override
     public void updateFill(MetaObject metaObject) {
         try {
             if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) {
+                // 鑾峰彇褰撳墠鏃堕棿浣滀负鏇存柊鏃堕棿锛屾棤璁哄師濮嬪璞′腑鐨勬洿鏂版椂闂存槸鍚︿负绌洪兘濉厖
                 Date current = new Date();
-                // 鏇存柊鏃堕棿濉厖(涓嶇涓轰笉涓虹┖)
                 baseEntity.setUpdateTime(current);
-                // 褰撳墠宸茬櫥褰� 鏇存柊浜哄~鍏�(涓嶇涓轰笉涓虹┖)
+
+                // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛鐨処D锛屽苟濉厖鏇存柊浜轰俊鎭�
                 Long userId = LoginHelper.getUserId();
                 if (ObjectUtil.isNotNull(userId)) {
                     baseEntity.setUpdateBy(userId);
                 }
-
             }
         } catch (Exception e) {
             throw new ServiceException("鑷姩娉ㄥ叆寮傚父 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
@@ -67,7 +79,9 @@
     }
 
     /**
-     * 鑾峰彇鐧诲綍鐢ㄦ埛鍚�
+     * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
+     *
+     * @return 褰撳墠鐧诲綍鐢ㄦ埛鐨勪俊鎭紝濡傛灉鐢ㄦ埛鏈櫥褰曞垯杩斿洖 null
      */
     private LoginUser getLoginUser() {
         LoginUser loginUser;
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java
index ec3ee0d..518d52d 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java
@@ -1,14 +1,13 @@
 package org.dromara.common.mybatis.handler;
 
-import org.dromara.common.core.domain.R;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.StringUtils;
 import org.mybatis.spring.MyBatisSystemException;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
-
-import jakarta.servlet.http.HttpServletRequest;
 
 /**
  * Mybatis寮傚父澶勭悊鍣�
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
index 7d7fd84..74279bd 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
@@ -68,13 +68,27 @@
      */
     private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory());
 
+    /**
+     * 鏋勯�犳柟娉曪紝鎵弿鎸囧畾鍖呬笅鐨� Mapper 绫诲苟鍒濆鍖栫紦瀛�
+     *
+     * @param mapperPackage Mapper 绫绘墍鍦ㄧ殑鍖呰矾寰�
+     */
     public PlusDataPermissionHandler(String mapperPackage) {
         scanMapperClasses(mapperPackage);
     }
 
-
+    /**
+     * 鑾峰彇鏁版嵁杩囨护鏉′欢鐨� SQL 鐗囨
+     *
+     * @param where             鍘熷鐨勬煡璇㈡潯浠惰〃杈惧紡
+     * @param mappedStatementId Mapper 鏂规硶鐨� ID
+     * @param isSelect          鏄惁涓烘煡璇㈣鍙�
+     * @return 鏁版嵁杩囨护鏉′欢鐨� SQL 鐗囨
+     */
     public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) {
+        // 鑾峰彇鏁版嵁鏉冮檺閰嶇疆
         DataPermission dataPermission = getDataPermission(mappedStatementId);
+        // 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
         LoginUser currentUser = DataPermissionHelper.getVariable("user");
         if (ObjectUtil.isNull(currentUser)) {
             currentUser = LoginHelper.getLoginUser();
@@ -84,6 +98,7 @@
         if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
             return where;
         }
+        // 鏋勯�犳暟鎹繃婊ゆ潯浠剁殑 SQL 鐗囨
         String dataFilterSql = buildDataFilter(dataPermission.value(), isSelect);
         if (StringUtils.isBlank(dataFilterSql)) {
             return where;
@@ -103,7 +118,12 @@
     }
 
     /**
-     * 鏋勯�犳暟鎹繃婊ql
+     * 鏋勫缓鏁版嵁杩囨护鏉′欢鐨� SQL 璇彞
+     *
+     * @param dataColumns 鏁版嵁鏉冮檺娉ㄨВ涓殑鍒椾俊鎭�
+     * @param isSelect    鏍囧織褰撳墠鎿嶄綔鏄惁涓烘煡璇㈡搷浣滐紝鏌ヨ鎿嶄綔鍜屾洿鏂版垨鍒犻櫎鎿嶄綔鍦ㄥ鐞嗚繃婊ゆ潯浠舵椂浼氭湁涓嶅悓鐨勫鐞嗘柟寮�
+     * @return 鏋勫缓鐨勬暟鎹繃婊ゆ潯浠剁殑 SQL 璇彞
+     * @throws ServiceException 濡傛灉瑙掕壊鐨勬暟鎹寖鍥村紓甯告垨鑰� key 涓� value 鐨勯暱搴︿笉鍖归厤锛屽垯鎶涘嚭 ServiceException 寮傚父
      */
     private String buildDataFilter(DataColumn[] dataColumns, boolean isSelect) {
         // 鏇存柊鎴栧垹闄ら渶婊¤冻鎵�鏈夋潯浠�
@@ -159,20 +179,29 @@
     }
 
     /**
-     * 閫氳繃 mapperPackage 璁剧疆鐨勬壂鎻忓寘 鎵弿缂撳瓨鏈夋敞瑙g殑鏂规硶涓庣被
+     * 鎵弿鎸囧畾鍖呬笅鐨� Mapper 绫伙紝骞舵煡鎵惧叾涓甫鏈夌壒瀹氭敞瑙g殑鏂规硶鎴栫被
+     *
+     * @param mapperPackage Mapper 绫绘墍鍦ㄧ殑鍖呰矾寰�
      */
     private void scanMapperClasses(String mapperPackage) {
+        // 鍒涘缓璧勬簮瑙f瀽鍣ㄥ拰鍏冩暟鎹鍙栧伐鍘�
         PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
         CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory();
+        // 灏� Mapper 鍖呰矾寰勬寜鍒嗛殧绗︽媶鍒嗕负鏁扮粍
         String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
         String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX;
         try {
             for (String packagePattern : packagePatternArray) {
+                // 灏嗗寘璺緞杞崲涓鸿祫婧愯矾寰�
                 String path = ClassUtils.convertClassNameToResourcePath(packagePattern);
+                // 鑾峰彇鎸囧畾璺緞涓嬬殑鎵�鏈� .class 鏂囦欢璧勬簮
                 Resource[] resources = resolver.getResources(classpath + path + "/*.class");
                 for (Resource resource : resources) {
+                    // 鑾峰彇璧勬簮鐨勭被鍏冩暟鎹�
                     ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata();
+                    // 鑾峰彇璧勬簮瀵瑰簲鐨勭被瀵硅薄
                     Class<?> clazz = Resources.classForName(classMetadata.getClassName());
+                    // 鏌ユ壘绫讳腑鐨勭壒瀹氭敞瑙�
                     findAnnotation(clazz);
                 }
             }
@@ -181,9 +210,13 @@
         }
     }
 
+    /**
+     * 鍦ㄦ寚瀹氱殑绫讳腑鏌ユ壘鐗瑰畾鐨勬敞瑙� DataPermission锛屽苟灏嗗甫鏈夎繖涓敞瑙g殑鏂规硶鎴栫被瀛樺偍鍒� dataPermissionCacheMap 涓�
+     *
+     * @param clazz 瑕佹煡鎵剧殑绫�
+     */
     private void findAnnotation(Class<?> clazz) {
         DataPermission dataPermission;
-        // 鑾峰彇鏂规硶娉ㄨВ
         for (Method method : clazz.getMethods()) {
             if (method.isDefault() || method.isVarArgs()) {
                 continue;
@@ -194,17 +227,24 @@
                 dataPermissionCacheMap.put(mappedStatementId, dataPermission);
             }
         }
-        // 鑾峰彇绫绘敞瑙�
         if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
             dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
             dataPermissionCacheMap.put(clazz.getName(), dataPermission);
         }
     }
 
+    /**
+     * 鏍规嵁鏄犲皠璇彞 ID 鎴栫被鍚嶈幏鍙栧搴旂殑 DataPermission 娉ㄨВ瀵硅薄
+     *
+     * @param mapperId 鏄犲皠璇彞 ID
+     * @return DataPermission 娉ㄨВ瀵硅薄锛屽鏋滀笉瀛樺湪鍒欒繑鍥� null
+     */
     public DataPermission getDataPermission(String mapperId) {
+        // 妫�鏌ョ紦瀛樹腑鏄惁鍖呭惈鏄犲皠璇彞 ID 瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄
         if (dataPermissionCacheMap.containsKey(mapperId)) {
             return dataPermissionCacheMap.get(mapperId);
         }
+        // 濡傛灉缂撳瓨涓笉鍖呭惈鏄犲皠璇彞 ID 瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄锛屽垯灏濊瘯浣跨敤绫诲悕浣滀负閿煡鎵�
         String clazzName = mapperId.substring(0, mapperId.lastIndexOf("."));
         if (dataPermissionCacheMap.containsKey(clazzName)) {
             return dataPermissionCacheMap.get(clazzName);
@@ -213,7 +253,10 @@
     }
 
     /**
-     * 鏄惁鏃犳晥
+     * 妫�鏌ョ粰瀹氱殑鏄犲皠璇彞 ID 鏄惁鏈夋晥锛屽嵆鏄惁鑳藉鎵惧埌瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄
+     *
+     * @param mapperId 鏄犲皠璇彞 ID
+     * @return 濡傛灉鎵惧埌瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄锛屽垯杩斿洖 false锛涘惁鍒欒繑鍥� true
      */
     public boolean invalid(String mapperId) {
         return getDataPermission(mapperId) == null;
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
index bb20f4b..a7cfee5 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
@@ -2,11 +2,11 @@
 
 import cn.hutool.core.convert.Convert;
 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.mybatis.enums.DataBaseType;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
 
 import javax.sql.DataSource;
 import java.sql.Connection;
@@ -14,7 +14,6 @@
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 /**
  * 鏁版嵁搴撳姪鎵�
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java
index 7f6ab1f..2afe9ee 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java
@@ -24,17 +24,35 @@
 
     private static final String DATA_PERMISSION_KEY = "data:permission";
 
+    /**
+     * 浠庝笂涓嬫枃涓幏鍙栨寚瀹氶敭鐨勫彉閲忓�硷紝骞跺皢鍏惰浆鎹负鎸囧畾鐨勭被鍨�
+     *
+     * @param key 鍙橀噺鐨勯敭
+     * @param <T> 鍙橀噺鍊肩殑绫诲瀷
+     * @return 鎸囧畾閿殑鍙橀噺鍊硷紝濡傛灉涓嶅瓨鍦ㄥ垯杩斿洖 null
+     */
     public static <T> T getVariable(String key) {
         Map<String, Object> context = getContext();
         return (T) context.get(key);
     }
 
-
+    /**
+     * 鍚戜笂涓嬫枃涓缃寚瀹氶敭鐨勫彉閲忓��
+     *
+     * @param key   瑕佽缃殑鍙橀噺鐨勯敭
+     * @param value 瑕佽缃殑鍙橀噺鍊�
+     */
     public static void setVariable(String key, Object value) {
         Map<String, Object> context = getContext();
         context.put(key, value);
     }
 
+    /**
+     * 鑾峰彇鏁版嵁鏉冮檺涓婁笅鏂�
+     *
+     * @return 瀛樺偍鍦⊿aStorage涓殑Map瀵硅薄锛岀敤浜庡瓨鍌ㄦ暟鎹潈闄愮浉鍏崇殑涓婁笅鏂囦俊鎭�
+     * @throws NullPointerException 濡傛灉鏁版嵁鏉冮檺涓婁笅鏂囩被鍨嬪紓甯革紝鍒欐姏鍑篘ullPointerException
+     */
     public static Map<String, Object> getContext() {
         SaStorage saStorage = SaHolder.getStorage();
         Object attribute = saStorage.get(DATA_PERMISSION_KEY);
@@ -64,6 +82,7 @@
 
     /**
      * 鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц
+     * <p>绂佹鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц蹇界暐鏁版嵁鏉冮檺</p>
      *
      * @param handle 澶勭悊鎵ц鏂规硶
      */
@@ -78,6 +97,7 @@
 
     /**
      * 鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц
+     * <p>绂佹鍦ㄥ拷鐣ユ暟鎹潈闄愪腑鎵ц蹇界暐鏁版嵁鏉冮檺</p>
      *
      * @param handle 澶勭悊鎵ц鏂规硶
      */
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
index 6eed8f7..85a4d0a 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
@@ -37,17 +37,33 @@
 
     private final PlusDataPermissionHandler dataPermissionHandler;
 
+    /**
+     * 鏋勯�犲嚱鏁帮紝鍒濆鍖� PlusDataPermissionHandler 瀹炰緥
+     *
+     * @param mapperPackage 鎵弿鐨勬槧灏勫櫒鍖�
+     */
     public PlusDataPermissionInterceptor(String mapperPackage) {
         this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage);
     }
 
+    /**
+     * 鍦ㄦ墽琛屾煡璇箣鍓嶏紝妫�鏌ュ苟澶勭悊鏁版嵁鏉冮檺鐩稿叧閫昏緫
+     *
+     * @param executor      MyBatis 鎵ц鍣ㄥ璞�
+     * @param ms            鏄犲皠璇彞瀵硅薄
+     * @param parameter     鏂规硶鍙傛暟
+     * @param rowBounds     鍒嗛〉瀵硅薄
+     * @param resultHandler 缁撴灉澶勭悊鍣�
+     * @param boundSql      缁戝畾鐨� SQL 瀵硅薄
+     * @throws SQLException 濡傛灉鍙戠敓 SQL 寮傚父
+     */
     @Override
     public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
-        // 妫�鏌ュ拷鐣ユ敞瑙�
+        // 妫�鏌ユ槸鍚﹂渶瑕佸拷鐣ユ暟鎹潈闄愬鐞�
         if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {
             return;
         }
-        // 妫�鏌ユ槸鍚︽棤鏁� 鏃犳暟鎹潈闄愭敞瑙�
+        // 妫�鏌ユ槸鍚︾己灏戞湁鏁堢殑鏁版嵁鏉冮檺娉ㄨВ
         if (dataPermissionHandler.invalid(ms.getId())) {
             return;
         }
@@ -56,16 +72,26 @@
         mpBs.sql(parserSingle(mpBs.sql(), ms.getId()));
     }
 
+    /**
+     * 鍦ㄥ噯澶� SQL 璇彞涔嬪墠锛屾鏌ュ苟澶勭悊鏇存柊鍜屽垹闄ゆ搷浣滅殑鏁版嵁鏉冮檺鐩稿叧閫昏緫
+     *
+     * @param sh                 MyBatis StatementHandler 瀵硅薄
+     * @param connection         鏁版嵁搴撹繛鎺ュ璞�
+     * @param transactionTimeout 浜嬪姟瓒呮椂鏃堕棿
+     */
     @Override
     public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
         PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
         MappedStatement ms = mpSh.mappedStatement();
+        // 鑾峰彇 SQL 鍛戒护绫诲瀷锛堝銆佸垹銆佹敼銆佹煡锛�
         SqlCommandType sct = ms.getSqlCommandType();
+
+        // 鍙鐞嗘洿鏂板拰鍒犻櫎鎿嶄綔鐨� SQL 璇彞
         if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
             if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {
                 return;
             }
-            // 妫�鏌ユ槸鍚︽棤鏁� 鏃犳暟鎹潈闄愭敞瑙�
+            // 妫�鏌ユ槸鍚︾己灏戞湁鏁堢殑鏁版嵁鏉冮檺娉ㄨВ
             if (dataPermissionHandler.invalid(ms.getId())) {
                 return;
             }
@@ -74,6 +100,14 @@
         }
     }
 
+    /**
+     * 澶勭悊 SELECT 鏌ヨ璇彞涓殑 WHERE 鏉′欢
+     *
+     * @param select SELECT 鏌ヨ瀵硅薄
+     * @param index  鏌ヨ璇彞鐨勭储寮�
+     * @param sql    鏌ヨ璇彞
+     * @param obj    WHERE 鏉′欢鍙傛暟
+     */
     @Override
     protected void processSelect(Select select, int index, String sql, Object obj) {
         if (select instanceof PlainSelect) {
@@ -84,6 +118,14 @@
         }
     }
 
+    /**
+     * 澶勭悊 UPDATE 璇彞涓殑 WHERE 鏉′欢
+     *
+     * @param update UPDATE 鏌ヨ瀵硅薄
+     * @param index  鏌ヨ璇彞鐨勭储寮�
+     * @param sql    鏌ヨ璇彞
+     * @param obj    WHERE 鏉′欢鍙傛暟
+     */
     @Override
     protected void processUpdate(Update update, int index, String sql, Object obj) {
         Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false);
@@ -92,6 +134,14 @@
         }
     }
 
+    /**
+     * 澶勭悊 DELETE 璇彞涓殑 WHERE 鏉′欢
+     *
+     * @param delete DELETE 鏌ヨ瀵硅薄
+     * @param index  鏌ヨ璇彞鐨勭储寮�
+     * @param sql    鏌ヨ璇彞
+     * @param obj    WHERE 鏉′欢鍙傛暟
+     */
     @Override
     protected void processDelete(Delete delete, int index, String sql, Object obj) {
         Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false);
@@ -101,10 +151,10 @@
     }
 
     /**
-     * 璁剧疆 where 鏉′欢
+     * 璁剧疆 SELECT 璇彞鐨� WHERE 鏉′欢
      *
-     * @param plainSelect       鏌ヨ瀵硅薄
-     * @param mappedStatementId 鎵ц鏂规硶id
+     * @param plainSelect       SELECT 鏌ヨ瀵硅薄
+     * @param mappedStatementId 鏄犲皠璇彞鐨� ID
      */
     protected void setWhere(PlainSelect plainSelect, String mappedStatementId) {
         Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true);
@@ -113,6 +163,14 @@
         }
     }
 
+    /**
+     * 鏋勫缓琛ㄨ揪寮忥紝鐢ㄤ簬澶勭悊琛ㄧ殑鏁版嵁鏉冮檺
+     *
+     * @param table        琛ㄥ璞�
+     * @param where        WHERE 鏉′欢琛ㄨ揪寮�
+     * @param whereSegment WHERE 鏉′欢鐗囨
+     * @return 鏋勫缓鐨勮〃杈惧紡
+     */
     @Override
     public Expression buildTableExpression(Table table, Expression where, String whereSegment) {
         // 鍙湁鏂扮増鏁版嵁鏉冮檺澶勭悊鍣ㄦ墠浼氭墽琛屽埌杩欓噷
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties
index e9d10f3..f3ed7d8 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties
@@ -17,4 +17,4 @@
 # 鏄惁杩囨护 Log
 filter=true
 # 杩囨护 Log 鏃舵墍鎺掗櫎鐨� sql 鍏抽敭瀛楋紝浠ラ�楀彿鍒嗛殧
-exclude=SELECT 1
+exclude=
diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
index 86668aa..5e300da 100644
--- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
+++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
@@ -178,6 +178,7 @@
                             .key(key)
                             .contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null)
                             .contentType(contentType)
+                            .acl(getAccessPolicy().getObjectCannedACL())
                             .build())
                     .addTransferListener(LoggingTransferListener.create())
                     .source(filePath).build());
@@ -223,6 +224,7 @@
                         y -> y.bucket(properties.getBucketName())
                             .key(key)
                             .contentType(contentType)
+                            .acl(getAccessPolicy().getObjectCannedACL())
                             .build())
                     .build());
 
diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java
index 4587e64..e436a46 100644
--- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java
+++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java
@@ -1,12 +1,13 @@
 package org.dromara.common.redis.utils;
 
-import org.dromara.common.core.utils.SpringUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.dromara.common.core.utils.SpringUtils;
 import org.redisson.api.*;
 
+import java.util.concurrent.CompletionStage;
 import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
+import java.util.function.Function;
 
 /**
  * 鍒嗗竷寮忛槦鍒楀伐鍏�
@@ -224,7 +225,7 @@
     /**
      * 璁㈤槄闃诲闃熷垪(鍙闃呮墍鏈夊疄鐜扮被 渚嬪: 寤惰繜 浼樺厛 鏈夌晫 绛�)
      */
-    public static <T> void subscribeBlockingQueue(String queueName, Consumer<T> consumer, boolean isDelayed) {
+    public static <T> void subscribeBlockingQueue(String queueName, Function<T, CompletionStage<Void>> consumer, boolean isDelayed) {
         RBlockingQueue<T> queue = CLIENT.getBlockingQueue(queueName);
         if (isDelayed) {
             // 璁㈤槄寤惰繜闃熷垪
diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
index 1e0d8a7..4ab7d4e 100644
--- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
+++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java
@@ -3,6 +3,7 @@
 import cn.dev33.satoken.session.SaSession;
 import cn.dev33.satoken.stp.SaLoginModel;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.AccessLevel;
@@ -88,6 +89,13 @@
     }
 
     /**
+     * 鑾峰彇鐢ㄦ埛璐︽埛
+     */
+    public static String getUsername() {
+        return Convert.toStr(getExtra(USER_NAME_KEY));
+    }
+
+    /**
      * 鑾峰彇绉熸埛ID
      */
     public static String getTenantId() {
@@ -130,13 +138,6 @@
     }
 
     /**
-     * 鑾峰彇鐢ㄦ埛璐︽埛
-     */
-    public static String getUsername() {
-        return getLoginUser().getUsername();
-    }
-
-    /**
      * 鑾峰彇鐢ㄦ埛绫诲瀷
      */
     public static UserType getUserType() {
@@ -170,6 +171,9 @@
      * @return 缁撴灉
      */
     public static boolean isTenantAdmin(Set<String> rolePermission) {
+        if (CollUtil.isEmpty(rolePermission)) {
+            return false;
+        }
         return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY);
     }
 
@@ -188,7 +192,11 @@
      * @return 缁撴灉
      */
     public static boolean isLogin() {
-        return getLoginUser() != null;
+        try {
+            return getLoginUser() != null;
+        } catch (Exception e) {
+            return false;
+        }
     }
 
 }
diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java
index 0f78928..ac50dd2 100644
--- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java
+++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java
@@ -16,15 +16,11 @@
 @AutoConfiguration
 public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
 
-    /**
-     * 璁剧疆 Undertow 鐨� websocket 缂撳啿姹�
-     */
     @Override
     public void customize(UndertowServletWebServerFactory factory) {
-        // 榛樿涓嶇洿鎺ュ垎閰嶅唴瀛� 濡傛灉椤圭洰涓娇鐢ㄤ簡 websocket 寤鸿鐩存帴鍒嗛厤
         factory.addDeploymentInfoCustomizers(deploymentInfo -> {
             WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
-            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 512));
+            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024));
             deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
             // 浣跨敤铏氭嫙绾跨▼
             if (SpringUtils.isVirtual()) {
diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
index 1ad8ad6..c70e377 100644
--- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
+++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/interceptor/PlusWebSocketInterceptor.java
@@ -35,23 +35,28 @@
      */
     @Override
     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
-        // 妫�鏌ユ槸鍚︾櫥褰� 鏄惁鏈塼oken
-        LoginUser loginUser = LoginHelper.getLoginUser();
+        try {
+            // 妫�鏌ユ槸鍚︾櫥褰� 鏄惁鏈塼oken
+            LoginUser loginUser = LoginHelper.getLoginUser();
 
-        // 瑙e喅 ws 涓嶈蛋 mvc 鎷︽埅鍣ㄩ棶棰�(cloud 鐗堟湰涓嶅彈褰卞搷)
-        // 妫�鏌� header 涓� param 閲岀殑 clientid 涓� token 閲岀殑鏄惁涓�鑷�
-        String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
-        String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
-        String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
-        if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
-            // token 鏃犳晥
-            throw NotLoginException.newInstance(StpUtil.getLoginType(),
-                "-100", "瀹㈡埛绔疘D涓嶵oken涓嶅尮閰�",
-                StpUtil.getTokenValue());
+            // 瑙e喅 ws 涓嶈蛋 mvc 鎷︽埅鍣ㄩ棶棰�(cloud 鐗堟湰涓嶅彈褰卞搷)
+            // 妫�鏌� header 涓� param 閲岀殑 clientid 涓� token 閲岀殑鏄惁涓�鑷�
+            String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
+            String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
+            String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
+            if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
+                // token 鏃犳晥
+                throw NotLoginException.newInstance(StpUtil.getLoginType(),
+                    "-100", "瀹㈡埛绔疘D涓嶵oken涓嶅尮閰�",
+                    StpUtil.getTokenValue());
+            }
+
+            attributes.put(LOGIN_USER_KEY, loginUser);
+            return true;
+        } catch (NotLoginException e) {
+            log.error("WebSocket 璁よ瘉澶辫触'{}',鏃犳硶璁块棶绯荤粺璧勬簮", e.getMessage());
+            return false;
         }
-
-        attributes.put(LOGIN_USER_KEY, loginUser);
-        return true;
     }
 
     /**
diff --git a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile
index a54f816..6fbee5f 100644
--- a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile
+++ b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile
@@ -1,7 +1,9 @@
+# 璐濆皵瀹為獙瀹� Spring 瀹樻柟鎺ㄨ崘闀滃儚 JDK涓嬭浇鍦板潃 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/monitor/logs
 
diff --git a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile
index 1fda8db..8200c6f 100644
--- a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile
+++ b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile
@@ -1,7 +1,9 @@
+# 璐濆皵瀹為獙瀹� Spring 瀹樻柟鎺ㄨ崘闀滃儚 JDK涓嬭浇鍦板潃 https://bell-sw.com/pages/downloads/
+FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
+#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
 #FROM findepi/graalvm:java17-native
-FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+LABEL maintainer="Lion Li"
 
 RUN mkdir -p /ruoyi/snailjob/logs
 
@@ -10,7 +12,7 @@
 ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m"
 
 EXPOSE 8800
-EXPOSE 1788
+EXPOSE 17888
 
 ADD ./target/ruoyi-snailjob-server.jar ./app.jar
 
diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
index be0b9b4..3c65077 100644
--- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
+++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
@@ -21,7 +21,7 @@
   # 鎷夊彇閲嶈瘯鏁版嵁鐨勬瘡鎵规鐨勫ぇ灏�
   job-pull-page-size: 1000
   # 鏈嶅姟绔痭etty绔彛
-  netty-port: 1788
+  netty-port: 17888
   # 涓�涓鎴风姣忕鏈�澶氭帴鏀剁殑閲嶈瘯鏁伴噺鎸囦护
   limiter: 1000
   # 鍙锋妯″紡涓嬫闀块厤缃�
diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
index 4c69ee7..37ab887 100644
--- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
+++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
@@ -21,7 +21,7 @@
   # 鎷夊彇閲嶈瘯鏁版嵁鐨勬瘡鎵规鐨勫ぇ灏�
   job-pull-page-size: 1000
   # 鏈嶅姟绔� netty 绔彛
-  netty-port: 1788
+  netty-port: 17888
   # 涓�涓鎴风姣忕鏈�澶氭帴鏀剁殑閲嶈瘯鏁伴噺鎸囦护
   limiter: 1000
   # 鍙锋妯″紡涓嬫闀块厤缃�
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java
index fb2aade..b6e51d3 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java
@@ -1,14 +1,15 @@
 package org.dromara.demo.controller.queue;
 
 import cn.dev33.satoken.annotation.SaIgnore;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.redis.utils.QueueUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.redis.utils.QueueUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -42,6 +43,10 @@
         QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> {
             // 瑙傚療鎺ユ敹鏃堕棿
             log.info("閫氶亾: {}, 鏀跺埌鏁版嵁: {}", queueName, orderNum);
+            return CompletableFuture.runAsync(() -> {
+                // 寮傛澶勭悊鏁版嵁閫昏緫 涓嶈鍦ㄤ笂鏂瑰鐞嗕笟鍔¢�昏緫
+                log.info("鏁版嵁澶勭悊: {}", orderNum);
+            });
         }, true);
         return R.ok("鎿嶄綔鎴愬姛");
     }
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java
index ddf68f2..bd94b1c 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java
@@ -55,5 +55,5 @@
         @DataColumn(key = "deptName", value = "dept_id"),
         @DataColumn(key = "userName", value = "user_id")
     })
-    int deleteBatchIds(@Param(Constants.COLL) Collection<?> idList);
+    int deleteByIds(@Param(Constants.COLL) Collection<?> idList);
 }
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java
index b3c6ec2..86b39c2 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java
@@ -101,7 +101,7 @@
         if (isValid) {
             //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
     @Override
diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java
index 463934c..e4e548b 100644
--- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java
@@ -83,6 +83,6 @@
         if (isValid) {
             //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 }
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
index d418815..02a9fa7 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
@@ -165,7 +165,7 @@
     @Override
     public void deleteGenTableByIds(Long[] tableIds) {
         List<Long> ids = Arrays.asList(tableIds);
-        baseMapper.deleteBatchIds(ids);
+        baseMapper.deleteByIds(ids);
         genTableColumnMapper.delete(new LambdaQueryWrapper<GenTableColumn>().in(GenTableColumn::getTableId, ids));
     }
 
@@ -332,7 +332,7 @@
         if (CollUtil.isNotEmpty(delColumns)) {
             List<Long> ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId);
             if (CollUtil.isNotEmpty(ids)) {
-                genTableColumnMapper.deleteBatchIds(ids);
+                genTableColumnMapper.deleteByIds(ids);
             }
         }
     }
diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
index e7236fd..67690ca 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
+++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
@@ -149,6 +149,6 @@
         if(isValid){
             //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java
index 98b76e4..4f5f23f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java
@@ -75,8 +75,6 @@
     public R<Void> add(@Validated @RequestBody SysDeptBo dept) {
         if (!deptService.checkDeptNameUnique(dept)) {
             return R.fail("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
-        } else if (StringUtils.isNotBlank(dept.getDeptCategory()) && !deptService.checkDeptCategoryUnique(dept)) {
-            return R.fail("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄧ被鍒紪鐮佸凡瀛樺湪");
         }
         return toAjax(deptService.insertDept(dept));
     }
@@ -92,8 +90,6 @@
         deptService.checkDeptDataScope(deptId);
         if (!deptService.checkDeptNameUnique(dept)) {
             return R.fail("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
-        } else if (StringUtils.isNotBlank(dept.getDeptCategory()) && !deptService.checkDeptCategoryUnique(dept)) {
-            return R.fail("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄧ被鍒紪鐮佸凡瀛樺湪");
         } else if (dept.getParentId().equals(deptId)) {
             return R.fail("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛屼笂绾ч儴闂ㄤ笉鑳芥槸鑷繁");
         } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())) {
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java
index b2be0e9..ac646c0 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java
@@ -19,13 +19,6 @@
 public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
 
     /**
-     * 鏍规嵁鐢ㄦ埛鎵�鏈夋潈闄�
-     *
-     * @return 鏉冮檺鍒楄〃
-     */
-    List<String> selectMenuPerms();
-
-    /**
      * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃
      *
      * @param queryWrapper 鏌ヨ鏉′欢
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java
index cd984d8..bf16642 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java
@@ -93,14 +93,6 @@
     boolean checkDeptNameUnique(SysDeptBo dept);
 
     /**
-     * 鏍¢獙閮ㄩ棬绫诲埆缂栫爜鏄惁鍞竴
-     *
-     * @param dept 閮ㄩ棬淇℃伅
-     * @return 缁撴灉
-     */
-    boolean checkDeptCategoryUnique(SysDeptBo dept);
-
-    /**
      * 鏍¢獙閮ㄩ棬鏄惁鏈夋暟鎹潈闄�
      *
      * @param deptId 閮ㄩ棬id
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
index 26bc491..1c69243 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java
@@ -146,6 +146,6 @@
         if (isValid) {
             //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java
index bebfdad..46526bd 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java
@@ -178,7 +178,7 @@
             }
             CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey());
         }
-        baseMapper.deleteBatchIds(Arrays.asList(configIds));
+        baseMapper.deleteByIds(Arrays.asList(configIds));
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
index d7ba934..a31c426 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java
@@ -3,14 +3,14 @@
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.dromara.system.domain.SysDept;
-import org.dromara.common.mybatis.helper.DataBaseHelper;
+import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.common.mybatis.helper.DataBaseHelper;
+import org.dromara.system.domain.SysDept;
 import org.dromara.system.domain.SysRoleDept;
 import org.dromara.system.mapper.SysDeptMapper;
 import org.dromara.system.mapper.SysRoleDeptMapper;
 import org.dromara.system.service.ISysDataScopeService;
-import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -30,6 +30,12 @@
     private final SysRoleDeptMapper roleDeptMapper;
     private final SysDeptMapper deptMapper;
 
+    /**
+     * 鑾峰彇瑙掕壊鑷畾涔夋潈闄�
+     *
+     * @param roleId 瑙掕壊Id
+     * @return 閮ㄩ棬Id缁�
+     */
     @Override
     public String getRoleCustom(Long roleId) {
         List<SysRoleDept> list = roleDeptMapper.selectList(
@@ -42,6 +48,12 @@
         return null;
     }
 
+    /**
+     * 鑾峰彇閮ㄩ棬鍙婁互涓嬫潈闄�
+     *
+     * @param deptId 閮ㄩ棬Id
+     * @return 閮ㄩ棬Id缁�
+     */
     @Override
     public String getDeptAndChild(Long deptId) {
         List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>()
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
index cb3f340..5054036 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
@@ -219,20 +219,6 @@
     }
 
     /**
-     * 鏍¢獙閮ㄩ棬绫诲埆缂栫爜鏄惁鍞竴
-     *
-     * @param dept 閮ㄩ棬淇℃伅
-     * @return 缁撴灉
-     */
-    @Override
-    public boolean checkDeptCategoryUnique(SysDeptBo dept) {
-        boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysDept>()
-            .eq(SysDept::getDeptCategory, dept.getDeptCategory())
-            .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId()));
-        return !exist;
-    }
-
-    /**
      * 鏍¢獙閮ㄩ棬鏄惁鏈夋暟鎹潈闄�
      *
      * @param deptId 閮ㄩ棬id
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java
index bc6663f..1be0b7f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java
@@ -141,7 +141,7 @@
             }
             CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType());
         }
-        baseMapper.deleteBatchIds(Arrays.asList(dictIds));
+        baseMapper.deleteByIds(Arrays.asList(dictIds));
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
index 9c930a0..b95baf4 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
@@ -163,7 +163,7 @@
      */
     @Override
     public int deleteLogininforByIds(Long[] infoIds) {
-        return baseMapper.deleteBatchIds(Arrays.asList(infoIds));
+        return baseMapper.deleteByIds(Arrays.asList(infoIds));
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java
index 6e1765b..af844c9 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java
@@ -75,7 +75,7 @@
                 .orderByAsc(SysMenu::getOrderNum));
         } else {
             QueryWrapper<SysMenu> wrapper = Wrappers.query();
-            wrapper.eq("sur.user_id", userId)
+            wrapper.inSql("r.role_id", "select role_id from sys_user_role where user_id = " + userId)
                 .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName())
                 .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible())
                 .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus())
@@ -178,6 +178,7 @@
 
     /**
      * 鏋勫缓鍓嶇璺敱鎵�闇�瑕佺殑鑿滃崟
+     * 璺敱name鍛藉悕瑙勫垯 path棣栧瓧姣嶈浆澶у啓 + id
      *
      * @param menus 鑿滃崟鍒楄〃
      * @return 璺敱鍒楄〃
@@ -186,9 +187,10 @@
     public List<RouterVo> buildMenus(List<SysMenu> menus) {
         List<RouterVo> routers = new LinkedList<>();
         for (SysMenu menu : menus) {
+            String name = menu.getRouteName() + menu.getMenuId();
             RouterVo router = new RouterVo();
             router.setHidden("1".equals(menu.getVisible()));
-            router.setName(menu.getRouteName());
+            router.setName(name);
             router.setPath(menu.getRouterPath());
             router.setComponent(menu.getComponentInfo());
             router.setQuery(menu.getQueryParam());
@@ -199,12 +201,13 @@
                 router.setRedirect("noRedirect");
                 router.setChildren(buildMenus(cMenus));
             } else if (menu.isMenuFrame()) {
+                String frameName = StringUtils.capitalize(menu.getPath()) + menu.getMenuId();
                 router.setMeta(null);
                 List<RouterVo> childrenList = new ArrayList<>();
                 RouterVo children = new RouterVo();
                 children.setPath(menu.getPath());
                 children.setComponent(menu.getComponent());
-                children.setName(StringUtils.capitalize(menu.getPath()));
+                children.setName(frameName);
                 children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
                 children.setQuery(menu.getQueryParam());
                 childrenList.add(children);
@@ -215,9 +218,10 @@
                 List<RouterVo> childrenList = new ArrayList<>();
                 RouterVo children = new RouterVo();
                 String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath());
+                String innerLinkName = StringUtils.capitalize(routerPath) + menu.getMenuId();
                 children.setPath(routerPath);
                 children.setComponent(UserConstants.INNER_LINK);
-                children.setName(StringUtils.capitalize(routerPath));
+                children.setName(innerLinkName);
                 children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath()));
                 childrenList.add(children);
                 router.setChildren(childrenList);
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java
index 18b7a08..db63e61 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java
@@ -119,6 +119,6 @@
      */
     @Override
     public int deleteNoticeByIds(Long[] noticeIds) {
-        return baseMapper.deleteBatchIds(Arrays.asList(noticeIds));
+        return baseMapper.deleteByIds(Arrays.asList(noticeIds));
     }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
index 2a76b82..b78b9dc 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java
@@ -122,7 +122,7 @@
      */
     @Override
     public int deleteOperLogByIds(Long[] operIds) {
-        return baseMapper.deleteBatchIds(Arrays.asList(operIds));
+        return baseMapper.deleteByIds(Arrays.asList(operIds));
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java
index 2ecd592..a1eefce 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java
@@ -135,7 +135,7 @@
             SysOssConfig config = baseMapper.selectById(configId);
             list.add(config);
         }
-        boolean flag = baseMapper.deleteBatchIds(ids) > 0;
+        boolean flag = baseMapper.deleteByIds(ids) > 0;
         if (flag) {
             list.forEach(sysOssConfig ->
                 CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey()));
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
index aa094b2..d167e8d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
@@ -247,7 +247,7 @@
             OssClient storage = OssFactory.instance(sysOss.getService());
             storage.delete(sysOss.getUrl());
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
index 17cd5ca..b8a7e60 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
@@ -202,7 +202,7 @@
                 throw new ServiceException(String.format("%1$s宸插垎閰嶏紝涓嶈兘鍒犻櫎!", post.getPostName()));
             }
         }
-        return baseMapper.deleteBatchIds(Arrays.asList(postIds));
+        return baseMapper.deleteByIds(Arrays.asList(postIds));
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
index abd294f..31f9498 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
@@ -102,14 +102,13 @@
      */
     @Override
     public List<SysRoleVo> selectRolesAuthByUserId(Long userId) {
-        List<SysRoleVo> userRoles = baseMapper.selectRolePermissionByUserId(userId);
+        List<SysRoleVo> userRoles = baseMapper.selectRolesByUserId(userId);
         List<SysRoleVo> roles = selectRoleAll();
+        // 浣跨敤HashSet鎻愰珮鏌ユ壘鏁堢巼
+        Set<Long> userRoleIds = StreamUtils.toSet(userRoles, SysRoleVo::getRoleId);
         for (SysRoleVo role : roles) {
-            for (SysRoleVo userRole : userRoles) {
-                if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) {
-                    role.setFlag(true);
-                    break;
-                }
+            if (userRoleIds.contains(role.getRoleId())) {
+                role.setFlag(true);
             }
         }
         return roles;
@@ -123,7 +122,7 @@
      */
     @Override
     public Set<String> selectRolePermissionByUserId(Long userId) {
-        List<SysRoleVo> perms = baseMapper.selectRolePermissionByUserId(userId);
+        List<SysRoleVo> perms = baseMapper.selectRolesByUserId(userId);
         Set<String> permsSet = new HashSet<>();
         for (SysRoleVo perm : perms) {
             if (ObjectUtil.isNotNull(perm)) {
@@ -417,7 +416,7 @@
         roleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids));
         // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱�
         roleDeptMapper.delete(new LambdaQueryWrapper<SysRoleDept>().in(SysRoleDept::getRoleId, ids));
-        return baseMapper.deleteBatchIds(ids);
+        return baseMapper.deleteByIds(ids);
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java
index f7f8d46..5fd04af 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java
@@ -140,6 +140,6 @@
                 throw new ServiceException("绉熸埛濂楅宸茶浣跨敤");
             }
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
index 516149f..d30750d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
@@ -294,7 +294,7 @@
                 throw new ServiceException("瓒呯绉熸埛涓嶈兘鍒犻櫎");
             }
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
index d8f481d..3cb4159 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
@@ -99,7 +99,7 @@
                 w.in("u.dept_id", ids);
             }).orderByAsc("u.user_id");
         if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
-            wrapper.notIn("u.user_id", StringUtils.splitList(user.getExcludeUserIds()));
+            wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong));
         }
         return wrapper;
     }
@@ -541,7 +541,7 @@
         // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶈〃
         userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().in(SysUserPost::getUserId, ids));
         // 闃叉鏇存柊澶辫触瀵艰嚧鐨勬暟鎹垹闄�
-        int flag = baseMapper.deleteBatchIds(ids);
+        int flag = baseMapper.deleteByIds(ids);
         if (flag < 1) {
             throw new ServiceException("鍒犻櫎鐢ㄦ埛澶辫触!");
         }
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
index fad1812..9dd3f2e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -11,9 +11,8 @@
         select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query_param, m.visible, m.status,
         m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
         from sys_menu m
-        left join sys_role_menu rm on m.menu_id = rm.menu_id
-        left join sys_user_role sur on rm.role_id = sur.role_id
-        left join sys_role ro on sur.role_id = ro.role_id
+            left join sys_role_menu rm on m.menu_id = rm.menu_id
+            left join sys_role r on rm.role_id = r.role_id
         ${ew.getCustomSqlSegment}
     </select>
 
@@ -34,14 +33,10 @@
                         m.order_num,
                         m.create_time
         from sys_menu m
-                 left join sys_role_menu rm on m.menu_id = rm.menu_id
-                 left join sys_user_role sur on rm.role_id = sur.role_id
-                 left join sys_role ro on sur.role_id = ro.role_id
-                 left join sys_user u on sur.user_id = u.user_id
-        where u.user_id = #{userId}
-          and m.menu_type in ('M', 'C')
-          and m.status = '0'
-          and ro.status = '0'
+                 left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
+                 left join sys_role r on rm.role_id = r.role_id and r.status = '0'
+        where m.menu_type in ('M', 'C')
+          and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
         order by m.parent_id, m.order_num
     </select>
 
@@ -57,22 +52,12 @@
         order by m.parent_id, m.order_num
     </select>
 
-    <select id="selectMenuPerms" resultType="String">
-        select distinct m.perms
-        from sys_menu m
-                 left join sys_role_menu rm on m.menu_id = rm.menu_id
-                 left join sys_user_role sur on rm.role_id = sur.role_id
-    </select>
-
     <select id="selectMenuPermsByUserId" parameterType="Long" resultType="String">
         select distinct m.perms
         from sys_menu m
-                 left join sys_role_menu rm on m.menu_id = rm.menu_id
-                 left join sys_user_role sur on rm.role_id = sur.role_id
-                 left join sys_role r on r.role_id = sur.role_id
-        where m.status = '0'
-          and r.status = '0'
-          and sur.user_id = #{userId}
+                 left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
+                 left join sys_role r on r.role_id = rm.role_id and r.status = '0'
+        where r.role_id in (select role_id from sys_user_role where user_id = #{userId})
     </select>
 
     <select id="selectMenuPermsByRoleId" parameterType="Long" resultType="String">
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
index 7b8bba7..4ef7b1e 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -48,9 +48,7 @@
                r.data_scope,
                r.status
         from sys_role r
-                 left join sys_user_role sur on sur.role_id = r.role_id
-                 left join sys_user u on u.user_id = sur.user_id
-        WHERE r.del_flag = '0' and sur.user_id = #{userId}
+        WHERE r.del_flag = '0' and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
     </select>
 
     <select id="selectRoleById" resultMap="SysRoleResult">
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java
index 6773eef..a61daeb 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteSequenceMultiInstanceCmd.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.util.ObjectUtil;
 import lombok.AllArgsConstructor;
+import org.dromara.common.core.utils.StreamUtils;
 import org.flowable.common.engine.impl.interceptor.Command;
 import org.flowable.common.engine.impl.interceptor.CommandContext;
 import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
@@ -59,7 +60,7 @@
         }
         List<Long> userIdList = new ArrayList<>();
         userIds.forEach(e -> {
-            Long userId = assignees.stream().filter(id -> ObjectUtil.equals(id, e)).findFirst().orElse(null);
+            Long userId = StreamUtils.findFirst(assignees, id -> ObjectUtil.equals(id, e));
             if (userId == null) {
                 userIdList.add(e);
             }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
index b833bcc..e22e800 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
@@ -9,6 +9,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.enums.BusinessStatusEnum;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.service.UserService;
 import org.dromara.common.core.utils.StreamUtils;
@@ -17,7 +18,6 @@
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.workflow.common.constant.FlowConstant;
-import org.dromara.common.core.enums.BusinessStatusEnum;
 import org.dromara.workflow.common.enums.TaskStatusEnum;
 import org.dromara.workflow.domain.ActHiProcinst;
 import org.dromara.workflow.domain.bo.ProcessInstanceBo;
@@ -34,7 +34,7 @@
 import org.dromara.workflow.service.IWfTaskBackNodeService;
 import org.dromara.workflow.utils.QueryUtils;
 import org.dromara.workflow.utils.WorkflowUtils;
-import org.flowable.bpmn.model.*;
+import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.engine.*;
 import org.flowable.engine.history.HistoricActivityInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
@@ -57,7 +57,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * 娴佺▼瀹炰緥 鏈嶅姟灞傚疄鐜�
@@ -257,23 +256,23 @@
         List<HistoricActivityInstance> highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
         for (HistoricActivityInstance tempActivity : highLightedFlowList) {
             Map<String, Object> task = new HashMap<>();
-            if (!FlowConstant.SEQUENCE_FLOW.equals(tempActivity.getActivityType()) &&
-                !FlowConstant.PARALLEL_GATEWAY.equals(tempActivity.getActivityType()) &&
-                !FlowConstant.EXCLUSIVE_GATEWAY.equals(tempActivity.getActivityType()) &&
-                !FlowConstant.INCLUSIVE_GATEWAY.equals(tempActivity.getActivityType())
-            ) {
-                task.put("key", tempActivity.getActivityId());
-                task.put("completed", tempActivity.getEndTime() != null);
-                task.put("activityType", tempActivity.getActivityType());
-                taskList.add(task);
+            switch (tempActivity.getActivityType()) {
+                case FlowConstant.SEQUENCE_FLOW, FlowConstant.PARALLEL_GATEWAY,
+                     FlowConstant.EXCLUSIVE_GATEWAY, FlowConstant.INCLUSIVE_GATEWAY -> {}
+                default -> {
+                    task.put("key", tempActivity.getActivityId());
+                    task.put("completed", tempActivity.getEndTime() != null);
+                    task.put("activityType", tempActivity.getActivityType());
+                    taskList.add(task);
+                }
             }
         }
         ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult();
         if (processInstance != null) {
-            taskList = taskList.stream().filter(e -> !e.get("activityType").equals(FlowConstant.END_EVENT)).collect(Collectors.toList());
+            taskList = StreamUtils.filter(taskList, e -> !e.get("activityType").equals(FlowConstant.END_EVENT));
         }
         //鏌ヨ鍑鸿繍琛屼腑鑺傜偣
-        List<Map<String, Object>> runtimeNodeList = taskList.stream().filter(e -> !(Boolean) e.get("completed")).collect(Collectors.toList());
+        List<Map<String, Object>> runtimeNodeList = StreamUtils.filter(taskList, e -> !(Boolean) e.get("completed"));
         if (CollUtil.isNotEmpty(runtimeNodeList)) {
             Iterator<Map<String, Object>> iterator = taskList.iterator();
             while (iterator.hasNext()) {
@@ -389,7 +388,7 @@
             }
             //闄勪欢
             if (CollUtil.isNotEmpty(attachmentList)) {
-                List<Attachment> attachments = attachmentList.stream().filter(e -> e.getTaskId().equals(historicTaskInstance.getId())).collect(Collectors.toList());
+                List<Attachment> attachments = StreamUtils.filter(attachmentList, e -> e.getTaskId().equals(historicTaskInstance.getId()));
                 if (CollUtil.isNotEmpty(attachments)) {
                     actHistoryInfoVo.setAttachmentList(attachments);
                 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
index 6fe0b4e..32e6aec 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
@@ -260,7 +260,8 @@
         String userId = String.valueOf(LoginHelper.getUserId());
         queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus());
         queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId());
-        queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' " + "and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN " + getInParam(roleIds) + " ) ))", userId)));
+        String ids = StreamUtils.join(roleIds, x -> "'" + x + "'");
+        queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN ({1}) ) ))", userId, ids)));
         if (StringUtils.isNotBlank(taskBo.getName())) {
             queryWrapper.like("t.name_", taskBo.getName());
         }
@@ -287,19 +288,6 @@
             }
         }
         return TableDataInfo.build(page);
-    }
-
-    private String getInParam(List<String> param) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("(");
-        for (int i = 0; i < param.size(); i++) {
-            sb.append("'").append(param.get(i)).append("'");
-            if (i != param.size() - 1) {
-                sb.append(",");
-            }
-        }
-        sb.append(")");
-        return sb.toString();
     }
 
     /**
@@ -696,7 +684,7 @@
             if (multiInstance == null && taskList.size() > 1) {
                 List<Task> tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey()));
                 if (CollUtil.isNotEmpty(tasks)) {
-                    actHiTaskinstMapper.deleteBatchIds(StreamUtils.toList(tasks, Task::getId));
+                    actHiTaskinstMapper.deleteByIds(StreamUtils.toList(tasks, Task::getId));
                 }
             }
 
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
index 13a1bb2..a62ce5f 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
@@ -111,7 +111,7 @@
     public Boolean deleteWithValidByIds(Collection<Long> ids) {
         List<String> idList = StreamUtils.toList(ids, String::valueOf);
         workflowService.deleteRunAndHisInstance(idList);
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java
index c5cb288..b498262 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfCategoryServiceImpl.java
@@ -114,7 +114,7 @@
         if (isValid) {
             //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java
index 9478825..ab55ff8 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java
@@ -107,7 +107,7 @@
      */
     @Override
     public Boolean deleteByIds(Collection<Long> ids) {
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
     @Override
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java
index e0850d7..da2e777 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java
@@ -106,6 +106,6 @@
      */
     @Override
     public Boolean deleteByIds(Collection<Long> ids) {
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java
index c677102..2f71482 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java
@@ -50,7 +50,7 @@
      */
     @Override
     public Boolean deleteByIds(Collection<Long> ids) {
-        return baseMapper.deleteBatchIds(ids) > 0;
+        return baseMapper.deleteByIds(ids) > 0;
     }
 
 
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java
index 55d9883..6c255d3 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfTaskBackNodeServiceImpl.java
@@ -6,6 +6,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.workflow.domain.WfTaskBackNode;
@@ -56,7 +57,7 @@
             wfTaskBackNode.setOrderNo(0);
             wfTaskBackNodeMapper.insert(wfTaskBackNode);
         } else {
-            WfTaskBackNode taskNode = list.stream().filter(e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0).findFirst().orElse(null);
+            WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0);
             if (ObjectUtil.isEmpty(taskNode)) {
                 wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1);
                 WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId());
@@ -106,7 +107,7 @@
                     }
                 }
                 if (CollUtil.isNotEmpty(ids)) {
-                    wfTaskBackNodeMapper.deleteBatchIds(ids);
+                    wfTaskBackNodeMapper.deleteByIds(ids);
                 }
             }
             return true;
diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml
index 97024a0..b4f96aa 100644
--- a/script/docker/docker-compose.yml
+++ b/script/docker/docker-compose.yml
@@ -100,7 +100,7 @@
     network_mode: "host"
 
   ruoyi-server1:
-    image: ruoyi/ruoyi-server:5.2.0
+    image: ruoyi/ruoyi-server:5.2.1
     container_name: ruoyi-server1
     environment:
       # 鏃跺尯涓婃捣
@@ -115,7 +115,7 @@
     network_mode: "host"
 
   ruoyi-server2:
-    image: ruoyi/ruoyi-server:5.2.0
+    image: ruoyi/ruoyi-server:5.2.1
     container_name: ruoyi-server2
     environment:
       # 鏃跺尯涓婃捣
@@ -130,7 +130,7 @@
     network_mode: "host"
 
   ruoyi-monitor-admin:
-    image: ruoyi/ruoyi-monitor-admin:5.2.0
+    image: ruoyi/ruoyi-monitor-admin:5.2.1
     container_name: ruoyi-monitor-admin
     environment:
       # 鏃跺尯涓婃捣
@@ -142,14 +142,14 @@
     network_mode: "host"
 
   ruoyi-snailjob-server:
-    image: ruoyi/ruoyi-snailjob-server:5.2.0
+    image: ruoyi/ruoyi-snailjob-server:5.2.1
     container_name: ruoyi-snailjob-server
     environment:
       # 鏃跺尯涓婃捣
       TZ: Asia/Shanghai
     ports:
       - "8800:8800"
-      - "1788:1788"
+      - "17888:17888"
     volumes:
       - /docker/snailjob/logs/:/ruoyi/snailjob/logs
     privileged: true
diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf
index dcc4525..a6fc073 100644
--- a/script/docker/nginx/conf/nginx.conf
+++ b/script/docker/nginx/conf/nginx.conf
@@ -63,7 +63,7 @@
         # }
 
         # 闄愬埗澶栫綉璁块棶鍐呯綉 actuator 鐩稿叧璺緞
-        location ~ ^(/[^/]*)?/actuator(/.*)?$ {
+        location ~ ^(/[^/]*)?/actuator.*(/.*)?$ {
             return 403;
         }
 
diff --git a/script/sql/postgres/flowable.sql b/script/sql/postgres/flowable.sql
index 6e75e4b..8a6078d 100644
--- a/script/sql/postgres/flowable.sql
+++ b/script/sql/postgres/flowable.sql
@@ -39,29 +39,17 @@
 );
 
 comment on table test_leave is '璇峰亣鐢宠琛�';
-
 comment on column test_leave.id is '涓婚敭';
-
 comment on column test_leave.leave_type is '璇峰亣绫诲瀷';
-
 comment on column test_leave.start_date is '寮�濮嬫椂闂�';
-
 comment on column test_leave.end_date is '缁撴潫鏃堕棿';
-
 comment on column test_leave.remark is '璇峰亣鍘熷洜';
-
 comment on column test_leave.status is '鐘舵��';
-
 comment on column test_leave.create_dept is '鍒涘缓閮ㄩ棬';
-
 comment on column test_leave.create_by is '鍒涘缓鑰�';
-
 comment on column test_leave.create_time is '鍒涘缓鏃堕棿';
-
 comment on column test_leave.update_by is '鏇存柊鑰�';
-
 comment on column test_leave.update_time is '鏇存柊鏃堕棿';
-
 comment on column test_leave.tenant_id is '绉熸埛缂栫爜';
 
 alter table test_leave
@@ -86,27 +74,16 @@
 );
 
 comment on table wf_category is '娴佺▼鍒嗙被';
-
 comment on column wf_category.id is '涓婚敭';
-
 comment on column wf_category.category_name is '鍒嗙被鍚嶇О';
-
 comment on column wf_category.category_code is '鍒嗙被缂栫爜';
-
 comment on column wf_category.parent_id is '鐖剁骇id';
-
 comment on column wf_category.sort_num is '鎺掑簭';
-
 comment on column wf_category.tenant_id is '绉熸埛id';
-
 comment on column wf_category.create_dept is '鍒涘缓閮ㄩ棬';
-
 comment on column wf_category.create_by is '鍒涘缓鑰�';
-
 comment on column wf_category.create_time is '鍒涘缓鏃堕棿';
-
 comment on column wf_category.update_by is '淇敼鑰�';
-
 comment on column wf_category.update_time is '淇敼鏃堕棿';
 
 alter table wf_category
@@ -137,31 +114,18 @@
 );
 
 comment on table wf_task_back_node is '鑺傜偣瀹℃壒璁板綍';
-
 comment on column wf_task_back_node.id is '涓婚敭';
-
 comment on column wf_task_back_node.node_id is '鑺傜偣id';
-
 comment on column wf_task_back_node.node_name is '鑺傜偣鍚嶇О';
-
 comment on column wf_task_back_node.order_no is '鎺掑簭';
-
 comment on column wf_task_back_node.instance_id is '娴佺▼瀹炰緥id';
-
 comment on column wf_task_back_node.task_type is '鑺傜偣绫诲瀷';
-
 comment on column wf_task_back_node.assignee is '瀹℃壒浜�';
-
 comment on column wf_task_back_node.tenant_id is '绉熸埛id';
-
 comment on column wf_task_back_node.create_dept is '鍒涘缓閮ㄩ棬';
-
 comment on column wf_task_back_node.create_by is '鍒涘缓鑰�';
-
 comment on column wf_task_back_node.create_time is '鍒涘缓鏃堕棿';
-
 comment on column wf_task_back_node.update_by is '淇敼鑰�';
-
 comment on column wf_task_back_node.update_time is '淇敼鏃堕棿';
 
 alter table wf_task_back_node
@@ -177,6 +141,7 @@
     process_key   varchar(255) not null,
     version       bigint       not null,
     tenant_id     varchar(20),
+    remark        varchar(500),
     create_dept   bigint,
     create_by     bigint,
     create_time   timestamp,
@@ -185,27 +150,17 @@
 );
 
 comment on table wf_definition_config is '娴佺▼瀹氫箟閰嶇疆';
-
 comment on column wf_definition_config.id is '涓婚敭';
-
 comment on column wf_definition_config.table_name is '琛ㄥ悕';
-
 comment on column wf_definition_config.definition_id is '娴佺▼瀹氫箟ID';
-
 comment on column wf_definition_config.process_key is '娴佺▼KEY';
-
 comment on column wf_definition_config.version is '娴佺▼鐗堟湰';
-
 comment on column wf_definition_config.tenant_id is '绉熸埛id';
-
+comment on column wf_definition_config.remark is '澶囨敞';
 comment on column wf_definition_config.create_dept is '鍒涘缓閮ㄩ棬';
-
 comment on column wf_definition_config.create_by is '鍒涘缓鑰�';
-
 comment on column wf_definition_config.create_time is '鍒涘缓鏃堕棿';
-
 comment on column wf_definition_config.update_by is '淇敼鑰�';
-
 comment on column wf_definition_config.update_time is '淇敼鏃堕棿';
 
 alter table wf_definition_config
@@ -231,27 +186,16 @@
 );
 
 comment on table wf_form_manage is '琛ㄥ崟绠$悊';
-
 comment on column wf_form_manage.id is '涓婚敭';
-
 comment on column wf_form_manage.form_name is '琛ㄥ崟鍚嶇О';
-
 comment on column wf_form_manage.form_type is '琛ㄥ崟绫诲瀷';
-
 comment on column wf_form_manage.router is '璺敱鍦板潃/琛ㄥ崟ID';
-
 comment on column wf_form_manage.remark is '澶囨敞';
-
 comment on column wf_form_manage.tenant_id is '绉熸埛id';
-
 comment on column wf_form_manage.create_dept is '鍒涘缓閮ㄩ棬';
-
 comment on column wf_form_manage.create_by is '鍒涘缓鑰�';
-
 comment on column wf_form_manage.create_time is '鍒涘缓鏃堕棿';
-
 comment on column wf_form_manage.update_by is '淇敼鑰�';
-
 comment on column wf_form_manage.update_time is '淇敼鏃堕棿';
 
 insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '璇峰亣鐢宠', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, now(), 1, now());
@@ -276,31 +220,18 @@
 );
 
 comment on table wf_node_config is '鑺傜偣閰嶇疆';
-
 comment on column wf_node_config.id is '涓婚敭';
-
 comment on column wf_node_config.form_id is '琛ㄥ崟id';
-
 comment on column wf_node_config.form_type is '琛ㄥ崟绫诲瀷';
-
 comment on column wf_node_config.node_id is '鑺傜偣id';
-
 comment on column wf_node_config.node_name is '鑺傜偣鍚嶇О';
-
 comment on column wf_node_config.definition_id is '娴佺▼瀹氫箟id';
-
 comment on column wf_node_config.apply_user_task is '鏄惁涓虹敵璇蜂汉鑺傜偣 锛�0鏄� 1鍚︼級';
-
 comment on column wf_node_config.tenant_id is '绉熸埛id';
-
 comment on column wf_node_config.create_dept is '鍒涘缓閮ㄩ棬';
-
 comment on column wf_node_config.create_by is '鍒涘缓鑰�';
-
 comment on column wf_node_config.create_time is '鍒涘缓鏃堕棿';
-
 comment on column wf_node_config.update_by is '淇敼鑰�';
-
 comment on column wf_node_config.update_time is '淇敼鏃堕棿';
 
 INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '璇峰亣鐢宠', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, now(), NULL, NULL, '璇峰亣鐢宠鑿滃崟');

--
Gitblit v1.9.3