Pārlūkot izejas kodu

!847 发布 5.6.1 版本 依赖升级漏洞修复

Merge pull request !847 from 疯狂的狮子Li/dev
疯狂的狮子Li 2 mēneši atpakaļ
vecāks
revīzija
6bfdcae06e
26 mainītis faili ar 124 papildinājumiem un 58 dzēšanām
  1. 3 0
      .gitignore
  2. 1 1
      .run/ruoyi-monitor-admin.run.xml
  3. 1 1
      .run/ruoyi-server.run.xml
  4. 1 1
      .run/ruoyi-snailjob-server.run.xml
  5. 1 1
      README.md
  6. 10 10
      pom.xml
  7. 5 4
      ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java
  8. BIN
      ruoyi-admin/src/main/resources/ip2region_v4.xdb
  9. 1 1
      ruoyi-common/ruoyi-common-bom/pom.xml
  10. 1 1
      ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java
  11. 3 2
      ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java
  12. 6 5
      ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java
  13. 18 0
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java
  14. 4 5
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java
  15. 5 0
      ruoyi-common/ruoyi-common-satoken/pom.xml
  16. 5 5
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
  17. 3 3
      ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java
  18. 2 2
      ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java
  19. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java
  20. 3 2
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
  21. 1 0
      ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml
  22. 4 4
      script/docker/docker-compose.yml
  23. 8 2
      script/sql/oracle/oracle_ry_job.sql
  24. 8 2
      script/sql/postgres/postgres_ry_job.sql
  25. 7 3
      script/sql/ry_job.sql
  26. 22 2
      script/sql/sqlserver/sqlserver_ry_job.sql

+ 3 - 0
.gitignore

@@ -25,6 +25,9 @@ target/
 *.iml
 *.ipr
 
+### VS CODE ###
+.vscode
+
 ### JRebel ###
 rebel.xml
 

+ 1 - 1
.run/ruoyi-monitor-admin.run.xml

@@ -2,7 +2,7 @@
   <configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
     <deployment type="dockerfile">
       <settings>
-        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.6.0" />
+        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.6.1" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
       </settings>

+ 1 - 1
.run/ruoyi-server.run.xml

@@ -2,7 +2,7 @@
   <configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
     <deployment type="dockerfile">
       <settings>
-        <option name="imageTag" value="ruoyi/ruoyi-server:5.6.0" />
+        <option name="imageTag" value="ruoyi/ruoyi-server:5.6.1" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
       </settings>

+ 1 - 1
.run/ruoyi-snailjob-server.run.xml

@@ -2,7 +2,7 @@
   <configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
     <deployment type="dockerfile">
       <settings>
-        <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.6.0" />
+        <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.6.1" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
       </settings>

+ 1 - 1
README.md

@@ -9,7 +9,7 @@
 [![Star](https://gitcode.com/dromara/RuoYi-Vue-Plus/star/badge.svg)](https://gitcode.com/dromara/RuoYi-Vue-Plus)
 [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE)
 <br>
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.6.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.6.1-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
 [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-blue.svg)]()
 [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
 [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]()

+ 10 - 10
pom.xml

@@ -13,32 +13,32 @@
     <description>Dromara RuoYi-Vue-Plus多租户管理系统</description>
 
     <properties>
-        <revision>5.6.0</revision>
-        <spring-boot.version>3.5.12</spring-boot.version>
+        <revision>5.6.1</revision>
+        <spring-boot.version>3.5.14</spring-boot.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>17</java.version>
         <mybatis.version>3.5.19</mybatis.version>
-        <springdoc.version>2.8.15</springdoc.version>
+        <springdoc.version>2.8.17</springdoc.version>
         <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
         <fastexcel.version>1.3.0</fastexcel.version>
         <velocity.version>2.3</velocity.version>
-        <satoken.version>1.44.0</satoken.version>
+        <satoken.version>1.45.0</satoken.version>
         <mybatis-plus.version>3.5.16</mybatis-plus.version>
         <p6spy.version>3.9.1</p6spy.version>
         <hutool.version>5.8.43</hutool.version>
-        <spring-boot-admin.version>3.5.6</spring-boot-admin.version>
+        <spring-boot-admin.version>3.5.8</spring-boot-admin.version>
         <redisson.version>3.52.0</redisson.version>
         <lock4j.version>2.2.7</lock4j.version>
         <dynamic-ds.version>4.3.1</dynamic-ds.version>
-        <snailjob.version>1.9.0</snailjob.version>
+        <snailjob.version>1.10.0</snailjob.version>
         <mapstruct-plus.version>1.5.0</mapstruct-plus.version>
         <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
-        <lombok.version>1.18.42</lombok.version>
+        <lombok.version>1.18.44</lombok.version>
         <bouncycastle.version>1.83</bouncycastle.version>
         <justauth.version>1.16.7</justauth.version>
         <!-- 离线IP地址定位库 -->
-        <ip2region.version>3.3.4</ip2region.version>
+        <ip2region.version>3.3.7</ip2region.version>
         <!-- OSS 配置 -->
         <aws.sdk.version>2.28.22</aws.sdk.version>
         <!-- SMS 配置 -->
@@ -46,9 +46,9 @@
         <!-- 限制框架中的fastjson版本 -->
         <fastjson.version>1.2.83</fastjson.version>
         <!-- 面向运行时的D-ORM依赖 -->
-        <anyline.version>8.7.3-20251210</anyline.version>
+        <anyline.version>8.7.3-20260319</anyline.version>
         <!-- 工作流配置 -->
-        <warm-flow.version>1.8.4</warm-flow.version>
+        <warm-flow.version>1.8.5</warm-flow.version>
 
         <!-- 插件版本 -->
         <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>

+ 5 - 4
ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java

@@ -14,6 +14,7 @@ import org.dromara.common.core.domain.dto.UserOnlineDTO;
 import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.ServletUtils;
 import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.ip.AddressUtils;
 import org.dromara.common.log.event.LogininforEvent;
 import org.dromara.common.redis.utils.RedisUtils;
@@ -73,7 +74,7 @@ public class UserActionListener implements SaTokenListener {
         SpringUtils.context().publishEvent(logininforEvent);
         // 更新登录信息
         loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip);
-        log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
+        log.info("user doLogin, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
     }
 
     /**
@@ -85,7 +86,7 @@ public class UserActionListener implements SaTokenListener {
         TenantHelper.dynamic(tenantId, () -> {
             RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
         });
-        log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue);
+        log.info("user doLogout, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
     }
 
     /**
@@ -97,7 +98,7 @@ public class UserActionListener implements SaTokenListener {
         TenantHelper.dynamic(tenantId, () -> {
             RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
         });
-        log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue);
+        log.info("user doKickout, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
     }
 
     /**
@@ -109,7 +110,7 @@ public class UserActionListener implements SaTokenListener {
         TenantHelper.dynamic(tenantId, () -> {
             RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
         });
-        log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue);
+        log.info("user doReplaced, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8));
     }
 
     /**

BIN
ruoyi-admin/src/main/resources/ip2region_v4.xdb


+ 1 - 1
ruoyi-common/ruoyi-common-bom/pom.xml

@@ -14,7 +14,7 @@
     </description>
 
     <properties>
-        <revision>5.6.0</revision>
+        <revision>5.6.1</revision>
     </properties>
 
     <dependencyManagement>

+ 1 - 1
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java

@@ -33,7 +33,7 @@ public class ExcelBigNumberConvert implements Converter<Long> {
 
     @Override
     public Long convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
-        return Convert.toLong(cellData.getData());
+        return Convert.toLong(cellData.getStringValue());
     }
 
     @Override

+ 3 - 2
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java

@@ -130,8 +130,9 @@ public class ExcelDownHandler implements SheetWriteHandler {
             }
             if (ObjectUtil.isNotEmpty(options)) {
                 // 仅当下拉可选项不为空时执行
-                if (options.size() > 20) {
-                    // 这里限制如果可选项大于20,则使用额外表形式
+                int totalCharacter = options.stream().mapToInt(String::length).sum() + options.size();
+                if (options.size() > 20 || totalCharacter > 255) {
+                    // 这里限制如果可选项大于20 或 总字符数超过255,则使用额外表形式
                     dropDownWithSheet(helper, workbook, sheet, index, options);
                 } else {
                     // 否则使用固定值形式

+ 6 - 5
ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java

@@ -12,6 +12,7 @@ import org.aspectj.lang.annotation.AfterThrowing;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.constant.HttpStatus;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MessageUtils;
@@ -76,16 +77,16 @@ public class RepeatSubmitAspect {
      */
     @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult")
     public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) {
-        if (jsonResult instanceof R<?> r) {
-            try {
+        try {
+            if (jsonResult instanceof R<?> r) {
                 // 成功则不删除redis数据 保证在有效时间内无法重复提交
-                if (r.getCode() == R.SUCCESS) {
+                if (r.getCode() == HttpStatus.SUCCESS) {
                     return;
                 }
                 RedisUtils.deleteObject(KEY_CACHE.get());
-            } finally {
-                KEY_CACHE.remove();
             }
+        } finally {
+            KEY_CACHE.remove();
         }
     }
 

+ 18 - 0
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java

@@ -46,6 +46,24 @@ public class DataBaseHelper {
         }
     }
 
+    /**
+     * 获取指定数据源对应的数据库类型
+     *
+     * @param dsName 数据源名称
+     * @return 指定数据库对应的 DataBaseType 枚举,找不到时默认返回 MY_SQL
+     * @throws ServiceException 当获取数据库连接或元数据出现异常时抛出业务异常
+     */
+    public static DataBaseType getDataBaseType(String dsName) {
+        DataSource dataSource = DS.getDataSource(dsName);
+        try (Connection conn = dataSource.getConnection()) {
+            DatabaseMetaData metaData = conn.getMetaData();
+            String databaseProductName = metaData.getDatabaseProductName();
+            return DataBaseType.find(databaseProductName);
+        } catch (SQLException e) {
+            throw new RuntimeException("获取数据库类型失败", e);
+        }
+    }
+
     /**
      * 根据当前数据库类型,生成兼容的 FIND_IN_SET 语句片段
      * <p>

+ 4 - 5
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java

@@ -9,7 +9,6 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.redis.config.properties.RedissonProperties;
 import org.dromara.common.redis.handler.KeyPrefixHandler;
 import org.dromara.common.redis.handler.RedisExceptionHandler;
@@ -21,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
-import org.springframework.core.task.VirtualThreadTaskExecutor;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -65,9 +63,10 @@ public class RedisConfig {
                 // 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现)
                 .setUseScriptCache(true)
                 .setCodec(codec);
-            if (SpringUtils.isVirtual()) {
-                config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-"));
-            }
+            // netty 对虚拟线程适配有问题 暂时禁止使用
+            //if (SpringUtils.isVirtual()) {
+            //    config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-"));
+            //}
             RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig();
             if (ObjectUtil.isNotNull(singleServerConfig)) {
                 // 使用单机模式

+ 5 - 0
ruoyi-common/ruoyi-common-satoken/pom.xml

@@ -41,6 +41,11 @@
             <artifactId>caffeine</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 5 - 5
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java

@@ -2,7 +2,6 @@ package org.dromara.common.web.handler;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpStatus;
-import com.fasterxml.jackson.core.JsonParseException;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.ConstraintViolation;
@@ -14,6 +13,7 @@ import org.dromara.common.core.exception.SseException;
 import org.dromara.common.core.exception.base.BaseException;
 import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.json.utils.JsonUtils;
+import org.springframework.boot.json.JsonParseException;
 import org.springframework.context.MessageSourceResolvable;
 import org.springframework.context.support.DefaultMessageSourceResolvable;
 import org.springframework.expression.ExpressionException;
@@ -80,7 +80,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("发生未知异常,请联系管理员");
     }
 
     /**
@@ -119,7 +119,7 @@ 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, "请求地址不存在");
     }
 
     /**
@@ -150,7 +150,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("发生未知异常,请联系管理员");
     }
 
     /**
@@ -160,7 +160,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("发生系统异常,请联系管理员");
     }
 
     /**

+ 3 - 3
ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java

@@ -331,7 +331,7 @@ public class GenTableServiceImpl implements IGenTableService {
         VelocityContext context = VelocityUtils.prepareContext(table);
 
         // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
+        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName());
         for (String template : templates) {
             // 渲染模板
             StringWriter sw = new StringWriter();
@@ -374,7 +374,7 @@ public class GenTableServiceImpl implements IGenTableService {
         VelocityContext context = VelocityUtils.prepareContext(table);
 
         // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
+        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName());
         for (String template : templates) {
             if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) {
                 // 渲染模板
@@ -478,7 +478,7 @@ public class GenTableServiceImpl implements IGenTableService {
         VelocityContext context = VelocityUtils.prepareContext(table);
 
         // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
+        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName());
         for (String template : templates) {
             // 渲染模板
             StringWriter sw = new StringWriter();

+ 2 - 2
ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java

@@ -109,7 +109,7 @@ public class VelocityUtils {
      *
      * @return 模板列表
      */
-    public static List<String> getTemplateList(String tplCategory) {
+    public static List<String> getTemplateList(String tplCategory, String dsName) {
         List<String> templates = new ArrayList<>();
         templates.add("vm/java/domain.java.vm");
         templates.add("vm/java/vo.java.vm");
@@ -119,7 +119,7 @@ public class VelocityUtils {
         templates.add("vm/java/serviceImpl.java.vm");
         templates.add("vm/java/controller.java.vm");
         templates.add("vm/xml/mapper.xml.vm");
-        DataBaseType dataBaseType = DataBaseHelper.getDataBaseType();
+        DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(dsName);
         if (dataBaseType.isOracle()) {
             templates.add("vm/sql/oracle/sql.vm");
         } else if (dataBaseType.isPostgreSql()) {

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java

@@ -104,6 +104,6 @@ public class SysDeptVo implements Serializable {
     /**
      * 子部门
      */
-    private List<SysDept> children = new ArrayList<>();
+    private List<SysDeptVo> children = new ArrayList<>();
 
 }

+ 3 - 2
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -232,8 +232,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) {
             variables.put(SUBMIT, true);
         }
+        Map<String, Object> insVariableMap = ins.getVariableMap();
         // 设置弹窗处理人
-        Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap());
+        Map<String, Object> assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), insVariableMap);
         if (CollUtil.isNotEmpty(assigneeMap)) {
             variables.putAll(assigneeMap);
         }
@@ -249,7 +250,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             .flowStatus(BusinessStatusEnum.WAITING.getStatus())
             .hisStatus(TaskStatusEnum.PASS.getStatus())
             .hisTaskExt(completeTaskBo.getFileId());
-        Boolean autoPass = Convert.toBool(variables.getOrDefault(AUTO_PASS, false));
+        Boolean autoPass = Convert.toBool(insVariableMap.getOrDefault(AUTO_PASS, false));
         skipTask(taskId, flowParams, flowTask.getInstanceId(), autoPass);
         return true;
     }

+ 1 - 0
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml

@@ -88,6 +88,7 @@
               and b.del_flag = '0'
               and c.del_flag = '0'
               and a.node_type in ('1','3','4')
+              and a.flow_status <![CDATA[ <> ]]> 'copy'
         ) t
         ${ew.getCustomSqlSegment}
     </select>

+ 4 - 4
script/docker/docker-compose.yml

@@ -99,7 +99,7 @@ services:
     network_mode: "host"
 
   ruoyi-server1:
-    image: ruoyi/ruoyi-server:5.6.0
+    image: ruoyi/ruoyi-server:5.6.1
     container_name: ruoyi-server1
     environment:
       # 时区上海
@@ -115,7 +115,7 @@ services:
     network_mode: "host"
 
   ruoyi-server2:
-    image: ruoyi/ruoyi-server:5.6.0
+    image: ruoyi/ruoyi-server:5.6.1
     container_name: ruoyi-server2
     environment:
       # 时区上海
@@ -131,7 +131,7 @@ services:
     network_mode: "host"
 
   ruoyi-monitor-admin:
-    image: ruoyi/ruoyi-monitor-admin:5.6.0
+    image: ruoyi/ruoyi-monitor-admin:5.6.1
     container_name: ruoyi-monitor-admin
     environment:
       # 时区上海
@@ -143,7 +143,7 @@ services:
     network_mode: "host"
 
   ruoyi-snailjob-server:
-    image: ruoyi/ruoyi-snailjob-server:5.6.0
+    image: ruoyi/ruoyi-snailjob-server:5.6.1
     container_name: ruoyi-snailjob-server
     environment:
       # 时区上海

+ 8 - 2
script/sql/oracle/oracle_ry_job.sql

@@ -484,6 +484,7 @@ CREATE TABLE sj_job
 (
     id               number GENERATED ALWAYS AS IDENTITY,
     namespace_id     varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    biz_id           varchar2(64)                                             NOT NULL,
     group_name       varchar2(64)                                             NULL,
     job_name         varchar2(64)                                             NULL,
     args_str         clob          DEFAULT NULL                               NULL,
@@ -519,9 +520,11 @@ ALTER TABLE sj_job
 CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name);
 CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index);
 CREATE INDEX idx_sj_job_03 ON sj_job (create_dt);
+CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id);
 
 COMMENT ON COLUMN sj_job.id IS '主键';
 COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job.biz_id IS '业务ID';
 COMMENT ON COLUMN sj_job.group_name IS '组名称';
 COMMENT ON COLUMN sj_job.job_name IS '名称';
 COMMENT ON COLUMN sj_job.args_str IS '执行方法参数';
@@ -551,7 +554,7 @@ COMMENT ON COLUMN sj_job.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_job.update_dt IS '修改时间';
 COMMENT ON TABLE sj_job IS '任务信息';
 
-INSERT INTO sj_job(namespace_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', 'demo-job', NULL, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0, sysdate, sysdate);
+INSERT INTO sj_job(namespace_id, biz_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES ('dev', 'demo-job', 'ruoyi_group', 'demo-job', NULL, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0, sysdate, sysdate);
 
 -- sj_job_log_message
 CREATE TABLE sj_job_log_message
@@ -738,7 +741,7 @@ CREATE TABLE sj_retry_summary
     id            number GENERATED ALWAYS AS IDENTITY,
     namespace_id  varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
     group_name    varchar2(64) DEFAULT ''                                 NULL,
-    scene_name    varchar2(64) DEFAULT ''                                 NULL,
+    scene_name    varchar2(50) DEFAULT ''                                 NULL,
     trigger_at    date         DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
     running_num   number       DEFAULT 0                                  NOT NULL,
     finish_num    number       DEFAULT 0                                  NOT NULL,
@@ -774,6 +777,7 @@ CREATE TABLE sj_workflow
     id               number GENERATED ALWAYS AS IDENTITY,
     workflow_name    varchar2(64)                                             NULL,
     namespace_id     varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    biz_id           varchar2(64)                                             NOT NULL,
     group_name       varchar2(64)                                             NULL,
     workflow_status  smallint      DEFAULT 1                                  NOT NULL,
     trigger_type     smallint                                                 NOT NULL,
@@ -799,10 +803,12 @@ ALTER TABLE sj_workflow
 
 CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt);
 CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name);
+CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id);
 
 COMMENT ON COLUMN sj_workflow.id IS '主键';
 COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称';
 COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow.biz_id IS '业务ID';
 COMMENT ON COLUMN sj_workflow.group_name IS '组名称';
 COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启';
 COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';

+ 8 - 2
script/sql/postgres/postgres_ry_job.sql

@@ -445,6 +445,7 @@ CREATE TABLE sj_job
 (
     id               bigserial PRIMARY KEY,
     namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    biz_id           varchar(64)  NOT NULL,
     group_name       varchar(64)  NOT NULL,
     job_name         varchar(64)  NOT NULL,
     args_str         text         NULL     DEFAULT NULL,
@@ -477,9 +478,11 @@ CREATE TABLE sj_job
 CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name);
 CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index);
 CREATE INDEX idx_sj_job_03 ON sj_job (create_dt);
+CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id);
 
 COMMENT ON COLUMN sj_job.id IS '主键';
 COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_job.biz_id IS '业务ID';
 COMMENT ON COLUMN sj_job.group_name IS '组名称';
 COMMENT ON COLUMN sj_job.job_name IS '名称';
 COMMENT ON COLUMN sj_job.args_str IS '执行方法参数';
@@ -509,7 +512,7 @@ COMMENT ON COLUMN sj_job.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_job.update_dt IS '修改时间';
 COMMENT ON TABLE sj_job IS '任务信息';
 
-INSERT INTO sj_job VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '', '', '', 0, now(), now());
+INSERT INTO sj_job VALUES (1, 'dev', 'demo-job', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '', '', '', 0, now(), now());
 
 -- sj_job_log_message
 CREATE TABLE sj_job_log_message
@@ -684,7 +687,7 @@ CREATE TABLE sj_retry_summary
     id            bigserial PRIMARY KEY,
     namespace_id  varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
     group_name    varchar(64) NOT NULL DEFAULT '',
-    scene_name    varchar(64) NOT NULL DEFAULT '',
+    scene_name    varchar(50) NOT NULL DEFAULT '',
     trigger_at    timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP,
     running_num   int         NOT NULL DEFAULT 0,
     finish_num    int         NOT NULL DEFAULT 0,
@@ -717,6 +720,7 @@ CREATE TABLE sj_workflow
     id               bigserial PRIMARY KEY,
     workflow_name    varchar(64)  NOT NULL,
     namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    biz_id           varchar(64)  NOT NULL,
     group_name       varchar(64)  NOT NULL,
     workflow_status  smallint     NOT NULL DEFAULT 1,
     trigger_type     smallint     NOT NULL,
@@ -739,10 +743,12 @@ CREATE TABLE sj_workflow
 
 CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt);
 CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name);
+CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id);
 
 COMMENT ON COLUMN sj_workflow.id IS '主键';
 COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称';
 COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_workflow.biz_id IS '业务ID';
 COMMENT ON COLUMN sj_workflow.group_name IS '组名称';
 COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启';
 COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';

+ 7 - 3
script/sql/ry_job.sql

@@ -280,6 +280,7 @@ CREATE TABLE `sj_job`
 (
     `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
     `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `biz_id`           varchar(64)         NOT NULL COMMENT '业务ID',
     `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
     `job_name`         varchar(64)         NOT NULL COMMENT '名称',
     `args_str`         text                         DEFAULT NULL COMMENT '执行方法参数',
@@ -310,12 +311,13 @@ CREATE TABLE `sj_job`
     PRIMARY KEY (`id`),
     KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
     KEY `idx_job_status_bucket_index` (`job_status`, `bucket_index`),
-    KEY `idx_create_dt` (`create_dt`)
+    KEY `idx_create_dt` (`create_dt`),
+    UNIQUE KEY `uk_sj_job_01` (`namespace_id`, `biz_id`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 0
   DEFAULT CHARSET = utf8mb4 COMMENT ='任务信息';
 
-INSERT INTO `sj_job` VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0 , now(), now());
+INSERT INTO `sj_job` VALUES (1, 'dev', 'demo-job', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0 , now(), now());
 
 CREATE TABLE `sj_job_log_message`
 (
@@ -443,6 +445,7 @@ CREATE TABLE `sj_workflow`
     `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
     `workflow_name`    varchar(64)         NOT NULL COMMENT '工作流名称',
     `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `biz_id`           varchar(64)         NOT NULL COMMENT '业务ID',
     `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
     `workflow_status`  tinyint(4)          NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启',
     `trigger_type`     tinyint(4)          NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
@@ -463,7 +466,8 @@ CREATE TABLE `sj_workflow`
     `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
     KEY `idx_create_dt` (`create_dt`),
-    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`)
+    KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`),
+    UNIQUE KEY `uk_sj_workflow_01` (`namespace_id`, `biz_id`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 0
   DEFAULT CHARSET = utf8mb4 COMMENT ='工作流';

+ 22 - 2
script/sql/sqlserver/sqlserver_ry_job.sql

@@ -1428,6 +1428,7 @@ CREATE TABLE sj_job
 (
     id               bigint        NOT NULL PRIMARY KEY IDENTITY,
     namespace_id     nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    biz_id           nvarchar(64)  NOT NULL,
     group_name       nvarchar(64)  NOT NULL,
     job_name         nvarchar(64)  NOT NULL,
     args_str         nvarchar(max) NULL     DEFAULT NULL,
@@ -1464,6 +1465,8 @@ CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index)
 GO
 CREATE INDEX idx_sj_job_03 ON sj_job (create_dt)
 GO
+CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id)
+GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'主键',
@@ -1479,6 +1482,13 @@ EXEC sp_addextendedproperty
      'COLUMN', N'namespace_id'
 GO
 
+EXEC sp_addextendedproperty
+     'MS_Description', N'业务ID',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_job',
+     'COLUMN', N'biz_id'
+GO
+
 EXEC sp_addextendedproperty
      'MS_Description', N'组名称',
      'SCHEMA', N'dbo',
@@ -1674,7 +1684,7 @@ EXEC sp_addextendedproperty
      'TABLE', N'sj_job'
 GO
 
-INSERT INTO sj_job (namespace_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, N'testJobExecutor', 2, N'60', 1, 60, 3, 1, 1, 116, 0, N'', 1, N'', N'', N'', 0, getdate(), getdate())
+INSERT INTO sj_job (namespace_id, biz_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES (N'dev', N'demo-job', N'ruoyi_group', N'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, N'testJobExecutor', 2, N'60', 1, 60, 3, 1, 1, 116, 0, N'', 1, N'', N'', N'', 0, getdate(), getdate())
 GO
 
 -- sj_job_log_message
@@ -2248,7 +2258,7 @@ CREATE TABLE sj_retry_summary
     id            bigint       NOT NULL PRIMARY KEY IDENTITY,
     namespace_id  nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
     group_name    nvarchar(64) NOT NULL DEFAULT '',
-    scene_name    nvarchar(64) NOT NULL DEFAULT '',
+    scene_name    nvarchar(50) NOT NULL DEFAULT '',
     trigger_at    datetime2    NOT NULL DEFAULT CURRENT_TIMESTAMP,
     running_num   int          NOT NULL DEFAULT 0,
     finish_num    int          NOT NULL DEFAULT 0,
@@ -2354,6 +2364,7 @@ CREATE TABLE sj_workflow
     id               bigint        NOT NULL PRIMARY KEY IDENTITY,
     workflow_name    nvarchar(64)  NOT NULL,
     namespace_id     nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    biz_id           nvarchar(64)  NOT NULL,
     group_name       nvarchar(64)  NOT NULL,
     workflow_status  tinyint       NOT NULL DEFAULT 1,
     trigger_type     tinyint       NOT NULL,
@@ -2379,6 +2390,8 @@ CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt)
 GO
 CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name)
 GO
+CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id)
+GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'主键',
@@ -2401,6 +2414,13 @@ EXEC sp_addextendedproperty
      'COLUMN', N'namespace_id'
 GO
 
+EXEC sp_addextendedproperty
+     'MS_Description', N'业务ID',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_workflow',
+     'COLUMN', N'biz_id'
+GO
+
 EXEC sp_addextendedproperty
      'MS_Description', N'组名称',
      'SCHEMA', N'dbo',