Yue 11 месяцев назад
Родитель
Сommit
bb5af0cbcd
48 измененных файлов с 402 добавлено и 283 удалено
  1. 2 1
      .gitignore
  2. 21 32
      SERVER/VberAdminPlusV3/pom.xml
  3. 2 2
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application-dev.yml
  4. 2 2
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application-prod.yml
  5. 5 4
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml
  6. 63 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/exception/SseException.java
  7. 45 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/TreeBuildUtils.java
  8. 1 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/sql/SqlUtil.java
  9. 6 6
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/core/EncryptorManager.java
  10. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/filter/CryptoFilter.java
  11. 1 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-log/src/main/java/com/vber/common/log/aspect/LogAspect.java
  12. 9 21
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/core/mapper/BaseMapperPlus.java
  13. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/PlusDataPermissionHandler.java
  14. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/helper/DataBaseHelper.java
  15. 16 5
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/core/OssClient.java
  16. 4 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/manager/CaffeineCacheDecorator.java
  17. 1 12
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/CacheUtils.java
  18. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/RedisUtils.java
  19. 12 3
      SERVER/VberAdminPlusV3/vber-common/vber-common-security/src/main/java/com/vber/common/security/config/SecurityConfig.java
  20. 27 22
      SERVER/VberAdminPlusV3/vber-common/vber-common-sse/src/main/java/com/vber/common/sse/core/SseEmitterManager.java
  21. 2 0
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/handle/TenantKeyPrefixHandler.java
  22. 1 7
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/helper/TenantHelper.java
  23. 0 13
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/pom.xml
  24. 6 15
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/config/FilterConfig.java
  25. 6 7
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/config/properties/XssProperties.java
  26. 4 7
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/filter/XssFilter.java
  27. 29 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/filter/XssHttpServletRequestWrapper.java
  28. 18 13
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/handler/GlobalExceptionHandler.java
  29. 6 3
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/interceptor/PlusWebInvokeTimeInterceptor.java
  30. 2 2
      SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/resources/application-dev.yml
  31. 2 2
      SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/resources/application-prod.yml
  32. 4 4
      SERVER/VberAdminPlusV3/vber-extend/vber-monitor-admin/src/main/resources/application.yml
  33. 3 3
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/constant/GenConstants.java
  34. 8 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenTableMapper.java
  35. 2 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/listener/SysUserImportListener.java
  36. 13 24
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysOperLogServiceImpl.java
  37. 31 26
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysTenantServiceImpl.java
  38. 3 0
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/ActTaskServiceImpl.java
  39. 10 5
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/LeaveApplyServiceImpl.java
  40. 5 5
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/WfDefinitionConfigServiceImpl.java
  41. 9 9
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/WfFormManageServiceImpl.java
  42. 11 10
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/WorkflowServiceImpl.java
  43. 3 6
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml
  44. BIN
      SERVER/VberAdminPlusV3/vber/profile/upload/avatar/2024/04/16/bbab/a4b5/520f/5b05/91d7/5a88/fdad/b443/8a76/3ce6/bbaba4b5520f5b0591d75a88fdadb4438a763ce6
  45. BIN
      SERVER/VberAdminPlusV3/vber/profile/upload/avatar/2024/04/29/339d/1db9/6eeb/0dab/fa6b/4ab6/49d7/126a/4b89/ebff/339d1db96eeb0dabfa6b4ab649d7126a4b89ebff
  46. BIN
      SERVER/VberAdminPlusV3/vber/profile/upload/jpg/2024/04/15/c147/8be3/38aa/2b50/2609/462d/9ac7/7de8/b5ec/cfde/c1478be338aa2b502609462d9ac77de8b5eccfde
  47. BIN
      SERVER/VberAdminPlusV3/vber/profile/upload/jpg/2024/04/29/4d00/844c/1451/f961/9b06/a99b/27c3/ca8f/5c2b/2b14/4d00844c1451f9619b06a99b27c3ca8f5c2b2b14
  48. BIN
      SERVER/VberAdminPlusV3/vber/profile/upload/temp/24042918094066710777.temp

+ 2 - 1
.gitignore

@@ -66,4 +66,5 @@ build/
 /UI/**/dist.rar
 
 *.flattened-pom.xml
-/SERVER/VberAdminPlusV3/vber
+/SERVER/VberAdminPlusV3/vber/profile/
+/SERVER/VberAdminPlusV3/vber/profile

+ 21 - 32
SERVER/VberAdminPlusV3/pom.xml

@@ -22,42 +22,40 @@
         <java.version>17</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <spring-boot.version>3.2.9</spring-boot.version>
+        <spring-boot.version>3.2.11</spring-boot.version>
         <spring-boot-admin.version>3.2.3</spring-boot-admin.version>
         <mybatis.version>3.5.16</mybatis.version>
-        <mybatis-plus.version>3.5.7</mybatis-plus.version>
+        <mybatis-plus.version>3.5.8</mybatis-plus.version>
         <dynamic-ds.version>4.3.1</dynamic-ds.version>
         <shardingsphere.version>5.5.0</shardingsphere.version>
         <springdoc.version>2.6.0</springdoc.version>
         <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
-        <redisson.version>3.34.1</redisson.version>
+        <redisson.version>3.37.0</redisson.version>
         <xxl-job.version>2.4.1</xxl-job.version>
         <poi.version>5.2.3</poi.version>
-        <easyexcel.version>4.0.2</easyexcel.version>
+        <easyexcel.version>4.0.3</easyexcel.version>
         <velocity.version>2.3</velocity.version>
         <satoken.version>1.39.0</satoken.version>
         <p6spy.version>3.9.1</p6spy.version>
         <hutool.version>5.8.31</hutool.version>
-        <okhttp.version>4.10.0</okhttp.version>
         <lock4j.version>2.2.7</lock4j.version>
-        <mapstruct-plus.version>1.4.4</mapstruct-plus.version>
+        <mapstruct-plus.version>1.4.5</mapstruct-plus.version>
         <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
         <lombok.version>1.18.34</lombok.version>
         <bouncycastle.version>1.76</bouncycastle.version>
         <justauth.version>1.16.6</justauth.version>
         <!-- 离线IP地址定位库 -->
         <ip2region.version>2.7.0</ip2region.version>
-        <undertow.version>2.3.15.Final</undertow.version>
 
         <!-- OSS 配置 -->
-        <aws.sdk.version>2.23.0</aws.sdk.version>
-        <aws.crt.version>0.29.6</aws.crt.version>
+        <aws.sdk.version>2.28.22</aws.sdk.version>
+        <aws.crt.version>0.31.3</aws.crt.version>
         <!-- SMS 配置 -->
-        <sms4j.version>3.3.2</sms4j.version>
+        <sms4j.version>3.3.3</sms4j.version>
         <!-- 限制框架中的fastjson版本 -->
         <fastjson.version>1.2.83</fastjson.version>
         <!-- 面向运行时的D-ORM依赖 -->
-        <anyline.version>8.7.2-20240808</anyline.version>
+        <anyline.version>8.7.2-20241022</anyline.version>
 
         <!-- 插件版本 -->
         <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
@@ -77,6 +75,8 @@
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
                 <profiles.active>local</profiles.active>
                 <logging.level>info</logging.level>
+                <monitor.username>vber</monitor.username>
+                <monitor.password>vb123456</monitor.password>
             </properties>
         </profile>
         <profile>
@@ -85,6 +85,8 @@
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
                 <profiles.active>dev</profiles.active>
                 <logging.level>info</logging.level>
+                <monitor.username>vber</monitor.username>
+                <monitor.password>vb123456</monitor.password>
             </properties>
             <activation>
                 <!-- 默认环境 -->
@@ -96,6 +98,8 @@
             <properties>
                 <profiles.active>prod</profiles.active>
                 <logging.level>warn</logging.level>
+                <monitor.username>vber</monitor.username>
+                <monitor.password>vb123456</monitor.password>
             </properties>
         </profile>
     </profiles>
@@ -227,12 +231,6 @@
                 <version>${p6spy.version}</version>
             </dependency>
 
-            <dependency>
-                <groupId>com.squareup.okhttp3</groupId>
-                <artifactId>okhttp</artifactId>
-                <version>${okhttp.version}</version>
-            </dependency>
-
             <!--  AWS SDK for Java 2.x  -->
             <dependency>
                 <groupId>software.amazon.awssdk</groupId>
@@ -263,6 +261,12 @@
                 <version>${spring-boot-admin.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>2.15.0</version>
+            </dependency>
+
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>fastjson</artifactId>
@@ -325,21 +329,6 @@
                 <version>${ip2region.version}</version>
             </dependency>
 
-            <dependency>
-                <groupId>io.undertow</groupId>
-                <artifactId>undertow-core</artifactId>
-                <version>${undertow.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.undertow</groupId>
-                <artifactId>undertow-servlet</artifactId>
-                <version>${undertow.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.undertow</groupId>
-                <artifactId>undertow-websockets-jsr</artifactId>
-                <version>${undertow.version}</version>
-            </dependency>
 
             <!--短信sms4j-->
             <dependency>

+ 2 - 2
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application-dev.yml

@@ -105,8 +105,8 @@ spring.boot.admin.client:
     metadata:
       username: ${spring.boot.admin.client.username}
       userpassword: ${spring.boot.admin.client.password}
-  username: vber
-  password: 123456
+  username: @monitor.username@
+  password: @monitor.password@
 
 --- # xxl-job 配置
 xxl.job:

+ 2 - 2
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application-prod.yml

@@ -95,8 +95,8 @@ spring.boot.admin.client:
     metadata:
       username: ${spring.boot.admin.client.username}
       userpassword: ${spring.boot.admin.client.password}
-  username: vber
-  password: 123456
+  username: @monitor.username@
+  password: @monitor.password@
 
 --- # xxl-job 配置
 xxl.job:

+ 5 - 4
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml

@@ -227,10 +227,11 @@ springdoc:
 xss:
   # 过滤开关
   enabled: true
-  # 排除链接(多个用逗号分隔)
-  excludes: /system/notice
-  # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
+  # 排除链接
+  excludeUrls:
+    - /system/notice
+    - /workflow/model/save
+    - /workflow/model/editModelXml
 
 # 全局线程池相关配置
 # 如使用JDK21请直接使用虚拟线程 不要开启此配置

+ 63 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/exception/SseException.java

@@ -0,0 +1,63 @@
+package com.vber.common.core.exception;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * sse 特制异常
+ *
+ * @author LionLi
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public final class SseException extends RuntimeException {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    private Integer code;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误明细,内部调试错误
+     */
+    private String detailMessage;
+
+    public SseException(String message) {
+        this.message = message;
+    }
+
+    public SseException(String message, Integer code) {
+        this.message = message;
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public SseException setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public SseException setDetailMessage(String detailMessage) {
+        this.detailMessage = detailMessage;
+        return this;
+    }
+}

+ 45 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/TreeBuildUtils.java

@@ -10,6 +10,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 扩展 hutool TreeUtil 封装系统树构建
@@ -24,12 +26,54 @@ public class TreeBuildUtils extends TreeUtil {
      */
     public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");
 
+    /**
+     * 构建树形结构
+     *
+     * @param <T>        输入节点的类型
+     * @param <K>        节点ID的类型
+     * @param list       节点列表,其中包含了要构建树形结构的所有节点
+     * @param nodeParser 解析器,用于将输入节点转换为树节点
+     * @return 构建好的树形结构列表
+     */
     public static <T, K> List<Tree<K>> build(List<T> list, NodeParser<T, K> nodeParser) {
         if (CollUtil.isEmpty(list)) {
-            return null;
+            return CollUtil.newArrayList();
         }
         K k = ReflectUtils.invokeGetter(list.get(0), "parentId");
         return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser);
     }
 
+    /**
+     * 获取节点列表中所有节点的叶子节点
+     *
+     * @param <K>   节点ID的类型
+     * @param nodes 节点列表
+     * @return 包含所有叶子节点的列表
+     */
+    public static <K> List<Tree<K>> getLeafNodes(List<Tree<K>> nodes) {
+        if (CollUtil.isEmpty(nodes)) {
+            return CollUtil.newArrayList();
+        }
+        return nodes.stream()
+                .flatMap(TreeBuildUtils::extractLeafNodes)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 获取指定节点下的所有叶子节点
+     *
+     * @param <K>  节点ID的类型
+     * @param node 要查找叶子节点的根节点
+     * @return 包含所有叶子节点的列表
+     */
+    private static <K> Stream<Tree<K>> extractLeafNodes(Tree<K> node) {
+        if (!node.hasChild()) {
+            return Stream.of(node);
+        } else {
+            // 递归调用,获取所有子节点的叶子节点
+            return node.getChildren().stream()
+                    .flatMap(TreeBuildUtils::extractLeafNodes);
+        }
+    }
+
 }

+ 1 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/sql/SqlUtil.java

@@ -16,6 +16,7 @@ public class SqlUtil {
      * 定义常用的 sql关键字
      */
     public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
+   
     /**
      * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
      */

+ 6 - 6
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/core/EncryptorManager.java

@@ -36,8 +36,7 @@ public class EncryptorManager {
     /**
      * 缓存加密器
      */
-    Map<EncryptContext, IEncryptor> encryptorMap = new ConcurrentHashMap<>();
-
+    Map<Integer, IEncryptor> encryptorMap = new ConcurrentHashMap<>();
     /**
      * 类加密字段缓存
      */
@@ -69,11 +68,12 @@ public class EncryptorManager {
      * @param encryptContext 加密执行者需要的相关配置参数
      */
     public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) {
-        if (encryptorMap.containsKey(encryptContext)) {
-            return encryptorMap.get(encryptContext);
+        int key = encryptContext.hashCode();
+        if (encryptorMap.containsKey(key)) {
+            return encryptorMap.get(key);
         }
         IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext);
-        encryptorMap.put(encryptContext, encryptor);
+        encryptorMap.put(key, encryptor);
         return encryptor;
     }
 
@@ -83,7 +83,7 @@ public class EncryptorManager {
      * @param encryptContext 加密执行者需要的相关配置参数
      */
     public void removeEncryptor(EncryptContext encryptContext) {
-        this.encryptorMap.remove(encryptContext);
+        this.encryptorMap.remove(encryptContext.hashCode());
     }
 
     /**

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/src/main/java/com/vber/common/encrypt/filter/CryptoFilter.java

@@ -98,7 +98,7 @@ public class CryptoFilter implements Filter {
                 }
             }
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            return null;
         }
         return null;
     }

+ 1 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-log/src/main/java/com/vber/common/log/aspect/LogAspect.java

@@ -159,8 +159,7 @@ public class LogAspect {
     private void setRequestValue(JoinPoint joinPoint, OperLogEvent operLog, String[] excludeParamNames) throws Exception {
         Map<String, String> paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
         String requestMethod = operLog.getRequestMethod();
-        if (MapUtil.isEmpty(paramsMap)
-                && HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
+        if (MapUtil.isEmpty(paramsMap) && StringUtils.equalsAny(requestMethod, HttpMethod.PUT.name(), HttpMethod.POST.name(), HttpMethod.DELETE.name())) {
             String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames);
             operLog.setOperParam(StringUtils.substring(params, 0, 2000));
         } else {

+ 9 - 21
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/core/mapper/BaseMapperPlus.java

@@ -67,9 +67,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 插入操作是否成功的布尔值
      */
     default boolean insertBatch(Collection<T> entityList) {
-        Db.saveBatch(entityList);
-        // 临时解决 新版本 mp 插入状态判断错误问题
-        return true;
+        return Db.saveBatch(entityList);
     }
 
     /**
@@ -79,9 +77,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 更新操作是否成功的布尔值
      */
     default boolean updateBatchById(Collection<T> entityList) {
-        Db.updateBatchById(entityList);
-        // 临时解决 新版本 mp 插入状态判断错误问题
-        return true;
+        return Db.updateBatchById(entityList);
     }
 
     /**
@@ -91,9 +87,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 插入或更新操作是否成功的布尔值
      */
     default boolean insertOrUpdateBatch(Collection<T> entityList) {
-        Db.saveOrUpdateBatch(entityList);
-        // 临时解决 新版本 mp 插入状态判断错误问题
-        return true;
+        return Db.saveOrUpdateBatch(entityList);
     }
 
     /**
@@ -104,9 +98,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 插入操作是否成功的布尔值
      */
     default boolean insertBatch(Collection<T> entityList, int batchSize) {
-        Db.saveBatch(entityList, batchSize);
-        // 临时解决 新版本 mp 插入状态判断错误问题
-        return true;
+        return Db.saveBatch(entityList, batchSize);
     }
 
     /**
@@ -117,9 +109,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 更新操作是否成功的布尔值
      */
     default boolean updateBatchById(Collection<T> entityList, int batchSize) {
-        Db.updateBatchById(entityList, batchSize);
-        // 临时解决 新版本 mp 插入状态判断错误问题
-        return true;
+        return Db.updateBatchById(entityList, batchSize);
     }
 
     /**
@@ -130,9 +120,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 插入或更新操作是否成功的布尔值
      */
     default boolean insertOrUpdateBatch(Collection<T> entityList, int batchSize) {
-        Db.saveOrUpdateBatch(entityList, batchSize);
-        // 临时解决 新版本 mp 插入状态判断错误问题
-        return true;
+        return Db.saveOrUpdateBatch(entityList, batchSize);
     }
 
     /**
@@ -167,8 +155,8 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @param idList 主键ID集合
      * @return 查询到的VO对象列表
      */
-    default List<V> selectVoBatchIds(Collection<? extends Serializable> idList) {
-        return selectVoBatchIds(idList, this.currentVoClass());
+    default List<V> selectVoByIds(Collection<? extends Serializable> idList) {
+        return selectVoByIds(idList, this.currentVoClass());
     }
 
     /**
@@ -179,7 +167,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @param <C>     VO类的类型
      * @return 查询到的VO对象列表,经过转换为指定的VO类后返回
      */
-    default <C> List<C> selectVoBatchIds(Collection<? extends Serializable> idList, Class<C> voClass) {
+    default <C> List<C> selectVoByIds(Collection<? extends Serializable> idList, Class<C> voClass) {
         List<T> list = this.selectBatchIds(idList);
         if (CollUtil.isEmpty(list)) {
             return CollUtil.newArrayList();

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/handler/PlusDataPermissionHandler.java

@@ -17,8 +17,8 @@ import com.vber.common.satoken.utils.LoginHelper;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.Parenthesis;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import org.apache.ibatis.io.Resources;
 import org.springframework.context.ConfigurableApplicationContext;
@@ -107,7 +107,7 @@ public class PlusDataPermissionHandler {
         try {
             Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql);
             // 数据权限使用单独的括号 防止与其他条件冲突
-            Parenthesis parenthesis = new Parenthesis(expression);
+            ParenthesedExpressionList<Expression> parenthesis = new ParenthesedExpressionList<>(expression);
             if (ObjectUtil.isNotNull(where)) {
                 return new AndExpression(where, parenthesis);
             } else {

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/src/main/java/com/vber/common/mybatis/helper/DataBaseHelper.java

@@ -62,8 +62,8 @@ public class DataBaseHelper {
             // charindex(',100,' , ',0,100,101,') <> 0
             return "charindex(',%s,' , ','+%s+',') <> 0".formatted(var, var2);
         } else if (dataBasyType == DataBaseType.POSTGRE_SQL) {
-            // (select position(',100,' in ',0,100,101,')) <> 0
-            return "(select position(',%s,' in ','||%s||',')) <> 0".formatted(var, var2);
+            // (select strpos(',0,100,101,' , ',100,')) <> 0
+            return "(select strpos(','||%s||',' , ',%s,')) <> 0".formatted(var2, var);
         } else if (dataBasyType == DataBaseType.ORACLE) {
             // instr(',0,100,101,' , ',100,') <> 0
             return "instr(','||%s||',' , ',%s,') <> 0".formatted(var2, var);

+ 16 - 5
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/src/main/java/com/vber/common/oss/core/OssClient.java

@@ -19,12 +19,12 @@ import lombok.extern.slf4j.Slf4j;
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
 import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
 import software.amazon.awssdk.core.ResponseInputStream;
-import software.amazon.awssdk.core.async.AsyncRequestBody;
 import software.amazon.awssdk.core.async.AsyncResponseTransformer;
 import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody;
 import software.amazon.awssdk.regions.Region;
 import software.amazon.awssdk.services.s3.S3AsyncClient;
 import software.amazon.awssdk.services.s3.S3Configuration;
+import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration;
 import software.amazon.awssdk.services.s3.model.GetObjectResponse;
 import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
 import software.amazon.awssdk.services.s3.model.S3Exception;
@@ -88,7 +88,8 @@ public class OssClient {
                 StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(
                         AwsBasicCredentials.create(properties.getAccessKey(), properties.getSecretKey()));
                 //MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问
-                boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
+//                boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
+                boolean isStyle = true;
                 //创建AWS基于 CRT 的 S3 客户端
                 client = S3AsyncClient.crtBuilder()
                         .credentialsProvider(credentialsProvider)
@@ -98,6 +99,9 @@ public class OssClient {
                         .minimumPartSizeInBytes(10 * 1025 * 1024L)
                         .checksumValidationEnabled(false)
                         .forcePathStyle(isStyle)
+                        .httpConfiguration(S3CrtHttpConfiguration.builder()
+                                .connectionTimeout(Duration.ofSeconds(60)) // 设置连接超时
+                                .build())
                         .build();
                 //AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端
                 transferManager = S3TransferManager.builder().s3Client(client).build();
@@ -191,7 +195,9 @@ public class OssClient {
                                                 .key(key)
                                                 .contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null)
                                                 .contentType(contentType)
-                                                .acl(getAccessPolicy().getObjectCannedACL())
+                                                // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同,
+                                                // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置)
+                                                //.acl(getAccessPolicy().getObjectCannedACL())
                                                 .build())
                                 .addTransferListener(LoggingTransferListener.create())
                                 .source(filePath).build());
@@ -237,7 +243,10 @@ public class OssClient {
         } else {
             try {
                 // 创建异步请求体(length如果为空会报错)
-                BlockingInputStreamAsyncRequestBody body = AsyncRequestBody.forBlockingInputStream(length);
+                BlockingInputStreamAsyncRequestBody body = BlockingInputStreamAsyncRequestBody.builder()
+                        .contentLength(length)
+                        .subscribeTimeout(Duration.ofSeconds(30))
+                        .build();
                 // 使用 transferManager 进行上传
                 Upload upload = transferManager.upload(
                         x -> x.requestBody(body)
@@ -245,7 +254,9 @@ public class OssClient {
                                         y -> y.bucket(properties.getBucketName())
                                                 .key(key)
                                                 .contentType(contentType)
-                                                .acl(getAccessPolicy().getObjectCannedACL())
+                                                // 用于设置对象的访问控制列表(ACL)。不同云厂商对ACL的支持和实现方式有所不同,
+                                                // 因此根据具体的云服务提供商,你可能需要进行不同的配置(自行开启,阿里云有acl权限配置,腾讯云没有acl权限配置)
+                                                //.acl(getAccessPolicy().getObjectCannedACL())
                                                 .build())
                                 .build());
 

+ 4 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/manager/CaffeineCacheDecorator.java

@@ -44,6 +44,7 @@ public class CaffeineCacheDecorator implements Cache {
     }
 
     @SuppressWarnings("unchecked")
+    @Override
     public <T> T get(Object key, Class<T> type) {
         Object o = CAFFEINE.get(getUniqueKey(key), k -> cache.get(key, type));
         return (T) o;
@@ -55,6 +56,7 @@ public class CaffeineCacheDecorator implements Cache {
         cache.put(key, value);
     }
 
+    @Override
     public ValueWrapper putIfAbsent(Object key, Object value) {
         CAFFEINE.invalidate(getUniqueKey(key));
         return cache.putIfAbsent(key, value);
@@ -65,6 +67,7 @@ public class CaffeineCacheDecorator implements Cache {
         evictIfPresent(key);
     }
 
+    @Override
     public boolean evictIfPresent(Object key) {
         boolean b = cache.evictIfPresent(key);
         if (b) {
@@ -78,6 +81,7 @@ public class CaffeineCacheDecorator implements Cache {
         cache.clear();
     }
 
+    @Override
     public boolean invalidate() {
         return cache.invalidate();
     }

+ 1 - 12
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/CacheUtils.java

@@ -3,15 +3,13 @@ package com.vber.common.redis.utils;
 import com.vber.common.core.utils.SpringUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.redisson.api.RMap;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 
 import java.util.Objects;
-import java.util.Set;
 
 /**
- * 缓存操作工具类 {@link }
+ * 缓存操作工具类
  *
  * @author Iwb
  */
@@ -21,15 +19,6 @@ public class CacheUtils {
 
     private static final CacheManager CACHE_MANAGER = SpringUtils.getBean(CacheManager.class);
 
-    /**
-     * 获取缓存组内所有的KEY
-     *
-     * @param cacheNames 缓存组名称
-     */
-    public static Set<Object> keys(String cacheNames) {
-        RMap<Object, Object> rmap = (RMap<Object, Object>) Objects.requireNonNull(CACHE_MANAGER.getCache(cacheNames)).getNativeCache();
-        return rmap.keySet();
-    }
 
     /**
      * 获取缓存值

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/utils/RedisUtils.java

@@ -517,7 +517,7 @@ public class RedisUtils {
     }
 
     /**
-     * 获得缓存的基本对象列表
+     * 获得缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id)
      *
      * @param pattern 字符串前缀
      * @return 对象列表
@@ -528,7 +528,7 @@ public class RedisUtils {
     }
 
     /**
-     * 删除缓存的基本对象列表
+     * 删除缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id)
      *
      * @param pattern 字符串前缀
      */

+ 12 - 3
SERVER/VberAdminPlusV3/vber-common/vber-common-security/src/main/java/com/vber/common/security/config/SecurityConfig.java

@@ -8,12 +8,14 @@ import cn.dev33.satoken.router.SaRouter;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.util.SaResult;
 import com.vber.common.core.constant.HttpStatus;
+import com.vber.common.core.exception.SseException;
 import com.vber.common.core.utils.ServletUtils;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.satoken.utils.LoginHelper;
 import com.vber.common.security.config.properties.SecurityProperties;
 import com.vber.common.security.handler.AllUrlHandler;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -52,11 +54,18 @@ public class SecurityConfig implements WebMvcConfigurer {
                             .match(allUrlHandler.getUrls())
                             // 对未排除的路径进行检查
                             .check(() -> {
-                                // 检查是否登录 是否有token
-                                StpUtil.checkLogin();
+                                HttpServletRequest request = ServletUtils.getRequest();
+                                try {
+                                    // 检查是否登录 是否有token
+                                    StpUtil.checkLogin();
+                                } catch (NotLoginException e) {
+                                    if (request != null && request.getRequestURI().contains("sse")) {
+                                        throw new SseException(e.getMessage(), e.getCode());
+                                    }
+                                }
 
                                 // 检查 header 与 param 里的 clientid 与 token 里的是否一致
-                                String headerCid = Objects.requireNonNull(ServletUtils.getRequest()).getHeader(LoginHelper.CLIENT_KEY);
+                                String headerCid = Objects.requireNonNull(request).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)) {

+ 27 - 22
SERVER/VberAdminPlusV3/vber-common/vber-common-sse/src/main/java/com/vber/common/sse/core/SseEmitterManager.java

@@ -1,14 +1,11 @@
 package com.vber.common.sse.core;
 
-import cn.hutool.core.collection.CollUtil;
 import com.vber.common.redis.utils.RedisUtils;
 import com.vber.common.sse.dto.SseMessageDto;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Consumer;
@@ -124,25 +121,33 @@ public class SseEmitterManager {
      * @param sseMessageDto 要发布的SSE消息对象
      */
     public void publishMessage(SseMessageDto sseMessageDto) {
-        List<Long> unsentUserIds = new ArrayList<>();
-        // 当前服务内用户,直接发送消息
-        for (Long userId : sseMessageDto.getUserIds()) {
-            if (USER_TOKEN_EMITTERS.containsKey(userId)) {
-                sendMessage(userId, sseMessageDto.getMessage());
-                continue;
-            }
-            unsentUserIds.add(userId);
-        }
-        // 不在当前服务内用户,发布订阅消息
-        if (CollUtil.isNotEmpty(unsentUserIds)) {
-            SseMessageDto broadcastMessage = new SseMessageDto();
-            broadcastMessage.setMessage(sseMessageDto.getMessage());
-            broadcastMessage.setUserIds(unsentUserIds);
-            RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
-                log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}",
-                        SSE_TOPIC, unsentUserIds, sseMessageDto.getMessage());
-            });
-        }
+//        List<Long> unsentUserIds = new ArrayList<>();
+//        // 当前服务内用户,直接发送消息
+//        for (Long userId : sseMessageDto.getUserIds()) {
+//            if (USER_TOKEN_EMITTERS.containsKey(userId)) {
+//                sendMessage(userId, sseMessageDto.getMessage());
+//                continue;
+//            }
+//            unsentUserIds.add(userId);
+//        }
+//        // 不在当前服务内用户,发布订阅消息
+//        if (CollUtil.isNotEmpty(unsentUserIds)) {
+//            SseMessageDto broadcastMessage = new SseMessageDto();
+//            broadcastMessage.setMessage(sseMessageDto.getMessage());
+//            broadcastMessage.setUserIds(unsentUserIds);
+//            RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
+//                log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}",
+//                        SSE_TOPIC, unsentUserIds, sseMessageDto.getMessage());
+//            });
+//        }
+        // 一个用户不同token连接不同服务导致发送不到问题(改为全局发送)
+        SseMessageDto broadcastMessage = new SseMessageDto();
+        broadcastMessage.setMessage(sseMessageDto.getMessage());
+        broadcastMessage.setUserIds(sseMessageDto.getUserIds());
+        RedisUtils.publish(SSE_TOPIC, broadcastMessage, consumer -> {
+            log.info("SSE发送主题订阅消息topic:{} session keys:{} message:{}",
+                    SSE_TOPIC, sseMessageDto.getUserIds(), sseMessageDto.getMessage());
+        });
     }
 
     /**

+ 2 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/handle/TenantKeyPrefixHandler.java

@@ -36,6 +36,7 @@ public class TenantKeyPrefixHandler extends KeyPrefixHandler {
         String tenantId = TenantHelper.getTenantId();
         if (StringUtils.isBlank(tenantId)) {
             log.error("无法获取有效的租户id -> Null");
+            return super.map(name);
         }
         if (StringUtils.startsWith(name, tenantId)) {
             // 如果存在则直接返回
@@ -62,6 +63,7 @@ public class TenantKeyPrefixHandler extends KeyPrefixHandler {
         String tenantId = TenantHelper.getTenantId();
         if (StringUtils.isBlank(tenantId)) {
             log.error("无法获取有效的租户ID -> Null");
+            return super.map(name);
         }
         if (StringUtils.startsWith(unmap, tenantId)) {
             // 如果存在则删除

+ 1 - 7
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/helper/TenantHelper.java

@@ -1,6 +1,5 @@
 package com.vber.common.tenant.helper;
 
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
@@ -231,12 +230,7 @@ public class TenantHelper {
 
 
     private static boolean isNotLogin() {
-        try {
-            StpUtil.checkLogin();
-            return false;
-        } catch (Exception e) {
-            return true;
-        }
+        return !LoginHelper.isLogin();
     }
 
 }

+ 0 - 13
SERVER/VberAdminPlusV3/vber-common/vber-common-web/pom.xml

@@ -47,19 +47,6 @@
             <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>io.undertow</groupId>
-            <artifactId>undertow-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.undertow</groupId>
-            <artifactId>undertow-servlet</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.undertow</groupId>
-            <artifactId>undertow-websockets-jsr</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>

+ 6 - 15
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/config/FilterConfig.java

@@ -1,6 +1,5 @@
 package com.vber.common.web.config;
 
-import com.vber.common.core.utils.StringUtils;
 import com.vber.common.web.config.properties.XssProperties;
 import com.vber.common.web.filter.RepeatableFilter;
 import com.vber.common.web.filter.XssFilter;
@@ -11,9 +10,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * Filter配置
  *
@@ -23,26 +19,21 @@ import java.util.Map;
 @EnableConfigurationProperties(XssProperties.class)
 public class FilterConfig {
 
-    @SuppressWarnings({"rawtypes", "unchecked"})
     @Bean
     @ConditionalOnProperty(value = "xss.enabled", havingValue = "true")
-    public FilterRegistrationBean xssFilterRegistration(XssProperties xssProperties) {
-        FilterRegistrationBean registration = new FilterRegistrationBean();
+    public FilterRegistrationBean<XssFilter> xssFilterRegistration() {
+        FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
         registration.setDispatcherTypes(DispatcherType.REQUEST);
         registration.setFilter(new XssFilter());
-        registration.addUrlPatterns(StringUtils.split(xssProperties.getUrlPatterns(), StringUtils.SEPARATOR));
+        registration.addUrlPatterns("/*");
         registration.setName("xssFilter");
-        registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);
-        Map<String, String> initParameters = new HashMap<>();
-        initParameters.put("excludes", xssProperties.getExcludes());
-        registration.setInitParameters(initParameters);
+        registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE + 1);
         return registration;
     }
 
-    @SuppressWarnings({"rawtypes", "unchecked"})
     @Bean
-    public FilterRegistrationBean someFilterRegistration() {
-        FilterRegistrationBean registration = new FilterRegistrationBean();
+    public FilterRegistrationBean<RepeatableFilter> someFilterRegistration() {
+        FilterRegistrationBean<RepeatableFilter> registration = new FilterRegistrationBean<>();
         registration.setFilter(new RepeatableFilter());
         registration.addUrlPatterns("/*");
         registration.setName("repeatableFilter");

+ 6 - 7
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/config/properties/XssProperties.java

@@ -3,6 +3,9 @@ package com.vber.common.web.config.properties;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * xss过滤 配置属性
  *
@@ -15,16 +18,12 @@ public class XssProperties {
     /**
      * 过滤开关
      */
-    private String enabled;
+    private Boolean enabled;
 
     /**
-     * 排除链接(多个用逗号分隔)
+     * 排除链接
      */
-    private String excludes;
+    private List<String> excludeUrls = new ArrayList<>();
 
-    /**
-     * 匹配链接
-     */
-    private String urlPatterns;
 
 }

+ 4 - 7
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/filter/XssFilter.java

@@ -1,6 +1,8 @@
 package com.vber.common.web.filter;
 
+import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
+import com.vber.common.web.config.properties.XssProperties;
 import jakarta.servlet.*;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -23,13 +25,8 @@ public class XssFilter implements Filter {
 
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
-        String tempExcludes = filterConfig.getInitParameter("excludes");
-        if (StringUtils.isNotEmpty(tempExcludes)) {
-            String[] url = tempExcludes.split(StringUtils.SEPARATOR);
-            for (int i = 0; url != null && i < url.length; i++) {
-                excludes.add(url[i]);
-            }
-        }
+        XssProperties properties = SpringUtils.getBean(XssProperties.class);
+        excludes.addAll(properties.getExcludeUrls());
     }
 
     @Override

+ 29 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/filter/XssHttpServletRequestWrapper.java

@@ -14,6 +14,7 @@ import org.springframework.http.MediaType;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.Map;
 
 /**
  * XSS过滤处理
@@ -28,6 +29,33 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
         super(request);
     }
 
+    @Override
+    public String getParameter(String name) {
+        String value = super.getParameter(name);
+        if (value != null) {
+            return HtmlUtil.cleanHtmlTag(value).trim();
+        }
+        return value;
+    }
+
+    @Override
+    public Map<String, String[]> getParameterMap() {
+        Map<String, String[]> valueMap = super.getParameterMap();
+        for (Map.Entry<String, String[]> entry : valueMap.entrySet()) {
+            String[] values = entry.getValue();
+            if (values != null) {
+                int length = values.length;
+                String[] escapseValues = new String[length];
+                for (int i = 0; i < length; i++) {
+                    // 防xss攻击和过滤前后空格
+                    escapseValues[i] = HtmlUtil.cleanHtmlTag(values[i]).trim();
+                }
+                valueMap.put(entry.getKey(), escapseValues);
+            }
+        }
+        return valueMap;
+    }
+
     @Override
     public String[] getParameterValues(String name) {
         String[] values = super.getParameterValues(name);
@@ -40,7 +68,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
             }
             return escapseValues;
         }
-        return super.getParameterValues(name);
+        return values;
     }
 
     @Override

+ 18 - 13
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/handler/GlobalExceptionHandler.java

@@ -4,9 +4,10 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpStatus;
 import com.vber.common.core.domain.R;
 import com.vber.common.core.exception.ServiceException;
+import com.vber.common.core.exception.SseException;
 import com.vber.common.core.exception.base.BaseException;
 import com.vber.common.core.utils.StreamUtils;
-import com.vber.common.core.utils.StringUtils;
+import com.vber.common.json.utils.JsonUtils;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.ConstraintViolation;
@@ -18,12 +19,11 @@ import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.MissingPathVariableException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 import org.springframework.web.servlet.NoHandlerFoundException;
 
-import java.util.Objects;
-
 /**
  * 全局异常处理器
  *
@@ -38,15 +38,20 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(ServletException.class)
     public R<Void> handleServletException(ServletException e, HttpServletRequest request) {
-        if (StringUtils.contains(e.getMessage(), "NotLoginException")) {
-            String requestURI = request.getRequestURI();
-            log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage());
-            return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源");
-        } else {
-            String requestURI = request.getRequestURI();
-            log.error("请求地址'{}',发生未知异常.", requestURI, e);
-            return R.fail(e.getMessage());
-        }
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',发生未知异常.", requestURI, e);
+        return R.fail(e.getMessage());
+    }
+
+    /**
+     * 认证失败
+     */
+    @ResponseStatus(org.springframework.http.HttpStatus.UNAUTHORIZED)
+    @ExceptionHandler(SseException.class)
+    public String handleNotLoginException(SseException e, HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage());
+        return JsonUtils.toJsonString(R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源"));
     }
 
     /**
@@ -155,7 +160,7 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(MethodArgumentNotValidException.class)
     public R<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
         log.error(e.getMessage());
-        String message = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage();
+        String message = StreamUtils.join(e.getBindingResult().getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, ", ");
         return R.fail(message);
     }
 

+ 6 - 3
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/interceptor/PlusWebInvokeTimeInterceptor.java

@@ -2,6 +2,7 @@ package com.vber.common.web.interceptor;
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.vber.common.core.constant.GlobalConstants;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.json.utils.JsonUtils;
@@ -69,9 +70,11 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
         StopWatch stopWatch = KEY_CACHE.get();
-        stopWatch.stop();
-        log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
-        KEY_CACHE.remove();
+        if (ObjectUtil.isNotNull(stopWatch)) {
+            stopWatch.stop();
+            log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
+            KEY_CACHE.remove();
+        }
     }
 
     /**

+ 2 - 2
SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/resources/application-dev.yml

@@ -8,8 +8,8 @@ spring.boot.admin.client:
     metadata:
       username: ${spring.boot.admin.client.username}
       userpassword: ${spring.boot.admin.client.password}
-  username: vber
-  password: 123456
+  username: @monitor.username@
+  password: @monitor.password@
 
 --- # 数据库配置
 spring:

+ 2 - 2
SERVER/VberAdminPlusV3/vber-extend/vber-job-admin/src/main/resources/application-prod.yml

@@ -8,8 +8,8 @@ spring.boot.admin.client:
     metadata:
       username: ${spring.boot.admin.client.username}
       userpassword: ${spring.boot.admin.client.password}
-  username: vber
-  password: 123456
+  username: @monitor.username@
+  password: @monitor.password@
 
 --- # 数据库配置
 spring:

+ 4 - 4
SERVER/VberAdminPlusV3/vber-extend/vber-monitor-admin/src/main/resources/application.yml

@@ -13,8 +13,8 @@ logging:
 spring:
   security:
     user:
-      name: vber
-      password: 123456
+      name: @monitor.username@
+      password: @monitor.password@
   boot:
     admin:
       ui:
@@ -44,5 +44,5 @@ spring.boot.admin.client:
     metadata:
       username: ${spring.boot.admin.client.username}
       userpassword: ${spring.boot.admin.client.password}
-  username: vber
-  password: 123456
+  username: @monitor.username@
+  password: @monitor.password@

+ 3 - 3
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/constant/GenConstants.java

@@ -56,13 +56,13 @@ public interface GenConstants {
      * 数据库时间类型
      */
     String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval",
-            "smalldatetime", "datetime2", "datetimeoffset"};
+            "smalldatetime", "datetime2", "datetimeoffset", "timestamptz"};
 
     /**
      * 数据库数字类型
      */
-    String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer",
-            "bit", "bigint", "float", "double", "decimal", "numeric", "real", "double precision",
+    String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer",
+            "bit", "bigint", "float", "float4", "float8", "double", "decimal", "numeric", "real", "double precision",
             "smallserial", "serial", "bigserial", "money", "smallmoney"};
 
     /**

+ 8 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenTableMapper.java

@@ -41,6 +41,14 @@ public interface GenTableMapper extends BaseMapperPlus<GenTable, GenTable> {
      */
     GenTable selectGenTableByName(String tableName);
 
+    /**
+     * 查询指定数据源下的所有表名列表
+     *
+     * @param dataName 数据源名称,用于选择不同的数据源
+     * @return 当前数据库中的表名列表
+     * <p>
+     * 使用默认数据源执行查询操作
+     */
     @DS("")
     List<String> selectTableNameList(String dataName);
 }

+ 2 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/listener/SysUserImportListener.java

@@ -3,6 +3,7 @@ package com.vber.system.listener;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.digest.BCrypt;
+import cn.hutool.http.HtmlUtil;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
 import com.vber.common.core.exception.ServiceException;
@@ -81,7 +82,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
             }
         } catch (Exception e) {
             failureNum++;
-            String msg = "<br/>" + failureNum + "、账号 " + userVo.getUserName() + " 导入失败:";
+            String msg = "<br/>" + failureNum + "、账号 " + HtmlUtil.cleanHtmlTag(userVo.getUserName()) + " 导入失败:";
             String message = e.getMessage();
             if (e instanceof ConstraintViolationException cvException) {
                 message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", ");

+ 13 - 24
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysOperLogServiceImpl.java

@@ -51,8 +51,18 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
 
     @Override
     public TableDataInfo<SysOperLogVo> selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysOperLog> lqw = buildQueryWrapper(operLog);
+        if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
+            pageQuery.setOrderByColumn("oper_id");
+            pageQuery.setIsAsc("desc");
+        }
+        Page<SysOperLogVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(page);
+    }
+
+    private LambdaQueryWrapper<SysOperLog> buildQueryWrapper(SysOperLogBo operLog) {
         Map<String, Object> params = operLog.getParams();
-        LambdaQueryWrapper<SysOperLog> lqw = new LambdaQueryWrapper<SysOperLog>()
+        return new LambdaQueryWrapper<SysOperLog>()
                 .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp())
                 .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle())
                 .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0,
@@ -67,12 +77,6 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
                 .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName())
                 .between(StringUtils.isNotEmpty(params.get("beginTime")) && StringUtils.isNotEmpty(params.get("endTime")),
                         SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime"));
-        if (StringUtils.isBlank(pageQuery.getOrderByColumn())) {
-            pageQuery.setOrderByColumn("oper_id");
-            pageQuery.setIsAsc("desc");
-        }
-        Page<SysOperLogVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(page);
     }
 
     /**
@@ -95,23 +99,8 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
      */
     @Override
     public List<SysOperLogVo> selectOperLogList(SysOperLogBo operLog) {
-        Map<String, Object> params = operLog.getParams();
-        return baseMapper.selectVoList(new LambdaQueryWrapper<SysOperLog>()
-                .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp())
-                .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle())
-                .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0,
-                        SysOperLog::getBusinessType, operLog.getBusinessType())
-                .func(f -> {
-                    if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) {
-                        f.in(SysOperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes()));
-                    }
-                })
-                .eq(operLog.getStatus() != null && operLog.getStatus() > 0,
-                        SysOperLog::getStatus, operLog.getStatus())
-                .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName())
-                .between(StringUtils.isNotEmpty(params.get("beginTime")) && StringUtils.isNotEmpty(params.get("endTime")),
-                        SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime"))
-                .orderByDesc(SysOperLog::getOperId));
+        LambdaQueryWrapper<SysOperLog> lqw = buildQueryWrapper(operLog);
+        return baseMapper.selectVoList(lqw.orderByDesc(SysOperLog::getOperId));
     }
 
     /**

+ 31 - 26
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysTenantServiceImpl.java

@@ -1,6 +1,7 @@
 package com.vber.system.service.impl;
 
 import cn.dev33.satoken.secure.BCrypt;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
@@ -211,7 +212,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         String numbers = RandomUtil.randomNumbers(6);
         // 判断是否存在,如果存在则重新生成
         if (tenantIds.contains(numbers)) {
-            generateTenantId(tenantIds);
+            return generateTenantId(tenantIds);
         }
         return numbers;
     }
@@ -276,7 +277,9 @@ public class SysTenantServiceImpl implements ISysTenantService {
     @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId")
     @Override
     public int updateTenantStatus(SysTenantBo bo) {
-        SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class);
+        SysTenant tenant = new SysTenant();
+        tenant.setId(bo.getId());
+        tenant.setStatus(bo.getStatus());
         return baseMapper.updateById(tenant);
     }
 
@@ -380,9 +383,6 @@ public class SysTenantServiceImpl implements ISysTenantService {
         return true;
     }
 
-    /**
-     * 同步租户字典
-     */
     /**
      * 同步租户字典
      */
@@ -424,43 +424,48 @@ public class SysTenantServiceImpl implements ISysTenantService {
                     Map<String, SysDictData> map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue);
                     for (SysDictData dictData : dataList) {
                         if (!map.containsKey(dictData.getDictValue())) {
+                            SysDictData data = BeanUtil.toBean(dictData, SysDictData.class);
                             // 设置字典编码为 null
-                            dictData.setDictCode(null);
-                            dictData.setTenantId(tenantId);
-                            dictData.setCreateTime(null);
-                            dictData.setUpdateTime(null);
+                            data.setDictCode(null);
+                            data.setTenantId(tenantId);
+                            data.setCreateTime(null);
+                            data.setUpdateTime(null);
                             set.add(tenantId);
-                            saveDataList.add(dictData);
+                            saveDataList.add(data);
                         }
                     }
                 } else {
-                    dictType.setDictId(null);
-                    dictType.setTenantId(tenantId);
-                    dictType.setCreateTime(null);
-                    dictType.setUpdateTime(null);
+                    SysDictType type = BeanUtil.toBean(dictType, SysDictType.class);
+                    type.setDictId(null);
+                    type.setTenantId(tenantId);
+                    type.setCreateTime(null);
+                    type.setUpdateTime(null);
                     set.add(tenantId);
-                    saveTypeList.add(dictType);
+                    saveTypeList.add(type);
                     if (CollUtil.isNotEmpty(dataList)) {
                         // 筛选出 dictType 对应的 data
                         for (SysDictData dictData : dataList) {
+                            SysDictData data = BeanUtil.toBean(dictData, SysDictData.class);
                             // 设置字典编码为 null
-                            dictData.setDictCode(null);
-                            dictData.setTenantId(tenantId);
-                            dictData.setCreateTime(null);
-                            dictData.setUpdateTime(null);
+                            data.setDictCode(null);
+                            data.setTenantId(tenantId);
+                            data.setCreateTime(null);
+                            data.setUpdateTime(null);
                             set.add(tenantId);
+                            saveDataList.add(data);
                         }
-                        saveDataList.addAll(dataList);
                     }
                 }
             }
         }
-        if (CollUtil.isNotEmpty(saveTypeList)) {
-            dictTypeMapper.insertBatch(saveTypeList);
-        }
-        if (CollUtil.isNotEmpty(saveDataList)) {
-            dictDataMapper.insertBatch(saveDataList);
-        }
+        TenantHelper.ignore(() -> {
+            if (CollUtil.isNotEmpty(saveTypeList)) {
+                dictTypeMapper.insertBatch(saveTypeList);
+            }
+            if (CollUtil.isNotEmpty(saveDataList)) {
+                dictDataMapper.insertBatch(saveDataList);
+            }
+        });
         for (String tenantId : set) {
             TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT));
         }

+ 3 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/ActTaskServiceImpl.java

@@ -277,6 +277,7 @@ public class ActTaskServiceImpl implements IActTaskService {
         if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) {
             queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey());
         }
+        queryWrapper.orderByDesc("t.CREATE_TIME_");
         Page<TaskVo> page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
 
         List<TaskVo> taskList = page.getRecords();
@@ -366,6 +367,7 @@ public class ActTaskServiceImpl implements IActTaskService {
         queryWrapper.like(StringUtils.isNotBlank(taskBo.getProcessDefinitionName()), "t.processDefinitionName", taskBo.getProcessDefinitionName());
         queryWrapper.eq(StringUtils.isNotBlank(taskBo.getProcessDefinitionKey()), "t.processDefinitionKey", taskBo.getProcessDefinitionKey());
         queryWrapper.eq("t.assignee_", userId);
+        queryWrapper.orderByDesc("t.START_TIME_");
         Page<TaskVo> page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
 
         List<TaskVo> taskList = page.getRecords();
@@ -402,6 +404,7 @@ public class ActTaskServiceImpl implements IActTaskService {
             queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey());
         }
         queryWrapper.eq("t.assignee_", userId);
+        queryWrapper.orderByDesc("t.START_TIME_");
         Page<TaskVo> page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper);
 
         List<TaskVo> taskList = page.getRecords();

+ 10 - 5
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/LeaveApplyServiceImpl.java

@@ -144,11 +144,16 @@ public class LeaveApplyServiceImpl implements ILeaveApplyService {
      *
      * @param processTaskEvent 参数
      */
-    @EventListener(condition = "#processTaskEvent.key=='leave1' && #processTaskEvent.taskDefinitionKey=='Activity_14633hx'")
+    @EventListener(condition = "#processTaskEvent.key.startsWith('leave')")
     public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
-        log.info("当前任务执行了{}", processTaskEvent.toString());
-        WfiLeaveApply testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey()));
-        testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus());
-        baseMapper.updateById(testLeave);
+        // 所有demo案例的申请人节点id
+        String[] ids = {"Activity_14633hx", "Activity_19b1i4j", "Activity_0uscrk3",
+                "Activity_0uscrk3", "Activity_0x6b71j", "Activity_0zy3g6j", "Activity_06a55t0"};
+        if (StringUtils.equalsAny(processTaskEvent.getTaskDefinitionKey(), ids)) {
+            log.info("当前任务执行了{}", processTaskEvent.toString());
+            WfiLeaveApply testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey()));
+            testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus());
+            baseMapper.updateById(testLeave);
+        }
     }
 }

+ 5 - 5
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/WfDefinitionConfigServiceImpl.java

@@ -1,19 +1,19 @@
 package com.vber.workflow.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import com.vber.common.core.utils.MapstructUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import lombok.RequiredArgsConstructor;
+import com.vber.common.core.utils.MapstructUtils;
 import com.vber.workflow.domain.WfDefinitionConfig;
 import com.vber.workflow.domain.bo.WfDefinitionConfigBo;
 import com.vber.workflow.domain.vo.WfDefinitionConfigVo;
+import com.vber.workflow.mapper.WfDefinitionConfigMapper;
 import com.vber.workflow.service.IWfDefinitionConfigService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
-import com.vber.workflow.mapper.WfDefinitionConfigMapper;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
 import java.util.Collection;
+import java.util.List;
 
 /**
  * 流程定义配置Service业务层处理
@@ -96,7 +96,7 @@ public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService
         baseMapper.delete(new LambdaQueryWrapper<WfDefinitionConfig>().eq(WfDefinitionConfig::getTableName, bo.getTableName()));
         add.setTableName(add.getTableName().toLowerCase());
         boolean flag = baseMapper.insertOrUpdate(add);
-        if (baseMapper.insertOrUpdate(add)) {
+        if (flag) {
             bo.setId(add.getId());
         }
         return flag;

+ 9 - 9
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/WfFormManageServiceImpl.java

@@ -1,23 +1,23 @@
 package com.vber.workflow.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.vber.common.core.utils.MapstructUtils;
 import com.vber.common.core.utils.StringUtils;
-import com.vber.common.mybatis.core.page.TableDataInfo;
 import com.vber.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import lombok.RequiredArgsConstructor;
+import com.vber.common.mybatis.core.page.TableDataInfo;
 import com.vber.workflow.common.enums.FormTypeEnum;
-import org.springframework.stereotype.Service;
+import com.vber.workflow.domain.WfFormManage;
 import com.vber.workflow.domain.bo.WfFormManageBo;
 import com.vber.workflow.domain.vo.WfFormManageVo;
-import com.vber.workflow.domain.WfFormManage;
 import com.vber.workflow.mapper.WfFormManageMapper;
 import com.vber.workflow.service.IWfFormManageService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
 
-import java.util.List;
 import java.util.Collection;
+import java.util.List;
 
 /**
  * 表单管理Service业务层处理
@@ -41,7 +41,7 @@ public class WfFormManageServiceImpl implements IWfFormManageService {
 
     @Override
     public List<WfFormManageVo> queryByIds(List<Long> ids) {
-        return baseMapper.selectVoBatchIds(ids);
+        return baseMapper.selectVoByIds(ids);
     }
 
     /**

+ 11 - 10
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/service/impl/WorkflowServiceImpl.java

@@ -7,7 +7,7 @@ import com.vber.workflow.service.IActHiProcinstService;
 import com.vber.workflow.service.IActProcessInstanceService;
 import com.vber.workflow.utils.WorkflowUtils;
 import lombok.RequiredArgsConstructor;
-import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -23,10 +23,11 @@ import java.util.Map;
 @Service
 public class WorkflowServiceImpl implements WorkflowService {
     @Autowired(required = false)
-    private RuntimeService runtimeService;
+    private TaskService taskService;
 
-    private final IActProcessInstanceService iActProcessInstanceService;
-    private final IActHiProcinstService iActHiProcinstService;
+
+    private final IActProcessInstanceService actProcessInstanceService;
+    private final IActHiProcinstService actHiProcinstService;
 
     /**
      * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
@@ -36,7 +37,7 @@ public class WorkflowServiceImpl implements WorkflowService {
      */
     @Override
     public boolean deleteRunAndHisInstance(List<String> businessKeys) {
-        return iActProcessInstanceService.deleteRunAndHisInstance(businessKeys);
+        return actProcessInstanceService.deleteRunAndHisInstance(businessKeys);
     }
 
     /**
@@ -68,7 +69,7 @@ public class WorkflowServiceImpl implements WorkflowService {
      */
     @Override
     public void setVariable(String taskId, String variableName, Object value) {
-        runtimeService.setVariable(taskId, variableName, value);
+        taskService.setVariable(taskId, variableName, value);
     }
 
     /**
@@ -79,7 +80,7 @@ public class WorkflowServiceImpl implements WorkflowService {
      */
     @Override
     public void setVariables(String taskId, Map<String, Object> variables) {
-        runtimeService.setVariables(taskId, variables);
+        taskService.setVariables(taskId, variables);
     }
 
     /**
@@ -91,7 +92,7 @@ public class WorkflowServiceImpl implements WorkflowService {
      */
     @Override
     public void setVariableLocal(String taskId, String variableName, Object value) {
-        runtimeService.setVariableLocal(taskId, variableName, value);
+        taskService.setVariableLocal(taskId, variableName, value);
     }
 
     /**
@@ -102,7 +103,7 @@ public class WorkflowServiceImpl implements WorkflowService {
      */
     @Override
     public void setVariablesLocal(String taskId, Map<String, Object> variables) {
-        runtimeService.setVariablesLocal(taskId, variables);
+        taskService.setVariablesLocal(taskId, variables);
     }
 
     /**
@@ -113,7 +114,7 @@ public class WorkflowServiceImpl implements WorkflowService {
      */
     @Override
     public String getInstanceIdByBusinessKey(String businessKey) {
-        ActHiProcinst actHiProcinst = iActHiProcinstService.selectByBusinessKey(businessKey);
+        ActHiProcinst actHiProcinst = actHiProcinstService.selectByBusinessKey(businessKey);
         if (actHiProcinst == null) {
             return StrUtil.EMPTY;
         }

+ 3 - 6
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml

@@ -40,8 +40,7 @@
               FROM ACT_RU_TASK RES
                        INNER JOIN ACT_HI_PROCINST AHP ON RES.PROC_INST_ID_ = AHP.PROC_INST_ID_
                        INNER JOIN ACT_RE_PROCDEF ARP ON ARP.ID_ = RES.PROC_DEF_ID_
-              WHERE RES.PARENT_TASK_ID_ IS NULL
-              ORDER BY RES.CREATE_TIME_ DESC) t ${ew.getCustomSqlSegment}
+              WHERE RES.PARENT_TASK_ID_ IS NULL) t ${ew.getCustomSqlSegment}
     </select>
 
     <select id="getTaskFinishByPage" resultMap="TaskVoResult">
@@ -56,8 +55,7 @@
                        INNER JOIN ACT_HI_PROCINST AHP ON HTI.PROC_INST_ID_ = AHP.PROC_INST_ID_
                        INNER JOIN ACT_RE_PROCDEF ARP ON ARP.ID_ = HTI.PROC_DEF_ID_
               WHERE HTI.PARENT_TASK_ID_ IS NULL
-                AND HTI.END_TIME_ IS NOT NULL
-              ORDER BY HTI.START_TIME_ DESC) t ${ew.getCustomSqlSegment}
+                AND HTI.END_TIME_ IS NOT NULL) t ${ew.getCustomSqlSegment}
     </select>
 
     <select id="getTaskCopyByPage" resultMap="TaskVoResult">
@@ -72,7 +70,6 @@
                        INNER JOIN ACT_HI_PROCINST AHP ON AHT.PROC_INST_ID_ = AHP.PROC_INST_ID_
                        INNER JOIN ACT_RE_PROCDEF ARP ON ARP.ID_ = AHT.PROC_DEF_ID_
               WHERE AHT.PARENT_TASK_ID_ IS NOT NULL
-                AND AHT.scope_type_ = 'copy'
-              ORDER BY AHT.START_TIME_ DESC) t ${ew.getCustomSqlSegment}
+                AND AHT.scope_type_ = 'copy') t ${ew.getCustomSqlSegment}
     </select>
 </mapper>

BIN
SERVER/VberAdminPlusV3/vber/profile/upload/avatar/2024/04/16/bbab/a4b5/520f/5b05/91d7/5a88/fdad/b443/8a76/3ce6/bbaba4b5520f5b0591d75a88fdadb4438a763ce6


BIN
SERVER/VberAdminPlusV3/vber/profile/upload/avatar/2024/04/29/339d/1db9/6eeb/0dab/fa6b/4ab6/49d7/126a/4b89/ebff/339d1db96eeb0dabfa6b4ab649d7126a4b89ebff


BIN
SERVER/VberAdminPlusV3/vber/profile/upload/jpg/2024/04/15/c147/8be3/38aa/2b50/2609/462d/9ac7/7de8/b5ec/cfde/c1478be338aa2b502609462d9ac77de8b5eccfde


BIN
SERVER/VberAdminPlusV3/vber/profile/upload/jpg/2024/04/29/4d00/844c/1451/f961/9b06/a99b/27c3/ca8f/5c2b/2b14/4d00844c1451f9619b06a99b27c3ca8f5c2b2b14


BIN
SERVER/VberAdminPlusV3/vber/profile/upload/temp/24042918094066710777.temp