Pārlūkot izejas kodu

Update 优化代码

Yue 1 nedēļu atpakaļ
vecāks
revīzija
e9118f6a3b
25 mainītis faili ar 134 papildinājumiem un 98 dzēšanām
  1. 1 1
      SERVER/VberAdminPlusV3/.script/docker/sql/init.sql
  2. 1 1
      SERVER/VberAdminPlusV3/.script/sql/admin.sql
  3. 2 2
      SERVER/VberAdminPlusV3/pom.xml
  4. 3 3
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages.properties
  5. 3 3
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages_zh_CN.properties
  6. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/CompleteTaskDTO.java
  7. 1 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/UserDTO.java
  8. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/ConfigService.java
  9. 2 2
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/validate/JsonPattern.java
  10. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/validate/JsonPatternValidator.java
  11. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/validate/JsonType.java
  12. 45 28
      SERVER/VberAdminPlusV3/vber-common/vber-common-mail/src/main/java/com/vber/common/mail/utils/MailUtils.java
  13. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/manager/PlusSpringCacheManager.java
  14. 1 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/core/I18nLocaleResolver.java
  15. 41 22
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/handler/GlobalExceptionHandler.java
  16. 4 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/controller/GenController.java
  17. 1 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/SysOssExt.java
  18. 2 7
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/SysUser.java
  19. 1 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/bo/SysUserBo.java
  20. 2 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysUserExportVo.java
  21. 2 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysUserImportVo.java
  22. 1 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysUserVo.java
  23. 2 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/ISysUserService.java
  24. 1 1
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysUserServiceImpl.java
  25. 12 9
      SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/listener/WorkflowGlobalListener.java

+ 1 - 1
SERVER/VberAdminPlusV3/.script/docker/sql/init.sql

@@ -45,7 +45,7 @@ CREATE TABLE sys_user
     sex         CHAR(1)      DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
     avatar      BIGINT(20) COMMENT '头像地址',
     password    VARCHAR(100) DEFAULT '' COMMENT '密码',
-    status      CHAR(1)      DEFAULT '0' COMMENT '号状态(0正常 1停用)',
+    status      CHAR(1)      DEFAULT '0' COMMENT '号状态(0正常 1停用)',
     del_flag    CHAR(1)      DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
     login_ip    VARCHAR(128) DEFAULT '' COMMENT '最后登录IP',
     login_date  DATETIME COMMENT '最后登录时间',

+ 1 - 1
SERVER/VberAdminPlusV3/.script/sql/admin.sql

@@ -46,7 +46,7 @@ CREATE TABLE sys_user
     sex         CHAR(1)      DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
     avatar      BIGINT(20) COMMENT '头像地址',
     password    VARCHAR(100) DEFAULT '' COMMENT '密码',
-    status      CHAR(1)      DEFAULT '0' COMMENT '号状态(0正常 1停用)',
+    status      CHAR(1)      DEFAULT '0' COMMENT '号状态(0正常 1停用)',
     del_flag    CHAR(1)      DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
     login_ip    VARCHAR(128) DEFAULT '' COMMENT '最后登录IP',
     login_date  DATETIME COMMENT '最后登录时间',

+ 2 - 2
SERVER/VberAdminPlusV3/pom.xml

@@ -22,7 +22,7 @@
         <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.5.8</spring-boot.version>
+        <spring-boot.version>3.5.9</spring-boot.version>
         <spring-boot-admin.version>3.5.5</spring-boot-admin.version>
         <springdoc.version>2.8.14</springdoc.version>
         <mybatis.version>3.5.16</mybatis.version>
@@ -54,7 +54,7 @@
         <!-- 限制框架中的fastjson版本 -->
         <fastjson.version>1.2.83</fastjson.version>
         <!-- 面向运行时的D-ORM依赖 -->
-        <anyline.version>8.7.2-20250603</anyline.version>
+        <anyline.version>8.7.3-20251210</anyline.version>
 
         <!-- 工作流配置 -->
         <warm-flow.version>1.8.1</warm-flow.version>

+ 3 - 3
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages.properties

@@ -5,7 +5,7 @@ user.jcaptcha.expire=验证码已失效
 user.not.exists=对不起, 您的账号:{0} 不存在.
 user.password.not.match=用户不存在/密码错误
 user.password.retry.limit.count=密码输入错误{0}次
-user.password.retry.limit.exceed=密码输入错误{0}次,户锁定{1}分钟
+user.password.retry.limit.exceed=密码输入错误{0}次,户锁定{1}分钟
 user.password.delete=对不起,您的账号:{0} 已被删除
 user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员
 role.blocked=角色已封禁,请联系管理员
@@ -47,10 +47,10 @@ repeat.submit.message=不允许重复提交,请稍候再试
 rate.limiter.message=访问过于频繁,请稍候再试
 sms.code.not.blank=短信验证码不能为空
 sms.code.retry.limit.count=短信验证码输入错误{0}次
-sms.code.retry.limit.exceed=短信验证码输入错误{0}次,户锁定{1}分钟
+sms.code.retry.limit.exceed=短信验证码输入错误{0}次,户锁定{1}分钟
 email.code.not.blank=邮箱验证码不能为空
 email.code.retry.limit.count=邮箱验证码输入错误{0}次
-email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,户锁定{1}分钟
+email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,户锁定{1}分钟
 xcx.code.not.blank=小程序[code]不能为空
 social.source.not.blank=第三方登录平台[source]不能为空
 social.code.not.blank=第三方登录平台[code]不能为空

+ 3 - 3
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/i18n/messages_zh_CN.properties

@@ -5,7 +5,7 @@ user.jcaptcha.expire=验证码已失效
 user.not.exists=对不起, 您的账号:{0} 不存在.
 user.password.not.match=用户不存在/密码错误
 user.password.retry.limit.count=密码输入错误{0}次
-user.password.retry.limit.exceed=密码输入错误{0}次,户锁定{1}分钟
+user.password.retry.limit.exceed=密码输入错误{0}次,户锁定{1}分钟
 user.password.delete=对不起,您的账号:{0} 已被删除
 user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员
 role.blocked=角色已封禁,请联系管理员
@@ -48,10 +48,10 @@ repeat.submit.message=不允许重复提交,请稍候再试
 rate.limiter.message=访问过于频繁,请稍候再试
 sms.code.not.blank=短信验证码不能为空
 sms.code.retry.limit.count=短信验证码输入错误{0}次
-sms.code.retry.limit.exceed=短信验证码输入错误{0}次,户锁定{1}分钟
+sms.code.retry.limit.exceed=短信验证码输入错误{0}次,户锁定{1}分钟
 email.code.not.blank=邮箱验证码不能为空
 email.code.retry.limit.count=邮箱验证码输入错误{0}次
-email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,户锁定{1}分钟
+email.code.retry.limit.exceed=邮箱验证码输入错误{0}次,户锁定{1}分钟
 xcx.code.not.blank=小程序[code]不能为空
 social.source.not.blank=第三方登录平台[source]不能为空
 social.code.not.blank=第三方登录平台[code]不能为空

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/CompleteTaskDTO.java

@@ -17,7 +17,6 @@ import java.util.Objects;
 @Data
 public class CompleteTaskDTO implements Serializable {
 
-
     @Serial
     private static final long serialVersionUID = 1L;
 
@@ -68,7 +67,8 @@ public class CompleteTaskDTO implements Serializable {
 
     public Map<String, Object> getVariables() {
         if (variables == null) {
-            return new HashMap<>(16);
+            variables = new HashMap<>(16);
+            return variables;
         }
         variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
         return variables;

+ 1 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/domain/dto/UserDTO.java

@@ -7,7 +7,6 @@ import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
 
-
 /**
  * 用户
  *
@@ -61,7 +60,7 @@ public class UserDTO implements Serializable {
     private String sex;
 
     /**
-     * 号状态(0正常 1停用)
+     * 号状态(0正常 1停用)
      */
     private String status;
 

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/service/ConfigService.java

@@ -9,7 +9,7 @@ import java.util.List;
 /**
  * 通用 参数配置服务
  *
- * @author Lion Li
+ * @author Iwb
  */
 public interface ConfigService {
 

+ 2 - 2
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/validate/JsonPattern.java

@@ -8,10 +8,10 @@ import java.lang.annotation.*;
 /**
  * JSON 格式校验注解
  *
- * @author AprilWind
+ * @author Iwb
  */
 @Documented
-@Target({ElementType.METHOD, ElementType.FIELD})
+@Target({ ElementType.METHOD, ElementType.FIELD })
 @Retention(RetentionPolicy.RUNTIME)
 @Constraint(validatedBy = JsonPatternValidator.class)
 public @interface JsonPattern {

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/validate/JsonPatternValidator.java

@@ -8,7 +8,7 @@ import jakarta.validation.ConstraintValidatorContext;
 /**
  * JSON 格式校验器
  *
- * @author AprilWind
+ * @author Iwb
  */
 public class JsonPatternValidator implements ConstraintValidator<JsonPattern, String> {
 

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/json/validate/JsonType.java

@@ -6,7 +6,7 @@ import lombok.Getter;
 /**
  * JSON 类型枚举
  *
- * @author AprilWind
+ * @author Iwb
  */
 @Getter
 @AllArgsConstructor

+ 45 - 28
SERVER/VberAdminPlusV3/vber-common/vber-common-mail/src/main/java/com/vber/common/mail/utils/MailUtils.java

@@ -21,7 +21,6 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
-
 /**
  * 邮件工具类
  */
@@ -109,7 +108,8 @@ public class MailUtils {
      * @return message-id
      * @since 4.0.3
      */
-    public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) {
+    public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml,
+            File... files) {
         return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files);
     }
 
@@ -167,11 +167,13 @@ public class MailUtils {
      * @return message-id
      * @since 4.0.3
      */
-    public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
+    public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject,
+            String content, boolean isHtml, File... files) {
         return send(getMailAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files);
     }
 
-    // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
+    // -------------------------------------------------------------------------------------------------------------------------------
+    // Custom MailAccount
 
     /**
      * 发送邮件给多人
@@ -185,14 +187,15 @@ public class MailUtils {
      * @return message-id
      * @since 3.2.0
      */
-    public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) {
+    public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml,
+            File... files) {
         return send(mailAccount, splitAddress(to), subject, content, isHtml, files);
     }
 
     /**
      * 发送邮件给多人
      *
-     * @param mailAccount 邮件户信息
+     * @param mailAccount 邮件户信息
      * @param tos         收件人列表
      * @param subject     标题
      * @param content     正文
@@ -200,14 +203,15 @@ public class MailUtils {
      * @param files       附件列表
      * @return message-id
      */
-    public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
+    public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content,
+            boolean isHtml, File... files) {
         return send(mailAccount, tos, null, null, subject, content, isHtml, files);
     }
 
     /**
      * 发送邮件给多人
      *
-     * @param mailAccount 邮件户信息
+     * @param mailAccount 邮件户信息
      * @param tos         收件人列表
      * @param ccs         抄送人列表,可以为null或空
      * @param bccs        密送人列表,可以为null或空
@@ -218,7 +222,8 @@ public class MailUtils {
      * @return message-id
      * @since 4.0.3
      */
-    public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
+    public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs,
+            Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
         return send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files);
     }
 
@@ -234,7 +239,8 @@ public class MailUtils {
      * @return message-id
      * @since 3.2.0
      */
-    public static String sendHtml(String to, String subject, String content, Map<String, InputStream> imageMap, File... files) {
+    public static String sendHtml(String to, String subject, String content, Map<String, InputStream> imageMap,
+            File... files) {
         return send(to, subject, content, imageMap, true, files);
     }
 
@@ -250,7 +256,8 @@ public class MailUtils {
      * @param files    附件列表
      * @return message-id
      */
-    public static String send(String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    public static String send(String to, String subject, String content, Map<String, InputStream> imageMap,
+            boolean isHtml, File... files) {
         return send(splitAddress(to), subject, content, imageMap, isHtml, files);
     }
 
@@ -269,7 +276,8 @@ public class MailUtils {
      * @return message-id
      * @since 4.0.3
      */
-    public static String send(String to, String cc, String bcc, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    public static String send(String to, String cc, String bcc, String subject, String content,
+            Map<String, InputStream> imageMap, boolean isHtml, File... files) {
         return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files);
     }
 
@@ -284,7 +292,8 @@ public class MailUtils {
      * @return message-id
      * @since 3.2.0
      */
-    public static String sendHtml(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, File... files) {
+    public static String sendHtml(Collection<String> tos, String subject, String content,
+            Map<String, InputStream> imageMap, File... files) {
         return send(tos, subject, content, imageMap, true, files);
     }
 
@@ -299,7 +308,8 @@ public class MailUtils {
      * @param files    附件列表
      * @return message-id
      */
-    public static String send(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    public static String send(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap,
+            boolean isHtml, File... files) {
         return send(tos, null, null, subject, content, imageMap, isHtml, files);
     }
 
@@ -317,11 +327,13 @@ public class MailUtils {
      * @return message-id
      * @since 4.0.3
      */
-    public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject,
+            String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
         return send(getMailAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
     }
 
-    // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
+    // -------------------------------------------------------------------------------------------------------------------------------
+    // Custom MailAccount
 
     /**
      * 发送邮件给多人
@@ -336,14 +348,15 @@ public class MailUtils {
      * @return message-id
      * @since 3.2.0
      */
-    public static String send(MailAccount mailAccount, String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    public static String send(MailAccount mailAccount, String to, String subject, String content,
+            Map<String, InputStream> imageMap, boolean isHtml, File... files) {
         return send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files);
     }
 
     /**
      * 发送邮件给多人
      *
-     * @param mailAccount 邮件户信息
+     * @param mailAccount 邮件户信息
      * @param tos         收件人列表
      * @param subject     标题
      * @param content     正文
@@ -353,14 +366,15 @@ public class MailUtils {
      * @return message-id
      * @since 4.6.3
      */
-    public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content,
+            Map<String, InputStream> imageMap, boolean isHtml, File... files) {
         return send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files);
     }
 
     /**
      * 发送邮件给多人
      *
-     * @param mailAccount 邮件户信息
+     * @param mailAccount 邮件户信息
      * @param tos         收件人列表
      * @param ccs         抄送人列表,可以为null或空
      * @param bccs        密送人列表,可以为null或空
@@ -372,8 +386,9 @@ public class MailUtils {
      * @return message-id
      * @since 4.6.3
      */
-    public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap,
-                              boolean isHtml, File... files) {
+    public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs,
+            Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap,
+            boolean isHtml, File... files) {
         return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
     }
 
@@ -395,12 +410,13 @@ public class MailUtils {
                 : Session.getInstance(mailAccount.getSmtpProps(), authenticator);
     }
 
-    // ------------------------------------------------------------------------------------------------------------------------ Private method start
+    // ------------------------------------------------------------------------------------------------------------------------
+    // Private method start
 
     /**
      * 发送邮件给多人
      *
-     * @param mailAccount      邮件户信息
+     * @param mailAccount      邮件户信息
      * @param useGlobalSession 是否全局共享Session
      * @param tos              收件人列表
      * @param ccs              抄送人列表,可以为null或空
@@ -413,8 +429,9 @@ public class MailUtils {
      * @return message-id
      * @since 4.6.3
      */
-    private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content,
-                               Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+    private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection<String> tos,
+            Collection<String> ccs, Collection<String> bccs, String subject, String content,
+            Map<String, InputStream> imageMap, boolean isHtml, File... files) {
         final JakartaMail mail = JakartaMail.create(mailAccount).setUseGlobalSession(useGlobalSession);
 
         // 可选抄送人
@@ -465,6 +482,6 @@ public class MailUtils {
         }
         return result;
     }
-    // ------------------------------------------------------------------------------------------------------------------------ Private method end
+    // ------------------------------------------------------------------------------------------------------------------------
+    // Private method end
 }
-

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/src/main/java/com/vber/common/redis/manager/PlusSpringCacheManager.java

@@ -156,8 +156,8 @@ public class PlusSpringCacheManager implements CacheManager {
         return cache;
     }
 
-    @Override
     @SuppressWarnings("null")
+    @Override
     public @NonNull Collection<String> getCacheNames() {
         return Collections.unmodifiableCollection(configMap.keySet());
     }

+ 1 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/core/I18nLocaleResolver.java

@@ -32,7 +32,7 @@ public class I18nLocaleResolver implements LocaleResolver {
 
     @Override
     public void setLocale(@NonNull HttpServletRequest httpServletRequest,
-                          @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {
+            @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {
 
     }
 }

+ 41 - 22
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/handler/GlobalExceptionHandler.java

@@ -14,7 +14,10 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
 import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.context.MessageSourceResolvable;
 import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.expression.ExpressionException;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.validation.BindException;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
@@ -26,6 +29,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
 import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 import org.springframework.web.servlet.NoHandlerFoundException;
+import org.springframework.web.method.annotation.HandlerMethodValidationException;
 
 import java.io.IOException;
 
@@ -43,7 +47,7 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
     public R<Void> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
-                                                       HttpServletRequest request) {
+            HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
         return R.fail(HttpStatus.HTTP_BAD_METHOD, e.getMessage());
@@ -77,7 +81,7 @@ public class GlobalExceptionHandler {
     public R<Void> handleServletException(ServletException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}',发生未知异常.", requestURI, e);
-        return R.fail(e.getMessage());
+        return R.fail("发生未知异常,请联系管理员");
     }
 
     /**
@@ -96,8 +100,7 @@ public class GlobalExceptionHandler {
     public R<Void> handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI);
-        String variableName = e.getVariableName() != null ? e.getVariableName() : "unknown";
-        return R.fail(String.format("请求路径中缺少必需的路径变量[%s]", variableName));
+        return R.fail(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName()));
     }
 
     /**
@@ -105,7 +108,7 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(MethodArgumentTypeMismatchException.class)
     public R<Void> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e,
-                                                             HttpServletRequest request) {
+            HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI);
         Class<?> requiredType = e.getRequiredType();
@@ -113,8 +116,7 @@ public class GlobalExceptionHandler {
         String paramName = e.getName() != null ? e.getName() : "unknown";
         Object value = e.getValue();
         String paramValue = value != null ? value.toString() : "null";
-        return R.fail(
-                String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", paramName, requiredTypeName, paramValue));
+        return R.fail(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", paramName, requiredTypeName, paramValue));
     }
 
     /**
@@ -124,18 +126,11 @@ public class GlobalExceptionHandler {
     public R<Void> handleNoHandlerFoundException(NoHandlerFoundException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}'不存在.", requestURI);
-        return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage());
+        return R.fail(HttpStatus.HTTP_NOT_FOUND, "请求地址不存在");
     }
 
     /**
-     * sse 连接超时异常 不需要处理
-     */
-    @ExceptionHandler(AsyncRequestTimeoutException.class)
-    public void handleRuntimeException(AsyncRequestTimeoutException e) {
-    }
-
-    /**
-     * 拦截IO异常
+     * 拦截未知的运行时异常
      */
     @ResponseStatus(org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR)
     @ExceptionHandler(IOException.class)
@@ -148,6 +143,13 @@ public class GlobalExceptionHandler {
         log.error("请求地址'{}',连接中断", requestURI, e);
     }
 
+    /**
+     * sse 连接超时异常 不需要处理
+     */
+    @ExceptionHandler(AsyncRequestTimeoutException.class)
+    public void handleRuntimeException(AsyncRequestTimeoutException e) {
+    }
+
     /**
      * 拦截未知的运行时异常
      */
@@ -155,7 +157,7 @@ public class GlobalExceptionHandler {
     public R<Void> handleRuntimeException(RuntimeException e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}',发生未知异常.", requestURI, e);
-        return R.fail(e.getMessage());
+        return R.fail("发生未知异常,请联系管理员");
     }
 
     /**
@@ -165,7 +167,7 @@ public class GlobalExceptionHandler {
     public R<Void> handleException(Exception e, HttpServletRequest request) {
         String requestURI = request.getRequestURI();
         log.error("请求地址'{}',发生系统异常.", requestURI, e);
-        return R.fail(e.getMessage());
+        return R.fail("发生系统异常,请联系管理员");
     }
 
     /**
@@ -199,6 +201,16 @@ public class GlobalExceptionHandler {
         return R.fail(message);
     }
 
+    /**
+     * 方法参数校验异常 用于处理 @Validated 注解
+     */
+    @ExceptionHandler(HandlerMethodValidationException.class)
+    public R<Void> handlerMethodValidationException(HandlerMethodValidationException e) {
+        log.error(e.getMessage());
+        String message = StreamUtils.join(e.getAllErrors(), MessageSourceResolvable::getDefaultMessage, ", ");
+        return R.fail(message);
+    }
+
     /**
      * JSON 解析异常(Jackson 在处理 JSON 格式出错时抛出)
      * 可能是请求体格式非法,也可能是服务端反序列化失败
@@ -215,11 +227,18 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(HttpMessageNotReadableException.class)
     public R<Void> handleHttpMessageNotReadableException(HttpMessageNotReadableException e,
-                                                         HttpServletRequest request) {
+            HttpServletRequest request) {
         log.error("请求地址'{}', 参数解析失败: {}", request.getRequestURI(), e.getMessage());
-        Throwable cause = e.getMostSpecificCause();
-        String errorMessage = cause != null ? cause.getMessage() : e.getMessage();
-        return R.fail(HttpStatus.HTTP_BAD_REQUEST, "请求参数格式错误:" + errorMessage);
+        return R.fail(HttpStatus.HTTP_BAD_REQUEST, "请求参数格式错误:" + e.getMostSpecificCause().getMessage());
+    }
+
+    /**
+     * SpEL 表达式相关异常
+     */
+    @ExceptionHandler(ExpressionException.class)
+    public R<Void> handleSpelException(ExpressionException e, HttpServletRequest request) {
+        log.error("请求地址'{}',SpEL解析异常: {}", request.getRequestURI(), e.getMessage());
+        return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "SpEL解析失败:" + e.getMessage());
     }
 
 }

+ 4 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/controller/GenController.java

@@ -3,6 +3,8 @@ package com.vber.generator.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.io.IoUtil;
+
+import com.baomidou.lock.annotation.Lock4j;
 import com.vber.common.core.domain.R;
 import com.vber.common.idempotent.annotation.RepeatSubmit;
 import com.vber.common.log.annotation.Log;
@@ -94,6 +96,7 @@ public class GenController extends BaseController {
     @RepeatSubmit()
     @SaCheckPermission("tool:gen:import")
     @Log(title = "代码生成", businessType = BusinessType.IMPORT)
+    @Lock4j(keys = { "#dataName" }, acquireTimeout = 10000)
     @PostMapping("/importTable")
     public R<Void> importTableSave(String tables, String dataName) {
         String[] tableNames = Convert.toStrArray(tables);
@@ -188,6 +191,7 @@ public class GenController extends BaseController {
     @RepeatSubmit()
     @SaCheckPermission("tool:gen:edit")
     @Log(title = "代码生成", businessType = BusinessType.UPDATE)
+    @Lock4j(keys = { "#tableId" }, acquireTimeout = 10000)
     @GetMapping("/syncDb/{tableId}")
     public R<Void> syncDb(@PathVariable("tableId") Long tableId) {
         genTableService.syncDb(tableId);

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/SysOssExt.java

@@ -9,7 +9,7 @@ import java.util.List;
 /**
  * 附件扩展字段对象(存储在 SysOss.ext1 的 JSON 字符串中)
  *
- * @author AprilWind
+ * @author Iwb
  */
 @Data
 public class SysOssExt implements Serializable {

+ 2 - 7
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/SysUser.java

@@ -70,15 +70,11 @@ public class SysUser extends TenantEntity {
     /**
      * 密码
      */
-    @TableField(
-            insertStrategy = FieldStrategy.NOT_EMPTY,
-            updateStrategy = FieldStrategy.NOT_EMPTY,
-            whereStrategy = FieldStrategy.NOT_EMPTY
-    )
+    @TableField(insertStrategy = FieldStrategy.NOT_EMPTY, updateStrategy = FieldStrategy.NOT_EMPTY, whereStrategy = FieldStrategy.NOT_EMPTY)
     private String password;
 
     /**
-     * 号状态(0正常 1停用)
+     * 账号状态(0正常 1停用)
      */
     private String status;
 
@@ -103,7 +99,6 @@ public class SysUser extends TenantEntity {
      */
     private String remark;
 
-
     public SysUser(Long userId) {
         this.userId = userId;
     }

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/bo/SysUserBo.java

@@ -78,7 +78,7 @@ public class SysUserBo extends BaseEntity {
     private String password;
 
     /**
-     * 号状态(0正常 1停用)
+     * 号状态(0正常 1停用)
      */
     private String status;
 

+ 2 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysUserExportVo.java

@@ -62,9 +62,9 @@ public class SysUserExportVo implements Serializable {
     private String sex;
 
     /**
-     * 号状态(0正常 1停用)
+     * 号状态(0正常 1停用)
      */
-    @ExcelProperty(value = "号状态", converter = ExcelDictConvert.class)
+    @ExcelProperty(value = "号状态", converter = ExcelDictConvert.class)
     @ExcelDictFormat(dictType = "sys_normal_disable")
     private String status;
 

+ 2 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysUserImportVo.java

@@ -67,9 +67,9 @@ public class SysUserImportVo implements Serializable {
     private String sex;
 
     /**
-     * 号状态(0正常 1停用)
+     * 号状态(0正常 1停用)
      */
-    @ExcelProperty(value = "号状态", converter = ExcelDictConvert.class)
+    @ExcelProperty(value = "号状态", converter = ExcelDictConvert.class)
     @ExcelDictFormat(dictType = "sys_normal_disable")
     private String status;
 

+ 1 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysUserVo.java

@@ -15,7 +15,6 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
-
 /**
  * 用户信息视图对象 sys_user
  *
@@ -89,7 +88,7 @@ public class SysUserVo implements Serializable {
     private String password;
 
     /**
-     * 号状态(0正常 1停用)
+     * 号状态(0正常 1停用)
      */
     private String status;
 

+ 2 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/ISysUserService.java

@@ -181,7 +181,7 @@ public interface ISysUserService {
      * 修改用户状态
      *
      * @param userId 用户ID
-     * @param status 号状态
+     * @param status 号状态
      * @return 结果
      */
     int updateUserStatus(Long userId, String status);
@@ -239,7 +239,7 @@ public interface ISysUserService {
     /**
      * 通过用户ID查询用户账户
      *
-     * @param userIds 用户ID  多个用逗号隔开
+     * @param userIds 用户ID 多个用逗号隔开
      * @return 用户昵称
      */
     String selectNicknameByIds(String userIds);

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysUserServiceImpl.java

@@ -388,7 +388,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
      * 修改用户状态
      *
      * @param userId 用户ID
-     * @param status 号状态
+     * @param status 号状态
      * @return 结果
      */
     @Override

+ 12 - 9
SERVER/VberAdminPlusV3/vber-modules/vber-workflow/src/main/java/com/vber/workflow/listener/WorkflowGlobalListener.java

@@ -75,7 +75,7 @@ public class WorkflowGlobalListener implements GlobalListener {
             NodeExtVo nodeExt = nodeExtService.parseNodeExt(ext);
             Map<String, Object> variable = listenerVariable.getVariable();
             Set<String> copyList = nodeExt.getCopySettings();
-            if (CollUtil.isNotEmpty(copyList)) {
+            if (CollUtil.isEmpty(copyList)) {
                 List<FlowCopyBo> list = StreamUtils.toList(copyList, x -> {
                     FlowCopyBo bo = new FlowCopyBo();
                     Long id = Convert.toLong(x);
@@ -106,7 +106,8 @@ public class WorkflowGlobalListener implements GlobalListener {
         String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
         for (Task flowTask : nextTasks) {
             // 如果办理或者退回并行存在需要指定办理人,则直接覆盖办理人
-            if (variable.containsKey(flowTask.getNodeCode()) && TaskStatusEnum.isPassOrBack(flowParams.getHisStatus())) {
+            if (variable.containsKey(flowTask.getNodeCode())
+                    && TaskStatusEnum.isPassOrBack(flowParams.getHisStatus())) {
                 String userIds = variable.get(flowTask.getNodeCode()).toString();
                 flowTask.setPermissionList(List.of(userIds.split(StringUtils.SEPARATOR)));
                 variable.remove(flowTask.getNodeCode());
@@ -141,10 +142,11 @@ public class WorkflowGlobalListener implements GlobalListener {
             params.put("message", flowParams.getMessage());
             variable = flowParams.getVariable();
         }
-        //申请人提交事件
+        // 申请人提交事件
         Boolean submit = MapUtil.getBool(variable, FlowConstant.SUBMIT);
         if (submit != null && submit) {
-            flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, instance.getFlowStatus(), variable, true);
+            flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, instance.getFlowStatus(),
+                    variable, true);
         } else {
             // 判断流程状态(发布:撤销,退回,作废,终止,已完成事件)
             String status = determineFlowStatus(instance);
@@ -155,17 +157,19 @@ public class WorkflowGlobalListener implements GlobalListener {
                 if (task != null && CollUtil.isNotEmpty(nextTasks) && nextTasks.size() == 1
                         && flwCommonService.applyNodeCode(definition.getId()).equals(nextTasks.get(0).getNodeCode())) {
                     // 如果为画线指定驳回 线条指定为驳回 驳回得节点为申请人节点 则修改流程状态为退回
-                    flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, BusinessStatusEnum.BACK.getStatus(), params, false);
+                    flowProcessEventHandler.processHandler(definition.getFlowCode(), instance,
+                            BusinessStatusEnum.BACK.getStatus(), params, false);
                     // 修改流程实例状态
                     instance.setFlowStatus(BusinessStatusEnum.BACK.getStatus());
                     FlowEngine.insService().updateById(instance);
                 }
             }
         }
-        //发布任务事件
+        // 发布任务事件
         if (CollUtil.isNotEmpty(nextTasks)) {
             for (Task nextTask : nextTasks) {
-                flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask.getId(), params);
+                flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask.getId(),
+                        params);
             }
         }
         if (ObjectUtil.isNull(flowParams)) {
@@ -195,8 +199,7 @@ public class WorkflowGlobalListener implements GlobalListener {
                 FlowConstant.FLOW_COPY_LIST,
                 FlowConstant.MESSAGE_TYPE,
                 FlowConstant.MESSAGE_NOTICE,
-                FlowConstant.SUBMIT
-        );
+                FlowConstant.SUBMIT);
     }
 
     /**