Explorar o código

!661 发布 5.3.1-BETA2 公测版本
Merge pull request !661 from 疯狂的狮子Li/dev

疯狂的狮子Li hai 4 meses
pai
achega
159e30c982
Modificáronse 45 ficheiros con 810 adicións e 766 borrados
  1. 1 1
      .run/ruoyi-monitor-admin.run.xml
  2. 1 1
      .run/ruoyi-server.run.xml
  3. 1 1
      .run/ruoyi-snailjob-server.run.xml
  4. 1 1
      README.md
  5. 9 7
      pom.xml
  6. 1 1
      ruoyi-common/ruoyi-common-bom/pom.xml
  7. 29 4
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
  8. 1 1
      ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
  9. 1 1
      ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java
  10. 1 1
      ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java
  11. 0 11
      ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
  12. 0 11
      ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
  13. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java
  14. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java
  15. 1 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java
  16. 12 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java
  17. 26 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  18. 7 5
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java
  19. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
  20. 51 89
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java
  21. 1 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java
  22. 1 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
  23. 40 55
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
  24. 16 6
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java
  25. 1 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
  26. 1 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
  27. 4 4
      script/docker/docker-compose.yml
  28. 7 7
      script/leave/leave1.json
  29. 10 10
      script/leave/leave2.json
  30. 10 10
      script/leave/leave3.json
  31. 8 8
      script/leave/leave4.json
  32. 10 10
      script/leave/leave5.json
  33. 13 10
      script/leave/leave6.json
  34. 139 136
      script/sql/oracle/oracle_ry_job.sql
  35. 1 0
      script/sql/oracle/oracle_ry_workflow.sql
  36. 130 128
      script/sql/postgres/postgres_ry_job.sql
  37. 2 0
      script/sql/postgres/postgres_ry_workflow.sql
  38. 63 62
      script/sql/ry_job.sql
  39. 2 1
      script/sql/ry_workflow.sql
  40. 193 176
      script/sql/sqlserver/sqlserver_ry_job.sql
  41. 2 0
      script/sql/sqlserver/sqlserver_ry_workflow.sql
  42. 1 0
      script/sql/update/oracle/update_5.3.0-5.3.1.sql
  43. 1 0
      script/sql/update/postgres/update_5.3.0-5.3.1.sql
  44. 3 0
      script/sql/update/sqlserver/update_5.3.0-5.3.1.sql
  45. 1 0
      script/sql/update/update_5.3.0-5.3.1.sql

+ 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.3.1-BETA" />
+        <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.3.1-BETA2" />
         <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.3.1-BETA" />
+        <option name="imageTag" value="ruoyi/ruoyi-server:5.3.1-BETA2" />
         <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.3.1-BETA" />
+        <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.3.1-BETA2" />
         <option name="buildOnly" value="true" />
         <option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
       </settings>

+ 1 - 1
README.md

@@ -10,7 +10,7 @@
 [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE)
 [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
 <br>
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0--BETA-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0--BETA2-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
 [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.4-blue.svg)]()
 [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
 [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]()

+ 9 - 7
pom.xml

@@ -13,8 +13,8 @@
     <description>Dromara RuoYi-Vue-Plus多租户管理系统</description>
 
     <properties>
-        <revision>5.3.1-BETA</revision>
-        <spring-boot.version>3.4.3</spring-boot.version>
+        <revision>5.3.1-BETA2</revision>
+        <spring-boot.version>3.4.4</spring-boot.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>17</java.version>
@@ -27,11 +27,11 @@
         <mybatis-plus.version>3.5.10.1</mybatis-plus.version>
         <p6spy.version>3.9.1</p6spy.version>
         <hutool.version>5.8.35</hutool.version>
-        <spring-boot-admin.version>3.4.2</spring-boot-admin.version>
-        <redisson.version>3.44.0</redisson.version>
+        <spring-boot-admin.version>3.4.5</spring-boot-admin.version>
+        <redisson.version>3.45.1</redisson.version>
         <lock4j.version>2.2.7</lock4j.version>
         <dynamic-ds.version>4.3.1</dynamic-ds.version>
-        <snailjob.version>1.3.0</snailjob.version>
+        <snailjob.version>1.4.0-beta2</snailjob.version>
         <mapstruct-plus.version>1.4.6</mapstruct-plus.version>
         <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
         <lombok.version>1.18.36</lombok.version>
@@ -43,13 +43,13 @@
         <!-- OSS 配置 -->
         <aws.sdk.version>2.28.22</aws.sdk.version>
         <!-- SMS 配置 -->
-        <sms4j.version>3.3.3</sms4j.version>
+        <sms4j.version>3.3.4</sms4j.version>
         <!-- 限制框架中的fastjson版本 -->
         <fastjson.version>1.2.83</fastjson.version>
         <!-- 面向运行时的D-ORM依赖 -->
         <anyline.version>8.7.2-20250101</anyline.version>
         <!--工作流配置-->
-        <warm-flow.version>1.6.7</warm-flow.version>
+        <warm-flow.version>1.6.8</warm-flow.version>
 
         <!-- 插件版本 -->
         <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
@@ -57,6 +57,8 @@
         <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
         <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
         <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
+        <!-- 打包默认跳过测试 -->
+        <skipTests>true</skipTests>
     </properties>
 
     <profiles>

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

@@ -14,7 +14,7 @@
     </description>
 
     <properties>
-        <revision>5.3.1-BETA</revision>
+        <revision>5.3.1-BETA2</revision>
     </properties>
 
     <dependencyManagement>

+ 29 - 4
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java

@@ -35,6 +35,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.util.ClassUtils;
 
+import java.lang.reflect.Method;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
@@ -229,10 +230,7 @@ public class PlusDataPermissionHandler {
                     // 获取资源对应的类对象
                     Class<?> clazz = Resources.classForName(classMetadata.getClassName());
                     // 查找类中的特定注解
-                    if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
-                        DataPermission dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
-                        dataPermissionCacheMap.put(clazz.getName(), dataPermission);
-                    }
+                    findAnnotation(clazz);
                 }
             }
         } catch (Exception e) {
@@ -240,6 +238,29 @@ public class PlusDataPermissionHandler {
         }
     }
 
+    /**
+     * 在指定的类中查找特定的注解 DataPermission,并将带有这个注解的方法或类存储到 dataPermissionCacheMap 中
+     *
+     * @param clazz 要查找的类
+     */
+    private void findAnnotation(Class<?> clazz) {
+        DataPermission dataPermission;
+        for (Method method : clazz.getMethods()) {
+            if (method.isDefault() || method.isVarArgs()) {
+                continue;
+            }
+            String mappedStatementId = clazz.getName() + "." + method.getName();
+            if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) {
+                dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class);
+                dataPermissionCacheMap.put(mappedStatementId, dataPermission);
+            }
+        }
+        if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
+            dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
+            dataPermissionCacheMap.put(clazz.getName(), dataPermission);
+        }
+    }
+
     /**
      * 根据映射语句 ID 或类名获取对应的 DataPermission 注解对象
      *
@@ -251,6 +272,10 @@ public class PlusDataPermissionHandler {
         if (DataPermissionHelper.getPermission() != null) {
             return DataPermissionHelper.getPermission();
         }
+        // 检查缓存中是否包含映射语句 ID 对应的 DataPermission 注解对象
+        if (dataPermissionCacheMap.containsKey(mapperId)) {
+            return dataPermissionCacheMap.get(mapperId);
+        }
         // 如果缓存中不包含映射语句 ID 对应的 DataPermission 注解对象,则尝试使用类名作为键查找
         String clazzName = mapperId.substring(0, mapperId.lastIndexOf("."));
         if (dataPermissionCacheMap.containsKey(clazzName)) {

+ 1 - 1
ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java

@@ -8,7 +8,7 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.file.FileUtils;
 import org.dromara.common.oss.constant.OssConstant;
 import org.dromara.common.oss.entity.UploadResult;
-import org.dromara.common.oss.enumd.AccessPolicyType;
+import org.dromara.common.oss.enums.AccessPolicyType;
 import org.dromara.common.oss.exception.OssException;
 import org.dromara.common.oss.properties.OssProperties;
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;

+ 1 - 1
ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java → ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java

@@ -1,4 +1,4 @@
-package org.dromara.common.oss.enumd;
+package org.dromara.common.oss.enums;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 1
ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java

@@ -26,7 +26,7 @@ public class SseMessageUtils {
     }
 
     /**
-     * 向指定的WebSocket会话发送消息
+     * 向指定的SSE会话发送消息
      *
      * @param userId  要发送消息的用户id
      * @param message 要发送的消息内容

+ 0 - 11
ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml

@@ -22,21 +22,10 @@ snail-job:
   job-pull-page-size: 1000
   # 服务器端口
   server-port: 17888
-  # 一个客户端每秒最多接收的重试数量指令
-  limiter: 1000
   # 号段模式下步长配置
   step: 100
   # 日志保存时间(单位: day)
   log-storage: 90
-  # 回调配置
-  callback:
-    #回调最大执行次数
-    max-count: 288
-    #间隔时间
-    trigger-interval: 900
-  # 重试每次拉取的次数
-  retry-max-pull-count: 10
-  # RPC通讯类型: netty,grpc
   rpc-type: grpc
 
 --- # 监控中心配置

+ 0 - 11
ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml

@@ -22,21 +22,10 @@ snail-job:
   job-pull-page-size: 1000
   # 服务器端口
   server-port: 17888
-  # 一个客户端每秒最多接收的重试数量指令
-  limiter: 1000
   # 号段模式下步长配置
   step: 100
   # 日志保存时间(单位: day)
   log-storage: 90
-  # 回调配置
-  callback:
-    #回调最大执行次数
-    max-count: 288
-    #间隔时间
-    trigger-interval: 900
-  # 重试每次拉取的次数
-  retry-max-pull-count: 10
-  # RPC通讯类型: netty,grpc
   rpc-type: grpc
 
 --- # 监控中心配置

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

@@ -87,6 +87,6 @@ public class SysDept extends TenantEntity {
      * 子部门
      */
     @TableField(exist = false)
-    private List<SysMenu> children = new ArrayList<>();
+    private List<SysDept> children = new ArrayList<>();
 
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java

@@ -73,4 +73,9 @@ public class SysDeptBo extends BaseEntity {
      */
     private String status;
 
+    /**
+     * 归属部门id(部门树)
+     */
+    private Long belongDeptId;
+
 }

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

@@ -7,7 +7,6 @@ import lombok.Data;
 import org.dromara.common.excel.annotation.ExcelDictFormat;
 import org.dromara.common.excel.convert.ExcelDictConvert;
 import org.dromara.system.domain.SysDept;
-import org.dromara.system.domain.SysMenu;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -105,6 +104,6 @@ public class SysDeptVo implements Serializable {
     /**
      * 子部门
      */
-    private List<SysMenu> children = new ArrayList<>();
+    private List<SysDept> children = new ArrayList<>();
 
 }

+ 12 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java

@@ -1,6 +1,8 @@
 package org.dromara.system.service;
 
 import cn.hutool.core.lang.tree.Tree;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.system.domain.bo.SysDeptBo;
 import org.dromara.system.domain.vo.SysDeptVo;
 
@@ -12,6 +14,16 @@ import java.util.List;
  * @author Lion Li
  */
 public interface ISysDeptService {
+
+    /**
+     * 分页查询部门管理数据
+     *
+     * @param dept      部门信息
+     * @param pageQuery 分页对象
+     * @return 部门信息集合
+     */
+    TableDataInfo<SysDeptVo> selectPageDeptList(SysDeptBo dept, PageQuery pageQuery);
+
     /**
      * 查询部门管理数据
      *

+ 26 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.SystemConstants;
@@ -15,6 +16,8 @@ import org.dromara.common.core.domain.dto.DeptDTO;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.service.DeptService;
 import org.dromara.common.core.utils.*;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.helper.DataBaseHelper;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
@@ -50,6 +53,19 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
     private final SysRoleMapper roleMapper;
     private final SysUserMapper userMapper;
 
+    /**
+     * 分页查询部门管理数据
+     *
+     * @param dept      部门信息
+     * @param pageQuery 分页对象
+     * @return 部门信息集合
+     */
+    @Override
+    public TableDataInfo<SysDeptVo> selectPageDeptList(SysDeptBo dept, PageQuery pageQuery) {
+        Page<SysDeptVo> page = baseMapper.selectPageDeptList(pageQuery.build(), buildQueryWrapper(dept));
+        return TableDataInfo.build(page);
+    }
+
     /**
      * 查询部门管理数据
      *
@@ -87,6 +103,16 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
         lqw.orderByAsc(SysDept::getParentId);
         lqw.orderByAsc(SysDept::getOrderNum);
         lqw.orderByAsc(SysDept::getDeptId);
+        if (ObjectUtil.isNotNull(bo.getBelongDeptId())) {
+            //部门树搜索
+            lqw.and(x -> {
+                Long parentId = bo.getBelongDeptId();
+                List<SysDept> deptList = baseMapper.selectListByParentId(parentId);
+                List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
+                deptIds.add(parentId);
+                x.in(SysDept::getDeptId, deptIds);
+            });
+        }
         return lqw;
     }
 

+ 7 - 5
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java

@@ -33,10 +33,7 @@ import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -265,7 +262,12 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
     @Override
     public Map<String, String> getAllDictByDictType(String dictType) {
         List<SysDictDataVo> list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
-        return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel);
+        // 保证顺序
+        LinkedHashMap<String, String> map = new LinkedHashMap<>();
+        for (SysDictDataVo vo : list) {
+            map.put(vo.getDictValue(), vo.getDictLabel());
+        }
+        return map;
     }
 
     /**

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java

@@ -21,7 +21,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.oss.core.OssClient;
 import org.dromara.common.oss.entity.UploadResult;
-import org.dromara.common.oss.enumd.AccessPolicyType;
+import org.dromara.common.oss.enums.AccessPolicyType;
 import org.dromara.common.oss.factory.OssFactory;
 import org.dromara.system.domain.SysOss;
 import org.dromara.system.domain.bo.SysOssBo;

+ 51 - 89
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java

@@ -1,32 +1,28 @@
 package org.dromara.system.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import cn.hutool.core.convert.Convert;
 import lombok.RequiredArgsConstructor;
-import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
 import org.dromara.common.core.domain.model.TaskAssigneeBody;
 import org.dromara.common.core.service.TaskAssigneeService;
-import org.dromara.common.core.utils.StreamUtils;
-import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.system.domain.SysDept;
-import org.dromara.system.domain.SysPost;
-import org.dromara.system.domain.SysRole;
-import org.dromara.system.domain.SysUser;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.bo.SysDeptBo;
+import org.dromara.system.domain.bo.SysPostBo;
+import org.dromara.system.domain.bo.SysRoleBo;
+import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.vo.SysDeptVo;
 import org.dromara.system.domain.vo.SysPostVo;
 import org.dromara.system.domain.vo.SysRoleVo;
 import org.dromara.system.domain.vo.SysUserVo;
-import org.dromara.system.mapper.SysDeptMapper;
-import org.dromara.system.mapper.SysPostMapper;
-import org.dromara.system.mapper.SysRoleMapper;
-import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISysDeptService;
+import org.dromara.system.service.ISysPostService;
+import org.dromara.system.service.ISysRoleService;
+import org.dromara.system.service.ISysUserService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 工作流设计器获取任务执行人
@@ -37,10 +33,11 @@ import java.util.List;
 @Service
 public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
 
-    private final SysPostMapper postMapper;
-    private final SysDeptMapper deptMapper;
-    private final SysUserMapper userMapper;
-    private final SysRoleMapper roleMapper;
+    // 上级Service注入下级Service 其他Service永远不可能注入当前类 避免循环注入
+    private final ISysPostService postService;
+    private final ISysDeptService deptService;
+    private final ISysUserService userService;
+    private final ISysRoleService roleService;
 
     /**
      * 查询角色并返回任务指派的列表,支持分页
@@ -51,17 +48,15 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
     @Override
     public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) {
         PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
-        QueryWrapper<SysRole> wrapper = Wrappers.query();
-        wrapper.eq("r.del_flag", SystemConstants.NORMAL)
-            .eq("r.status", SystemConstants.NORMAL)
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "r.role_name", taskQuery.getHandlerCode())
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "r.role_key", taskQuery.getHandlerName())
-            .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
-                "r.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime())
-            .orderByAsc("r.role_sort").orderByAsc("r.create_time");
-        Page<SysRoleVo> page = roleMapper.selectPageRoleList(pageQuery.build(), wrapper);
+        SysRoleBo bo = new SysRoleBo();
+        bo.setRoleName(taskQuery.getHandlerCode());
+        bo.setRoleKey(taskQuery.getHandlerName());
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        TableDataInfo<SysRoleVo> page = roleService.selectPageRoleList(bo, pageQuery);
         // 使用封装的字段映射方法进行转换
-        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
             SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime);
         return new TaskAssigneeDTO(page.getTotal(), handlers);
     }
@@ -75,24 +70,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
     @Override
     public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) {
         PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
-        LambdaQueryWrapper<SysPost> wrapper = Wrappers.<SysPost>lambdaQuery()
-            .eq(SysPost::getStatus, SystemConstants.NORMAL)
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysPost::getPostCategory, taskQuery.getHandlerCode())
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysPost::getPostName, taskQuery.getHandlerName())
-            .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
-                SysPost::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime());
-        if (StringUtils.isNotBlank(taskQuery.getGroupId())) {
-            Long belongDeptId = Long.valueOf(taskQuery.getGroupId());
-            wrapper.and(x -> {
-                List<SysDept> deptList = deptMapper.selectListByParentId(belongDeptId);
-                List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
-                deptIds.add(belongDeptId);
-                x.in(SysPost::getDeptId, deptIds);
-            });
-        }
-        Page<SysPostVo> page = postMapper.selectPagePostList(pageQuery.build(), wrapper);
+        SysPostBo bo = new SysPostBo();
+        bo.setPostCategory(taskQuery.getHandlerCode());
+        bo.setPostName(taskQuery.getHandlerName());
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        bo.setBelongDeptId(Convert.toLong(taskQuery.getGroupId()));
+        TableDataInfo<SysPostVo> page = postService.selectPagePostList(bo, pageQuery);
         // 使用封装的字段映射方法进行转换
-        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
             SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime);
         return new TaskAssigneeDTO(page.getTotal(), handlers);
     }
@@ -106,30 +93,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
     @Override
     public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) {
         PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
-        LambdaQueryWrapper<SysDept> wrapper = Wrappers.<SysDept>lambdaQuery()
-            .eq(SysDept::getDelFlag, SystemConstants.NORMAL)
-            .eq(SysDept::getStatus, SystemConstants.NORMAL)
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), SysDept::getDeptCategory, taskQuery.getHandlerCode())
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), SysDept::getDeptName, taskQuery.getHandlerName())
-            .between(StringUtils.isNotBlank(taskQuery.getBeginTime()) && StringUtils.isNotBlank(taskQuery.getEndTime()),
-                SysDept::getCreateTime, taskQuery.getBeginTime(), taskQuery.getEndTime())
-            .orderByAsc(SysDept::getAncestors)
-            .orderByAsc(SysDept::getParentId)
-            .orderByAsc(SysDept::getOrderNum)
-            .orderByAsc(SysDept::getDeptId);
-        if (StringUtils.isNotBlank(taskQuery.getGroupId())) {
-            //部门树搜索
-            wrapper.and(x -> {
-                Long parentId = Long.valueOf(taskQuery.getGroupId());
-                List<SysDept> deptList = deptMapper.selectListByParentId(parentId);
-                List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
-                deptIds.add(parentId);
-                x.in(SysDept::getDeptId, deptIds);
-            });
-        }
-        Page<SysDeptVo> page = deptMapper.selectPageDeptList(pageQuery.build(), wrapper);
+        SysDeptBo bo = new SysDeptBo();
+        bo.setDeptCategory(taskQuery.getHandlerCode());
+        bo.setDeptName(taskQuery.getHandlerName());
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        bo.setBelongDeptId(Convert.toLong(taskQuery.getGroupId()));
+        TableDataInfo<SysDeptVo> page = deptService.selectPageDeptList(bo, pageQuery);
         // 使用封装的字段映射方法进行转换
-        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
             SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime);
         return new TaskAssigneeDTO(page.getTotal(), handlers);
     }
@@ -144,27 +117,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService {
     @Override
     public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) {
         PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
-        QueryWrapper<SysUser> wrapper = Wrappers.query();
-        wrapper.eq("u.del_flag", SystemConstants.NORMAL)
-            .eq("u.status", SystemConstants.NORMAL)
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerCode()), "u.user_name", taskQuery.getHandlerCode())
-            .like(StringUtils.isNotBlank(taskQuery.getHandlerName()), "u.nick_name", taskQuery.getHandlerName())
-            .between(taskQuery.getBeginTime() != null && taskQuery.getEndTime() != null,
-                "u.create_time", taskQuery.getBeginTime(), taskQuery.getEndTime())
-            .orderByAsc("u.user_id");
-        if (StringUtils.isNotBlank(taskQuery.getGroupId())) {
-            //部门树搜索
-            wrapper.and(x -> {
-                Long parentId = Long.valueOf(taskQuery.getGroupId());
-                List<SysDept> deptList = deptMapper.selectListByParentId(parentId);
-                List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
-                deptIds.add(parentId);
-                x.in("u.dept_id", deptIds);
-            });
-        }
-        Page<SysUserVo> page = userMapper.selectPageUserList(pageQuery.build(), wrapper);
+        SysUserBo bo = new SysUserBo();
+        bo.setUserName(taskQuery.getHandlerCode());
+        bo.setNickName(taskQuery.getHandlerName());
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        bo.setDeptId(Convert.toLong(taskQuery.getGroupId()));
+        TableDataInfo<SysUserVo> page = userService.selectPageUserList(bo, pageQuery);
         // 使用封装的字段映射方法进行转换
-        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(),
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
             SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime);
         return new TaskAssigneeDTO(page.getTotal(), handlers);
     }

+ 1 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java

@@ -21,7 +21,7 @@ public class FlowNextNodeBo implements Serializable {
     /**
      * 任务id
      */
-    private String taskId;
+    private Long taskId;
 
     /**
      * 流程变量

+ 1 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java

@@ -186,7 +186,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean deleteByBusinessIds(List<Long> businessIds) {
-        List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, businessIds));
+        List<FlowInstance> flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper<FlowInstance>().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds,Convert::toStr)));
         if (CollUtil.isEmpty(flowInstances)) {
             log.warn("未找到对应的流程实例信息,无法执行删除操作。");
             return false;

+ 40 - 55
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java

@@ -6,7 +6,6 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.dto.DictTypeDTO;
 import org.dromara.common.core.service.DictService;
-import org.dromara.common.core.utils.StringUtils;
 import org.dromara.warm.flow.ui.service.NodeExtService;
 import org.dromara.warm.flow.ui.vo.NodeExt;
 import org.dromara.workflow.common.ConditionalOnEnable;
@@ -37,11 +36,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
      */
     private static final String PERMISSION_TAB_NAME = "权限";
 
-    /**
-     * 枚举类型标识
-     */
-    private static final String ENUM_TYPE_PREFIX = "enum:";
-
     /**
      * 基础设置
      */
@@ -58,7 +52,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
     private static final Map<String, Map<String, Object>> CHILD_NODE_MAP = new HashMap<>();
 
     static {
-        CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getName(),
+        CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getSimpleName(),
             Map.of("label", "权限按钮", "type", 4, "must", false, "multiple", true));
     }
 
@@ -67,33 +61,41 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
     /**
      * 获取节点扩展属性
      *
-     * @return 结果
+     * @return 节点扩展属性列表
      */
     @Override
     public List<NodeExt> getNodeExt() {
         List<NodeExt> nodeExtList = new ArrayList<>();
         // 构建按钮权限页面
         nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB,
-            ENUM_TYPE_PREFIX + ButtonPermissionEnum.class.getName()));
+            List.of(ButtonPermissionEnum.class)));
         return nodeExtList;
     }
 
     /**
-     * 构建一个 NodeExt 对象
+     * 构建一个 `NodeExt` 对象
      *
-     * @param code        编码,此json中唯一
-     * @param name        名称,如果type为新页签时,作为页签名称
-     * @param type        节点类型,1:基础设置,2:新页签
-     * @param sourceTypes 字典/枚举类型来源(逗号分隔
-     * @return 返回构建的 NodeExt 对象
+     * @param code    唯一编码
+     * @param name    名称(新页签时,作为页签名称)
+     * @param type    节点类型(1: 基础设置,2: 新页签)
+     * @param sources 数据来源(枚举类或字典类型)
+     * @return 构建的 `NodeExt` 对象
      */
-    private NodeExt buildNodeExt(String code, String name, int type, String sourceTypes) {
+    @SuppressWarnings("unchecked cast")
+    private NodeExt buildNodeExt(String code, String name, int type, List<Object> sources) {
         NodeExt nodeExt = new NodeExt();
         nodeExt.setCode(code);
         nodeExt.setType(type);
         nodeExt.setName(name);
-        nodeExt.setChilds(StringUtils.splitList(sourceTypes)
-            .stream().map(this::buildChildNode)
+        nodeExt.setChilds(sources.stream()
+            .map(source -> {
+                if (source instanceof Class<?> clazz && NodeExtEnum.class.isAssignableFrom(clazz)) {
+                    return buildChildNode((Class<? extends NodeExtEnum>) clazz);
+                } else if (source instanceof String dictType) {
+                    return buildChildNode(dictType);
+                }
+                return null;
+            })
             .filter(ObjectUtil::isNotNull)
             .toList()
         );
@@ -101,52 +103,35 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
     }
 
     /**
-     * 构建一个 ChildNode 对象
+     * 根据枚举类型构建一个 `ChildNode` 对象
      *
-     * @param sourceType 字典类型
-     * @return 返回构建的 ChildNode 对象
+     * @param enumClass 枚举类,必须实现 `NodeExtEnum` 接口
+     * @return 构建的 `ChildNode` 对象
      */
-    private NodeExt.ChildNode buildChildNode(String sourceType) {
-        return sourceType.startsWith(ENUM_TYPE_PREFIX) ?
-            buildChildNodeFromEnum(sourceType.substring(ENUM_TYPE_PREFIX.length())) : buildChildNodeFromDict(sourceType);
-    }
-
-    /**
-     * 根据枚举构建一个 ChildNode 对象
-     *
-     * @param enumClassName 枚举名称
-     * @return 返回构建好的 ChildNode 对象
-     */
-    private NodeExt.ChildNode buildChildNodeFromEnum(String enumClassName) {
-        try {
-            Class<?> enumClass = Class.forName(enumClassName);
-            if (!enumClass.isEnum()) {
-                return null;
-            }
-            NodeExt.ChildNode childNode = buildChildNodeMap(enumClassName);
-            // 编码,此json中唯
-            childNode.setCode(ENUM_TYPE_PREFIX + enumClassName);
-            // 字典,下拉框和复选框时用到
-            childNode.setDict(Arrays.stream(enumClass.getEnumConstants())
-                .filter(NodeExtEnum.class::isInstance)
-                .map(NodeExtEnum.class::cast)
-                .map(x ->
-                    new NodeExt.DictItem(x.getLabel(), x.getValue(), x.isSelected())
-                ).toList());
-            return childNode;
-        } catch (ClassNotFoundException e) {
-            log.error("Enum class not found: {}", enumClassName, e);
+    private NodeExt.ChildNode buildChildNode(Class<? extends NodeExtEnum> enumClass) {
+        if (!enumClass.isEnum()) {
+            return null;
         }
-        return null;
+        String simpleName = enumClass.getSimpleName();
+        NodeExt.ChildNode childNode = buildChildNodeMap(simpleName);
+        // 编码,此json中唯
+        childNode.setCode(simpleName);
+        // 字典,下拉框和复选框时用到
+        childNode.setDict(Arrays.stream(enumClass.getEnumConstants())
+            .map(NodeExtEnum.class::cast)
+            .map(x ->
+                new NodeExt.DictItem(x.getLabel(), x.getValue(), x.isSelected())
+            ).toList());
+        return childNode;
     }
 
     /**
-     * 根据字典构建一个 ChildNode 对象
+     * 根据字典类型构建 `ChildNode` 对象
      *
      * @param dictType 字典类型
-     * @return 返回构建好的 ChildNode 对象
+     * @return 构建的 `ChildNode` 对象
      */
-    private NodeExt.ChildNode buildChildNodeFromDict(String dictType) {
+    private NodeExt.ChildNode buildChildNode(String dictType) {
         DictTypeDTO dictTypeDTO = dictService.getDictType(dictType);
         if (ObjectUtil.isNull(dictTypeDTO)) {
             return null;

+ 16 - 6
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.workflow.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -25,9 +26,7 @@ import org.dromara.workflow.common.enums.TaskAssigneeEnum;
 import org.dromara.workflow.service.IFlwTaskAssigneeService;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * 流程设计器-获取办理人权限设置列表
@@ -132,15 +131,26 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
     @Override
     public List<UserDTO> fetchUsersByStorageId(String storageId) {
         List<UserDTO> list = new ArrayList<>();
+        Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
         for (String str : storageId.split(StrUtil.COMMA)) {
             String[] parts = str.split(StrUtil.COLON, 2);
+            TaskAssigneeEnum type;
+            Long id;
             if (parts.length < 2) {
-                list.addAll(getUsersByType(TaskAssigneeEnum.USER, List.of(Long.valueOf(parts[0]))));
+                // 无前缀时默认是用户类型
+                type = TaskAssigneeEnum.USER;
+                id = Long.valueOf(parts[0]);
             } else {
-                list.addAll(getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))));
+                // 根据前缀解析类型(如 "role:123" -> ROLE 类型)
+                type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON);
+                id = Long.valueOf(parts[1]);
             }
+            typeIdMap.computeIfAbsent(type, k -> new ArrayList<>()).add(id);
         }
-        return list;
+        typeIdMap.entrySet().stream()
+            .filter(entry -> CollUtil.isNotEmpty(entry.getValue()))
+            .forEach(entry -> list.addAll(getUsersByType(entry.getKey(), entry.getValue())));
+        return list.stream().distinct().toList();
     }
 
     /**

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

@@ -575,7 +575,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
      */
     @Override
     public List<FlowNode> getNextNodeList(FlowNextNodeBo bo) {
-        String taskId = bo.getTaskId();
+        Long taskId = bo.getTaskId();
         Map<String, Object> variables = bo.getVariables();
         Task task = taskService.getById(taskId);
         Instance instance = insService.getById(task.getInstanceId());

+ 1 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java

@@ -54,7 +54,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
      * @return boolean
      */
     public boolean eval(Integer leaveDays) {
-        if (leaveDays < 2) {
+        if (leaveDays <= 2) {
             return true;
         }
         return false;

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

@@ -98,7 +98,7 @@ services:
     network_mode: "host"
 
   ruoyi-server1:
-    image: ruoyi/ruoyi-server:5.3.1-BETA
+    image: ruoyi/ruoyi-server:5.3.1-BETA2
     container_name: ruoyi-server1
     environment:
       # 时区上海
@@ -113,7 +113,7 @@ services:
     network_mode: "host"
 
   ruoyi-server2:
-    image: ruoyi/ruoyi-server:5.3.1-BETA
+    image: ruoyi/ruoyi-server:5.3.1-BETA2
     container_name: ruoyi-server2
     environment:
       # 时区上海
@@ -128,7 +128,7 @@ services:
     network_mode: "host"
 
   ruoyi-monitor-admin:
-    image: ruoyi/ruoyi-monitor-admin:5.3.1-BETA
+    image: ruoyi/ruoyi-monitor-admin:5.3.1-BETA2
     container_name: ruoyi-monitor-admin
     environment:
       # 时区上海
@@ -140,7 +140,7 @@ services:
     network_mode: "host"
 
   ruoyi-snailjob-server:
-    image: ruoyi/ruoyi-snailjob-server:5.3.1-BETA
+    image: ruoyi/ruoyi-snailjob-server:5.3.1-BETA2
     container_name: ruoyi-snailjob-server
     environment:
       # 时区上海

+ 7 - 7
script/leave/leave1.json

@@ -1,7 +1,7 @@
 {
   "flowCode" : "leave1",
   "flowName" : "请假申请-普通",
-  "category" : "1",
+  "category" : "100",
   "version" : "1",
   "formCustom" : "N",
   "formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
     "nodeName" : "开始",
     "nodeRatio" : 0.000,
     "coordinate" : "200,200|200,200",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
       "nextNodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
@@ -25,8 +25,8 @@
     "nodeName" : "申请人",
     "nodeRatio" : 0.000,
     "coordinate" : "360,200|360,200",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "dd515cdd-59f6-446f-94ca-25ca062afb42",
       "nextNodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
@@ -40,8 +40,8 @@
     "permissionFlag" : "role:1",
     "nodeRatio" : 0.000,
     "coordinate" : "540,200|540,200",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "78fa8e5b-e809-44ed-978a-41092409ebcf",
       "nextNodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
@@ -55,8 +55,8 @@
     "permissionFlag" : "role:3,role:4",
     "nodeRatio" : 0.000,
     "coordinate" : "720,200|720,200",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe",
       "nextNodeCode" : "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
@@ -69,7 +69,7 @@
     "nodeName" : "结束",
     "nodeRatio" : 0.000,
     "coordinate" : "900,200|900,200",
-    "skipAnyNode" : "N",
-    "formCustom" : "N"
+    "formCustom" : "N",
+    "ext" : "[]"
   } ]
 }

+ 10 - 10
script/leave/leave2.json

@@ -1,7 +1,7 @@
 {
   "flowCode" : "leave2",
   "flowName" : "请假申请-排他网关",
-  "category" : "1",
+  "category" : "100",
   "version" : "1",
   "formCustom" : "N",
   "formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
     "nodeName" : "开始",
     "nodeRatio" : 0.000,
     "coordinate" : "300,240|300,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
       "nextNodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
@@ -25,8 +25,8 @@
     "nodeName" : "申请人",
     "nodeRatio" : 0.000,
     "coordinate" : "440,240|440,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "fdcae93b-b69c-498a-b231-09255e74bcbd",
       "nextNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
@@ -38,8 +38,8 @@
     "nodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
     "nodeRatio" : 0.000,
     "coordinate" : "560,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
       "nextNodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
@@ -61,8 +61,8 @@
     "permissionFlag" : "3,4",
     "nodeRatio" : 0.000,
     "coordinate" : "720,320|720,320",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86",
       "nextNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
@@ -76,8 +76,8 @@
     "permissionFlag" : "role:1",
     "nodeRatio" : 0.000,
     "coordinate" : "860,240|860,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
       "nextNodeCode" : "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
@@ -90,8 +90,8 @@
     "nodeName" : "结束",
     "nodeRatio" : 0.000,
     "coordinate" : "1000,240|1000,240",
-    "skipAnyNode" : "N",
-    "formCustom" : "N"
+    "formCustom" : "N",
+    "ext" : "[]"
   }, {
     "nodeType" : 1,
     "nodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
@@ -99,8 +99,8 @@
     "permissionFlag" : "role:1",
     "nodeRatio" : 0.000,
     "coordinate" : "720,160|720,160",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "5ed2362b-fc0c-4d52-831f-95208b830605",
       "nextNodeCode" : "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
@@ -108,4 +108,4 @@
       "coordinate" : "770,160;860,160;860,200"
     } ]
   } ]
-}
+}

+ 10 - 10
script/leave/leave3.json

@@ -1,7 +1,7 @@
 {
   "flowCode" : "leave3",
   "flowName" : "请假申请-并行网关",
-  "category" : "1",
+  "category" : "100",
   "version" : "1",
   "formCustom" : "N",
   "formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
     "nodeName" : "开始",
     "nodeRatio" : 0.000,
     "coordinate" : "380,220|380,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
       "nextNodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
@@ -25,8 +25,8 @@
     "nodeName" : "申请人",
     "nodeRatio" : 0.000,
     "coordinate" : "520,220|520,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "b7bbb571-06de-455c-8083-f83c07bf0b99",
       "nextNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
@@ -38,8 +38,8 @@
     "nodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
     "nodeRatio" : 0.000,
     "coordinate" : "680,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
       "nextNodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
@@ -58,8 +58,8 @@
     "permissionFlag" : "role:1",
     "nodeRatio" : 0.000,
     "coordinate" : "800,140|800,140",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "4b7743cd-940c-431b-926f-e7b614fbf1fe",
       "nextNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
@@ -71,8 +71,8 @@
     "nodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
     "nodeRatio" : 0.000,
     "coordinate" : "920,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
       "nextNodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
@@ -86,8 +86,8 @@
     "permissionFlag" : "1",
     "nodeRatio" : 0.000,
     "coordinate" : "1040,220|1040,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "23e7429e-2b47-4431-b93e-40db7c431ce6",
       "nextNodeCode" : "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
@@ -100,8 +100,8 @@
     "nodeName" : "结束",
     "nodeRatio" : 0.000,
     "coordinate" : "1160,220|1160,220",
-    "skipAnyNode" : "N",
-    "formCustom" : "N"
+    "formCustom" : "N",
+    "ext" : "[]"
   }, {
     "nodeType" : 1,
     "nodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
@@ -109,8 +109,8 @@
     "permissionFlag" : "role:3,role:4",
     "nodeRatio" : 0.000,
     "coordinate" : "800,300|800,300",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394",
       "nextNodeCode" : "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",

+ 8 - 8
script/leave/leave4.json

@@ -1,7 +1,7 @@
 {
   "flowCode" : "leave4",
   "flowName" : "请假申请-会签",
-  "category" : "1",
+  "category" : "100",
   "version" : "1",
   "formCustom" : "N",
   "formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
     "nodeName" : "开始",
     "nodeRatio" : 0.000,
     "coordinate" : "320,240|320,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
       "nextNodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
@@ -25,8 +25,8 @@
     "nodeName" : "申请人",
     "nodeRatio" : 0.000,
     "coordinate" : "460,240|460,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "e90b98ef-35b4-410c-a663-bae8b7624b9f",
       "nextNodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
@@ -40,8 +40,8 @@
     "permissionFlag" : "${userList}",
     "nodeRatio" : 60.000,
     "coordinate" : "640,240|640,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "768b5b1a-6726-4d67-8853-4cc70d5b1045",
       "nextNodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
@@ -55,8 +55,8 @@
     "permissionFlag" : "role:1,role:3",
     "nodeRatio" : 100.000,
     "coordinate" : "820,240|820,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
       "nextNodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
@@ -70,8 +70,8 @@
     "permissionFlag" : "1",
     "nodeRatio" : 0.000,
     "coordinate" : "1000,240|1000,240",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
       "nextNodeCode" : "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
@@ -84,7 +84,7 @@
     "nodeName" : "结束",
     "nodeRatio" : 0.000,
     "coordinate" : "1120,240|1120,240",
-    "skipAnyNode" : "N",
-    "formCustom" : "N"
+    "formCustom" : "N",
+    "ext" : "[]"
   } ]
 }

+ 10 - 10
script/leave/leave5.json

@@ -1,7 +1,7 @@
 {
   "flowCode" : "leave5",
   "flowName" : "请假申请-并行会签网关",
-  "category" : "1",
+  "category" : "100",
   "version" : "1",
   "formCustom" : "N",
   "formPath" : "/workflow/leaveEdit/index",
@@ -11,8 +11,8 @@
     "nodeName" : "开始",
     "nodeRatio" : 0.000,
     "coordinate" : "300,220|300,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
       "nextNodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
@@ -25,8 +25,8 @@
     "nodeName" : "申请人",
     "nodeRatio" : 0.000,
     "coordinate" : "420,220|420,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "e1b04e96-dc81-4858-a309-2fe945d2f374",
       "nextNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
@@ -38,8 +38,8 @@
     "nodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
     "nodeRatio" : 0.000,
     "coordinate" : "560,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
       "nextNodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
@@ -58,8 +58,8 @@
     "permissionFlag" : "role:1,role:3",
     "nodeRatio" : 100.000,
     "coordinate" : "700,320|700,320",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
       "nextNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
@@ -71,8 +71,8 @@
     "nodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
     "nodeRatio" : 0.000,
     "coordinate" : "860,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",
       "nextNodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
@@ -86,8 +86,8 @@
     "permissionFlag" : "1",
     "nodeRatio" : 0.000,
     "coordinate" : "1000,220|1000,220",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "7a8f0473-e409-442e-a843-5c2b813d00e9",
       "nextNodeCode" : "03c4d2bc-58b5-4408-a2e4-65afb046f169",
@@ -100,8 +100,8 @@
     "nodeName" : "结束",
     "nodeRatio" : 0.000,
     "coordinate" : "1140,220|1140,220",
-    "skipAnyNode" : "N",
-    "formCustom" : "N"
+    "formCustom" : "N",
+    "ext" : "[]"
   }, {
     "nodeType" : 1,
     "nodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
@@ -109,8 +109,8 @@
     "permissionFlag" : "${userList}",
     "nodeRatio" : 60.000,
     "coordinate" : "700,120|700,120",
-    "skipAnyNode" : "N",
     "formCustom" : "N",
+    "ext" : "[]",
     "skipList" : [ {
       "nowNodeCode" : "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
       "nextNodeCode" : "1a20169e-3d82-4926-a151-e2daad28de1b",

+ 13 - 10
script/leave/leave6.json

@@ -2,7 +2,7 @@
   "flowCode" : "leave6",
   "flowName" : "请假申请-排他并行会签",
   "category" : "100",
-  "version" : "4",
+  "version" : "1",
   "formCustom" : "N",
   "formPath" : "/workflow/leaveEdit/index",
   "nodeList" : [ {
@@ -25,7 +25,8 @@
     "nodeName" : "申请人",
     "nodeRatio" : 0.000,
     "coordinate" : "400,300|400,300",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+    "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
       "nextNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742",
@@ -39,7 +40,8 @@
     "permissionFlag" : "role:1@@role:3@@role:4",
     "nodeRatio" : 0.000,
     "coordinate" : "860,200|860,200",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+    "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
       "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32",
@@ -54,7 +56,7 @@
     "nodeRatio" : 0.000,
     "coordinate" : "860,400|860,400",
     "formCustom" : "N",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
       "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32",
@@ -68,7 +70,8 @@
     "permissionFlag" : "1",
     "nodeRatio" : 0.000,
     "coordinate" : "560,300|560,300",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination,copy,trust,transfer\"}]",
+    "formCustom" : "N",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,transfer,copy,pop\"}]",
     "skipList" : [ {
       "nowNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742",
       "nextNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13",
@@ -117,7 +120,7 @@
     "nodeRatio" : 100.000,
     "coordinate" : "1180,300|1180,300",
     "formCustom" : "N",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination,pop,addSign,subSign\"}]",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,pop,addSign,subSign\"}]",
     "skipList" : [ {
       "nowNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496",
       "nextNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992",
@@ -150,7 +153,7 @@
     "nodeRatio" : 0.000,
     "coordinate" : "1480,200|1480,200",
     "formCustom" : "N",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4",
       "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519",
@@ -165,7 +168,7 @@
     "nodeRatio" : 0.000,
     "coordinate" : "1480,400|1480,400",
     "formCustom" : "N",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
       "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519",
@@ -193,7 +196,7 @@
     "nodeRatio" : 0.000,
     "coordinate" : "1820,300|1820,300",
     "formCustom" : "N",
-    "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
+    "ext" : "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
     "skipList" : [ {
       "nowNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828",
       "nextNodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
@@ -209,4 +212,4 @@
     "formCustom" : "N",
     "ext" : "[]"
   } ]
-}
+}

+ 139 - 136
script/sql/oracle/oracle_ry_job.sql

@@ -1,8 +1,9 @@
+
 /*
  SnailJob Database Transfer Tool
  Source Server Type    : MySQL
  Target Server Type    : Oracle
- Date: 2024-12-27 22:22:15
+ Date: 2025-02-25 22:16:28
 */
 
 
@@ -48,7 +49,6 @@ CREATE TABLE sj_group_config
     group_partition   number                                                      NOT NULL,
     id_generator_mode smallint      DEFAULT 1                                     NOT NULL,
     init_scene        smallint      DEFAULT 0                                     NOT NULL,
-    bucket_index      number        DEFAULT 0                                     NOT NULL,
     create_dt         date          DEFAULT CURRENT_TIMESTAMP                     NOT NULL,
     update_dt         date          DEFAULT CURRENT_TIMESTAMP                     NOT NULL
 );
@@ -68,13 +68,12 @@ COMMENT ON COLUMN sj_group_config.version IS '版本号';
 COMMENT ON COLUMN sj_group_config.group_partition IS '分区';
 COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式';
 COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是';
-COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket';
 COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间';
 COMMENT ON TABLE sj_group_config IS '组配置';
 
-INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, sysdate, sysdate);
-INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES ('prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, sysdate, sysdate);
+INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1,  sysdate, sysdate);
+INSERT INTO sj_group_config (namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES ('prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1,  sysdate, sysdate);
 
 -- sj_notify_config
 CREATE TABLE sj_notify_config
@@ -144,12 +143,11 @@ COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间';
 COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人';
 
--- sj_retry_dead_letter_0
-CREATE TABLE sj_retry_dead_letter_0
+-- sj_retry_dead_letter
+CREATE TABLE sj_retry_dead_letter
 (
     id            number GENERATED ALWAYS AS IDENTITY,
     namespace_id  varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
-    unique_id     varchar2(64)                                             NULL,
     group_name    varchar2(64)                                             NULL,
     scene_name    varchar2(64)                                             NULL,
     idempotent_id varchar2(64)                                             NULL,
@@ -157,40 +155,34 @@ CREATE TABLE sj_retry_dead_letter_0
     executor_name varchar2(512) DEFAULT ''                                 NULL,
     args_str      clob                                                     NULL,
     ext_attrs     clob                                                     NULL,
-    task_type     smallint      DEFAULT 1                                  NOT NULL,
     create_dt     date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL
 );
 
-ALTER TABLE sj_retry_dead_letter_0
-    ADD CONSTRAINT pk_sj_retry_dead_letter_0 PRIMARY KEY (id);
-
-CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id);
-
-CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name);
-CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id);
-CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no);
-CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt);
-
-COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键';
-COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id';
-COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一';
-COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称';
-COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id';
-COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号';
-COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称';
-COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数';
-COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段';
-COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据';
-COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间';
-COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表';
-
--- sj_retry_task_0
-CREATE TABLE sj_retry_task_0
+ALTER TABLE sj_retry_dead_letter
+    ADD CONSTRAINT pk_sj_retry_dead_letter PRIMARY KEY (id);
+
+CREATE INDEX idx_sj_retry_dead_letter_01 ON sj_retry_dead_letter (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id);
+CREATE INDEX idx_sj_retry_dead_letter_03 ON sj_retry_dead_letter (biz_no);
+CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt);
+
+COMMENT ON COLUMN sj_retry_dead_letter.id IS '主键';
+COMMENT ON COLUMN sj_retry_dead_letter.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_dead_letter.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_dead_letter.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_dead_letter.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_dead_letter.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_dead_letter.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_dead_letter.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_dead_letter.create_dt IS '创建时间';
+COMMENT ON TABLE sj_retry_dead_letter IS '死信队列表';
+
+-- sj_retry
+CREATE TABLE sj_retry
 (
     id              number GENERATED ALWAYS AS IDENTITY,
     namespace_id    varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
-    unique_id       varchar2(64)                                             NULL,
     group_name      varchar2(64)                                             NULL,
     scene_name      varchar2(64)                                             NULL,
     idempotent_id   varchar2(64)                                             NULL,
@@ -198,112 +190,113 @@ CREATE TABLE sj_retry_task_0
     executor_name   varchar2(512) DEFAULT ''                                 NULL,
     args_str        clob                                                     NULL,
     ext_attrs       clob                                                     NULL,
-    next_trigger_at date                                                     NOT NULL,
+    next_trigger_at number                                                   NOT NULL,
     retry_count     number        DEFAULT 0                                  NOT NULL,
     retry_status    smallint      DEFAULT 0                                  NOT NULL,
     task_type       smallint      DEFAULT 1                                  NOT NULL,
+    bucket_index    number        DEFAULT 0                                  NOT NULL,
+    parent_id       number        DEFAULT 0                                  NOT NULL,
+    deleted         number        DEFAULT 0                                  NOT NULL,
     create_dt       date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
     update_dt       date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL
 );
 
-ALTER TABLE sj_retry_task_0
-    ADD CONSTRAINT pk_sj_retry_task_0 PRIMARY KEY (id);
-
-CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id);
-
-CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name);
-CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type);
-CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status);
-CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id);
-CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no);
-CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt);
-
-COMMENT ON COLUMN sj_retry_task_0.id IS '主键';
-COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id';
-COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一';
-COMMENT ON COLUMN sj_retry_task_0.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称';
-COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id';
-COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号';
-COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称';
-COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数';
-COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段';
-COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间';
-COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数';
-COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
-COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据';
-COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间';
-COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间';
-COMMENT ON TABLE sj_retry_task_0 IS '任务表';
-
--- sj_retry_task_log
-CREATE TABLE sj_retry_task_log
+ALTER TABLE sj_retry
+    ADD CONSTRAINT pk_sj_retry PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted);
+
+CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status);
+CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id);
+CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no);
+CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id);
+CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt);
+
+COMMENT ON COLUMN sj_retry.id IS '主键';
+COMMENT ON COLUMN sj_retry.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_retry.retry_count IS '重试次数';
+COMMENT ON COLUMN sj_retry.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
+COMMENT ON COLUMN sj_retry.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_retry.parent_id IS '父节点id';
+COMMENT ON COLUMN sj_retry.deleted IS '逻辑删除';
+COMMENT ON COLUMN sj_retry.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry IS '重试信息表';
+
+-- sj_retry_task
+CREATE TABLE sj_retry_task
 (
-    id            number GENERATED ALWAYS AS IDENTITY,
-    namespace_id  varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
-    unique_id     varchar2(64)                                             NULL,
-    group_name    varchar2(64)                                             NULL,
-    scene_name    varchar2(64)                                             NULL,
-    idempotent_id varchar2(64)                                             NULL,
-    biz_no        varchar2(64)  DEFAULT ''                                 NULL,
-    executor_name varchar2(512) DEFAULT ''                                 NULL,
-    args_str      clob                                                     NULL,
-    ext_attrs     clob                                                     NULL,
-    retry_status  smallint      DEFAULT 0                                  NOT NULL,
-    task_type     smallint      DEFAULT 1                                  NOT NULL,
-    create_dt     date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
-    update_dt     date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+    id               number GENERATED ALWAYS AS IDENTITY,
+    namespace_id     varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name       varchar2(64)                                             NULL,
+    scene_name       varchar2(64)                                             NULL,
+    retry_id         number                                                   NOT NULL,
+    ext_attrs        clob                                                     NULL,
+    task_status      smallint      DEFAULT 1                                  NOT NULL,
+    task_type        smallint      DEFAULT 1                                  NOT NULL,
+    operation_reason smallint      DEFAULT 0                                  NOT NULL,
+    client_info      varchar2(128) DEFAULT NULL                               NULL,
+    create_dt        date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt        date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL
 );
 
-ALTER TABLE sj_retry_task_log
-    ADD CONSTRAINT pk_sj_retry_task_log PRIMARY KEY (id);
-
-CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name);
-CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status);
-CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id);
-CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id);
-CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no);
-CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt);
-
-COMMENT ON COLUMN sj_retry_task_log.id IS '主键';
-COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id';
-COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一';
-COMMENT ON COLUMN sj_retry_task_log.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称';
-COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id';
-COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号';
-COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称';
-COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数';
-COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段';
-COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数';
-COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据';
-COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间';
-COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间';
-COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表';
+ALTER TABLE sj_retry_task
+    ADD CONSTRAINT pk_sj_retry_task PRIMARY KEY (id);
+
+CREATE INDEX idx_sj_retry_task_01 ON sj_retry_task (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status);
+CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt);
+CREATE INDEX idx_sj_retry_task_04 ON sj_retry_task (retry_id);
+
+COMMENT ON COLUMN sj_retry_task.id IS '主键';
+COMMENT ON COLUMN sj_retry_task.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_task.retry_id IS '重试信息Id';
+COMMENT ON COLUMN sj_retry_task.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_task.task_status IS '重试状态';
+COMMENT ON COLUMN sj_retry_task.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_task.operation_reason IS '操作原因';
+COMMENT ON COLUMN sj_retry_task.client_info IS '客户端地址 clientId#ip:port';
+COMMENT ON COLUMN sj_retry_task.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_task.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_task IS '重试任务表';
 
 -- sj_retry_task_log_message
 CREATE TABLE sj_retry_task_log_message
 (
-    id           number GENERATED ALWAYS AS IDENTITY,
-    namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
-    group_name   varchar2(64)                                            NULL,
-    unique_id    varchar2(64)                                            NULL,
-    message      clob                                                    NULL,
-    log_num      number       DEFAULT 1                                  NOT NULL,
-    real_time    number       DEFAULT 0                                  NOT NULL,
-    create_dt    date         DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+    id            number GENERATED ALWAYS AS IDENTITY,
+    namespace_id  varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    group_name    varchar2(64)                                            NULL,
+    retry_id      number                                                  NOT NULL,
+    retry_task_id number                                                  NOT NULL,
+    message       clob                                                    NULL,
+    log_num       number       DEFAULT 1                                  NOT NULL,
+    real_time     number       DEFAULT 0                                  NOT NULL,
+    create_dt     date         DEFAULT CURRENT_TIMESTAMP                  NOT NULL
 );
 
 ALTER TABLE sj_retry_task_log_message
     ADD CONSTRAINT pk_sj_retry_task_log_message PRIMARY KEY (id);
 
-CREATE INDEX idx_sj_rt_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id);
+CREATE INDEX idx_sj_rt_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, retry_task_id);
 CREATE INDEX idx_sj_rt_log_message_02 ON sj_retry_task_log_message (create_dt);
 
 COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键';
 COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id';
 COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_log_message.retry_id IS '重试信息Id';
+COMMENT ON COLUMN sj_retry_task_log_message.retry_task_id IS '重试任务Id';
 COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息';
 COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量';
 COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间';
@@ -313,21 +306,26 @@ COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表
 -- sj_retry_scene_config
 CREATE TABLE sj_retry_scene_config
 (
-    id               number GENERATED ALWAYS AS IDENTITY,
-    namespace_id     varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
-    scene_name       varchar2(64)                                             NULL,
-    group_name       varchar2(64)                                             NULL,
-    scene_status     smallint      DEFAULT 0                                  NOT NULL,
-    max_retry_count  number        DEFAULT 5                                  NOT NULL,
-    back_off         smallint      DEFAULT 1                                  NOT NULL,
-    trigger_interval varchar2(16)  DEFAULT ''                                 NULL,
-    notify_ids       varchar2(128) DEFAULT ''                                 NULL,
-    deadline_request number        DEFAULT 60000                              NOT NULL,
-    executor_timeout number        DEFAULT 5                                  NOT NULL,
-    route_key        smallint      DEFAULT 4                                  NOT NULL,
-    description      varchar2(256) DEFAULT ''                                 NULL,
-    create_dt        date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
-    update_dt        date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL
+    id                  number GENERATED ALWAYS AS IDENTITY,
+    namespace_id        varchar2(64)  DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL,
+    scene_name          varchar2(64)                                             NULL,
+    group_name          varchar2(64)                                             NULL,
+    scene_status        smallint      DEFAULT 0                                  NOT NULL,
+    max_retry_count     number        DEFAULT 5                                  NOT NULL,
+    back_off            smallint      DEFAULT 1                                  NOT NULL,
+    trigger_interval    varchar2(16)  DEFAULT ''                                 NULL,
+    notify_ids          varchar2(128) DEFAULT ''                                 NULL,
+    deadline_request    number        DEFAULT 60000                              NOT NULL,
+    executor_timeout    number        DEFAULT 5                                  NOT NULL,
+    route_key           smallint      DEFAULT 4                                  NOT NULL,
+    block_strategy      smallint      DEFAULT 1                                  NOT NULL,
+    cb_status           smallint      DEFAULT 0                                  NOT NULL,
+    cb_trigger_type     smallint      DEFAULT 1                                  NOT NULL,
+    cb_max_count        number        DEFAULT 16                                 NOT NULL,
+    cb_trigger_interval varchar2(16)  DEFAULT ''                                 NULL,
+    description         varchar2(256) DEFAULT ''                                 NULL,
+    create_dt           date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL,
+    update_dt           date          DEFAULT CURRENT_TIMESTAMP                  NOT NULL
 );
 
 ALTER TABLE sj_retry_scene_config
@@ -347,6 +345,11 @@ COMMENT ON COLUMN sj_retry_scene_config.notify_ids IS '通知告警场景配置i
 COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒';
 COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒';
 COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略';
+COMMENT ON COLUMN sj_retry_scene_config.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_retry_scene_config.cb_status IS '回调状态 0、不开启 1、开启';
+COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_type IS '1、默认等级 2、固定间隔时间 3、CRON 表达式';
+COMMENT ON COLUMN sj_retry_scene_config.cb_max_count IS '回调的最大执行次数';
+COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_interval IS '回调的最大执行次数';
 COMMENT ON COLUMN sj_retry_scene_config.description IS '描述';
 COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间';
@@ -538,11 +541,11 @@ COMMENT ON COLUMN sj_job.executor_type IS '执行器类型';
 COMMENT ON COLUMN sj_job.executor_info IS '执行器名称';
 COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
 COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长';
-COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复';
 COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒';
 COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数';
 COMMENT ON COLUMN sj_job.parallel_num IS '并行数';
-COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) ';
+COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s)';
 COMMENT ON COLUMN sj_job.bucket_index IS 'bucket';
 COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务';
 COMMENT ON COLUMN sj_job.notify_ids IS '通知告警场景配置id列表';
@@ -721,7 +724,7 @@ CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name,
 COMMENT ON COLUMN sj_job_summary.id IS '主键';
 COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id';
 COMMENT ON COLUMN sj_job_summary.group_name IS '组名称';
-COMMENT ON COLUMN sj_job_summary.business_id IS '业务id  ( job_id或workflow_id ) ';
+COMMENT ON COLUMN sj_job_summary.business_id IS '业务id  ( job_id或workflow_id)';
 COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
 COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间';
 COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量';

+ 1 - 0
script/sql/oracle/oracle_ry_workflow.sql

@@ -278,6 +278,7 @@ comment on column FLOW_USER.DEL_FLAG is '删除标志';
 comment on column FLOW_USER.TENANT_ID is '租户id';
 
 create index USER_PROCESSED_TYPE on FLOW_USER (PROCESSED_BY, TYPE);
+create index USER_ASSOCIATED_IDX on FLOW_USER (ASSOCIATED);
 
 -- ----------------------------
 -- 流程分类表

+ 130 - 128
script/sql/postgres/postgres_ry_job.sql

@@ -2,7 +2,7 @@
  SnailJob Database Transfer Tool
  Source Server Type    : MySQL
  Target Server Type    : PostgreSQL
- Date: 2024-12-27 22:13:49
+ Date: 2025-02-25 22:15:32
 */
 
 
@@ -45,7 +45,6 @@ CREATE TABLE sj_group_config
     group_partition   int          NOT NULL,
     id_generator_mode smallint     NOT NULL DEFAULT 1,
     init_scene        smallint     NOT NULL DEFAULT 0,
-    bucket_index      int          NOT NULL DEFAULT 0,
     create_dt         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
     update_dt         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
@@ -62,13 +61,12 @@ COMMENT ON COLUMN sj_group_config.version IS '版本号';
 COMMENT ON COLUMN sj_group_config.group_partition IS '分区';
 COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式';
 COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是';
-COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket';
 COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间';
 COMMENT ON TABLE sj_group_config IS '组配置';
 
-INSERT INTO sj_group_config VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
-INSERT INTO sj_group_config VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
+INSERT INTO sj_group_config VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1,  now(), now());
+INSERT INTO sj_group_config VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1,  now(), now());
 
 -- sj_notify_config
 CREATE TABLE sj_notify_config
@@ -132,12 +130,11 @@ COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间';
 COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人';
 
--- sj_retry_dead_letter_0
-CREATE TABLE sj_retry_dead_letter_0
+-- sj_retry_dead_letter
+CREATE TABLE sj_retry_dead_letter
 (
     id            bigserial PRIMARY KEY,
     namespace_id  varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    unique_id     varchar(64)  NOT NULL,
     group_name    varchar(64)  NOT NULL,
     scene_name    varchar(64)  NOT NULL,
     idempotent_id varchar(64)  NOT NULL,
@@ -145,37 +142,31 @@ CREATE TABLE sj_retry_dead_letter_0
     executor_name varchar(512) NOT NULL DEFAULT '',
     args_str      text         NOT NULL,
     ext_attrs     text         NOT NULL,
-    task_type     smallint     NOT NULL DEFAULT 1,
     create_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
 
-CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id);
-
-CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name);
-CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id);
-CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no);
-CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt);
-
-COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键';
-COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id';
-COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一';
-COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称';
-COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id';
-COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号';
-COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称';
-COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数';
-COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段';
-COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据';
-COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间';
-COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表';
-
--- sj_retry_task_0
-CREATE TABLE sj_retry_task_0
+CREATE INDEX idx_sj_retry_dead_letter_01 ON sj_retry_dead_letter (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id);
+CREATE INDEX idx_sj_retry_dead_letter_03 ON sj_retry_dead_letter (biz_no);
+CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt);
+
+COMMENT ON COLUMN sj_retry_dead_letter.id IS '主键';
+COMMENT ON COLUMN sj_retry_dead_letter.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_dead_letter.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_dead_letter.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry_dead_letter.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry_dead_letter.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry_dead_letter.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry_dead_letter.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_dead_letter.create_dt IS '创建时间';
+COMMENT ON TABLE sj_retry_dead_letter IS '死信队列表';
+
+-- sj_retry
+CREATE TABLE sj_retry
 (
     id              bigserial PRIMARY KEY,
     namespace_id    varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    unique_id       varchar(64)  NOT NULL,
     group_name      varchar(64)  NOT NULL,
     scene_name      varchar(64)  NOT NULL,
     idempotent_id   varchar(64)  NOT NULL,
@@ -183,103 +174,104 @@ CREATE TABLE sj_retry_task_0
     executor_name   varchar(512) NOT NULL DEFAULT '',
     args_str        text         NOT NULL,
     ext_attrs       text         NOT NULL,
-    next_trigger_at timestamp    NOT NULL,
+    next_trigger_at bigint       NOT NULL,
     retry_count     int          NOT NULL DEFAULT 0,
     retry_status    smallint     NOT NULL DEFAULT 0,
     task_type       smallint     NOT NULL DEFAULT 1,
+    bucket_index    int          NOT NULL DEFAULT 0,
+    parent_id       bigint       NOT NULL DEFAULT 0,
+    deleted         bigint       NOT NULL DEFAULT 0,
     create_dt       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
     update_dt       timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
 
-CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id);
-
-CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name);
-CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type);
-CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status);
-CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id);
-CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no);
-CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt);
-
-COMMENT ON COLUMN sj_retry_task_0.id IS '主键';
-COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id';
-COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一';
-COMMENT ON COLUMN sj_retry_task_0.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称';
-COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id';
-COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号';
-COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称';
-COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数';
-COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段';
-COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间';
-COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数';
-COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
-COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据';
-COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间';
-COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间';
-COMMENT ON TABLE sj_retry_task_0 IS '任务表';
-
--- sj_retry_task_log
-CREATE TABLE sj_retry_task_log
+CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted);
+
+CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status);
+CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id);
+CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no);
+CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id);
+CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt);
+
+COMMENT ON COLUMN sj_retry.id IS '主键';
+COMMENT ON COLUMN sj_retry.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry.idempotent_id IS '幂等id';
+COMMENT ON COLUMN sj_retry.biz_no IS '业务编号';
+COMMENT ON COLUMN sj_retry.executor_name IS '执行器名称';
+COMMENT ON COLUMN sj_retry.args_str IS '执行方法参数';
+COMMENT ON COLUMN sj_retry.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN sj_retry.retry_count IS '重试次数';
+COMMENT ON COLUMN sj_retry.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数';
+COMMENT ON COLUMN sj_retry.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry.bucket_index IS 'bucket';
+COMMENT ON COLUMN sj_retry.parent_id IS '父节点id';
+COMMENT ON COLUMN sj_retry.deleted IS '逻辑删除';
+COMMENT ON COLUMN sj_retry.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry IS '重试信息表';
+
+-- sj_retry_task
+CREATE TABLE sj_retry_task
 (
-    id            bigserial PRIMARY KEY,
-    namespace_id  varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    unique_id     varchar(64)  NOT NULL,
-    group_name    varchar(64)  NOT NULL,
-    scene_name    varchar(64)  NOT NULL,
-    idempotent_id varchar(64)  NOT NULL,
-    biz_no        varchar(64)  NOT NULL DEFAULT '',
-    executor_name varchar(512) NOT NULL DEFAULT '',
-    args_str      text         NOT NULL,
-    ext_attrs     text         NOT NULL,
-    retry_status  smallint     NOT NULL DEFAULT 0,
-    task_type     smallint     NOT NULL DEFAULT 1,
-    create_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
-    update_dt     timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+    id               bigserial PRIMARY KEY,
+    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name       varchar(64)  NOT NULL,
+    scene_name       varchar(64)  NOT NULL,
+    retry_id         bigint       NOT NULL,
+    ext_attrs        text         NOT NULL,
+    task_status      smallint     NOT NULL DEFAULT 1,
+    task_type        smallint     NOT NULL DEFAULT 1,
+    operation_reason smallint     NOT NULL DEFAULT 0,
+    client_info      varchar(128) NULL     DEFAULT NULL,
+    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
 
-CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name);
-CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status);
-CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id);
-CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id);
-CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no);
-CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt);
-
-COMMENT ON COLUMN sj_retry_task_log.id IS '主键';
-COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id';
-COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一';
-COMMENT ON COLUMN sj_retry_task_log.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称';
-COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id';
-COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号';
-COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称';
-COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数';
-COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段';
-COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数';
-COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据';
-COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间';
-COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间';
-COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表';
+CREATE INDEX idx_sj_retry_task_01 ON sj_retry_task (namespace_id, group_name, scene_name);
+CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status);
+CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt);
+CREATE INDEX idx_sj_retry_task_04 ON sj_retry_task (retry_id);
+
+COMMENT ON COLUMN sj_retry_task.id IS '主键';
+COMMENT ON COLUMN sj_retry_task.namespace_id IS '命名空间id';
+COMMENT ON COLUMN sj_retry_task.group_name IS '组名称';
+COMMENT ON COLUMN sj_retry_task.scene_name IS '场景名称';
+COMMENT ON COLUMN sj_retry_task.retry_id IS '重试信息Id';
+COMMENT ON COLUMN sj_retry_task.ext_attrs IS '扩展字段';
+COMMENT ON COLUMN sj_retry_task.task_status IS '重试状态';
+COMMENT ON COLUMN sj_retry_task.task_type IS '任务类型 1、重试数据 2、回调数据';
+COMMENT ON COLUMN sj_retry_task.operation_reason IS '操作原因';
+COMMENT ON COLUMN sj_retry_task.client_info IS '客户端地址 clientId#ip:port';
+COMMENT ON COLUMN sj_retry_task.create_dt IS '创建时间';
+COMMENT ON COLUMN sj_retry_task.update_dt IS '修改时间';
+COMMENT ON TABLE sj_retry_task IS '重试任务表';
 
 -- sj_retry_task_log_message
 CREATE TABLE sj_retry_task_log_message
 (
-    id           bigserial PRIMARY KEY,
-    namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    group_name   varchar(64) NOT NULL,
-    unique_id    varchar(64) NOT NULL,
-    message      text        NOT NULL,
-    log_num      int         NOT NULL DEFAULT 1,
-    real_time    bigint      NOT NULL DEFAULT 0,
-    create_dt    timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP
+    id            bigserial PRIMARY KEY,
+    namespace_id  varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name    varchar(64) NOT NULL,
+    retry_id      bigint      NOT NULL,
+    retry_task_id bigint      NOT NULL,
+    message       text        NOT NULL,
+    log_num       int         NOT NULL DEFAULT 1,
+    real_time     bigint      NOT NULL DEFAULT 0,
+    create_dt     timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
 
-CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id);
+CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, retry_task_id);
 CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt);
 
 COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键';
 COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id';
 COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称';
-COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一';
+COMMENT ON COLUMN sj_retry_task_log_message.retry_id IS '重试信息Id';
+COMMENT ON COLUMN sj_retry_task_log_message.retry_task_id IS '重试任务Id';
 COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息';
 COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量';
 COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间';
@@ -289,21 +281,26 @@ COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表
 -- sj_retry_scene_config
 CREATE TABLE sj_retry_scene_config
 (
-    id               bigserial PRIMARY KEY,
-    namespace_id     varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    scene_name       varchar(64)  NOT NULL,
-    group_name       varchar(64)  NOT NULL,
-    scene_status     smallint     NOT NULL DEFAULT 0,
-    max_retry_count  int          NOT NULL DEFAULT 5,
-    back_off         smallint     NOT NULL DEFAULT 1,
-    trigger_interval varchar(16)  NOT NULL DEFAULT '',
-    notify_ids       varchar(128) NOT NULL DEFAULT '',
-    deadline_request bigint       NOT NULL DEFAULT 60000,
-    executor_timeout int          NOT NULL DEFAULT 5,
-    route_key        smallint     NOT NULL DEFAULT 4,
-    description      varchar(256) NOT NULL DEFAULT '',
-    create_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
-    update_dt        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
+    id                  bigserial PRIMARY KEY,
+    namespace_id        varchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    scene_name          varchar(64)  NOT NULL,
+    group_name          varchar(64)  NOT NULL,
+    scene_status        smallint     NOT NULL DEFAULT 0,
+    max_retry_count     int          NOT NULL DEFAULT 5,
+    back_off            smallint     NOT NULL DEFAULT 1,
+    trigger_interval    varchar(16)  NOT NULL DEFAULT '',
+    notify_ids          varchar(128) NOT NULL DEFAULT '',
+    deadline_request    bigint       NOT NULL DEFAULT 60000,
+    executor_timeout    int          NOT NULL DEFAULT 5,
+    route_key           smallint     NOT NULL DEFAULT 4,
+    block_strategy      smallint     NOT NULL DEFAULT 1,
+    cb_status           smallint     NOT NULL DEFAULT 0,
+    cb_trigger_type     smallint     NOT NULL DEFAULT 1,
+    cb_max_count        int          NOT NULL DEFAULT 16,
+    cb_trigger_interval varchar(16)  NOT NULL DEFAULT '',
+    description         varchar(256) NOT NULL DEFAULT '',
+    create_dt           timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt           timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
 
 CREATE UNIQUE INDEX uk_sj_retry_scene_config_01 ON sj_retry_scene_config (namespace_id, group_name, scene_name);
@@ -320,6 +317,11 @@ COMMENT ON COLUMN sj_retry_scene_config.notify_ids IS '通知告警场景配置i
 COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒';
 COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒';
 COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略';
+COMMENT ON COLUMN sj_retry_scene_config.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_retry_scene_config.cb_status IS '回调状态 0、不开启 1、开启';
+COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_type IS '1、默认等级 2、固定间隔时间 3、CRON 表达式';
+COMMENT ON COLUMN sj_retry_scene_config.cb_max_count IS '回调的最大执行次数';
+COMMENT ON COLUMN sj_retry_scene_config.cb_trigger_interval IS '回调的最大执行次数';
 COMMENT ON COLUMN sj_retry_scene_config.description IS '描述';
 COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间';
 COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间';
@@ -362,7 +364,7 @@ COMMENT ON TABLE sj_server_node IS '服务器节点';
 -- sj_distributed_lock
 CREATE TABLE sj_distributed_lock
 (
-    name       varchar(64)  PRIMARY KEY,
+    name       varchar(64)  NOT NULL,
     lock_until timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
     locked_at  timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
     locked_by  varchar(255) NOT NULL,
@@ -493,11 +495,11 @@ COMMENT ON COLUMN sj_job.executor_type IS '执行器类型';
 COMMENT ON COLUMN sj_job.executor_info IS '执行器名称';
 COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间';
 COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长';
-COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行';
+COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复';
 COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒';
 COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数';
 COMMENT ON COLUMN sj_job.parallel_num IS '并行数';
-COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) ';
+COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s)';
 COMMENT ON COLUMN sj_job.bucket_index IS 'bucket';
 COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务';
 COMMENT ON COLUMN sj_job.notify_ids IS '通知告警场景配置id列表';
@@ -664,7 +666,7 @@ CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name,
 COMMENT ON COLUMN sj_job_summary.id IS '主键';
 COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id';
 COMMENT ON COLUMN sj_job_summary.group_name IS '组名称';
-COMMENT ON COLUMN sj_job_summary.business_id IS '业务id  ( job_id或workflow_id ) ';
+COMMENT ON COLUMN sj_job_summary.business_id IS '业务id  ( job_id或workflow_id)';
 COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务';
 COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间';
 COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量';

+ 2 - 0
script/sql/postgres/postgres_ry_workflow.sql

@@ -262,6 +262,8 @@ CREATE TABLE flow_user
     CONSTRAINT flow_user_pk PRIMARY KEY (id)
 );
 CREATE INDEX user_processed_type ON flow_user USING btree (processed_by, type);
+CREATE INDEX user_associated_idx ON FLOW_USER USING btree (associated);
+
 COMMENT ON TABLE flow_user IS '流程用户表';
 
 COMMENT ON COLUMN flow_user.id IS '主键id';

+ 63 - 62
script/sql/ry_job.sql

@@ -30,7 +30,6 @@ CREATE TABLE `sj_group_config`
     `group_partition`   int(11)             NOT NULL COMMENT '分区',
     `id_generator_mode` tinyint(4)          NOT NULL DEFAULT 1 COMMENT '唯一id生成模式 默认号段模式',
     `init_scene`        tinyint(4)          NOT NULL DEFAULT 0 COMMENT '是否初始化场景 0:否 1:是',
-    `bucket_index`      int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket',
     `create_dt`         datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_dt`         datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
@@ -39,8 +38,8 @@ CREATE TABLE `sj_group_config`
   AUTO_INCREMENT = 0
   DEFAULT CHARSET = utf8mb4 COMMENT ='组配置';
 
-INSERT INTO `sj_group_config` VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
-INSERT INTO `sj_group_config` VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1, 4, now(), now());
+INSERT INTO `sj_group_config` VALUES (1, 'dev', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1,  now(), now());
+INSERT INTO `sj_group_config` VALUES (2, 'prod', 'ruoyi_group', '', 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', 1, 1, 0, 1, 1,  now(), now());
 
 CREATE TABLE `sj_notify_config`
 (
@@ -80,11 +79,10 @@ CREATE TABLE `sj_notify_recipient`
   AUTO_INCREMENT = 0
   DEFAULT CHARSET = utf8mb4 COMMENT ='告警通知接收人';
 
-CREATE TABLE `sj_retry_dead_letter_0`
+CREATE TABLE `sj_retry_dead_letter`
 (
     `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
     `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
-    `unique_id`     varchar(64)         NOT NULL COMMENT '同组下id唯一',
     `group_name`    varchar(64)         NOT NULL COMMENT '组名称',
     `scene_name`    varchar(64)         NOT NULL COMMENT '场景名称',
     `idempotent_id` varchar(64)         NOT NULL COMMENT '幂等id',
@@ -92,23 +90,20 @@ CREATE TABLE `sj_retry_dead_letter_0`
     `executor_name` varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称',
     `args_str`      text                NOT NULL COMMENT '执行方法参数',
     `ext_attrs`     text                NOT NULL COMMENT '扩展字段',
-    `task_type`     tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
     `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     PRIMARY KEY (`id`),
     KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
     KEY `idx_idempotent_id` (`idempotent_id`),
     KEY `idx_biz_no` (`biz_no`),
-    KEY `idx_create_dt` (`create_dt`),
-    UNIQUE KEY `uk_namespace_id_group_name_unique_id` (`namespace_id`, `group_name`, `unique_id`)
+    KEY `idx_create_dt` (`create_dt`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 0
   DEFAULT CHARSET = utf8mb4 COMMENT ='死信队列表';
 
-CREATE TABLE `sj_retry_task_0`
+CREATE TABLE `sj_retry`
 (
     `id`              bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
     `namespace_id`    varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
-    `unique_id`       varchar(64)         NOT NULL COMMENT '同组下id唯一',
     `group_name`      varchar(64)         NOT NULL COMMENT '组名称',
     `scene_name`      varchar(64)         NOT NULL COMMENT '场景名称',
     `idempotent_id`   varchar(64)         NOT NULL COMMENT '幂等id',
@@ -116,63 +111,63 @@ CREATE TABLE `sj_retry_task_0`
     `executor_name`   varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称',
     `args_str`        text                NOT NULL COMMENT '执行方法参数',
     `ext_attrs`       text                NOT NULL COMMENT '扩展字段',
-    `next_trigger_at` datetime            NOT NULL COMMENT '下次触发时间',
+    `next_trigger_at` bigint(13)          NOT NULL COMMENT '下次触发时间',
     `retry_count`     int(11)             NOT NULL DEFAULT 0 COMMENT '重试次数',
     `retry_status`    tinyint(4)          NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大重试次数',
     `task_type`       tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
+    `bucket_index`    int(11)             NOT NULL DEFAULT 0 COMMENT 'bucket',
+    `parent_id`       bigint(20)          NOT NULL DEFAULT 0 COMMENT '父节点id',
+    `deleted`         bigint(20)          NOT NULL DEFAULT 0 COMMENT '逻辑删除',
     `create_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_dt`       datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
     KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
-    KEY `idx_namespace_id_group_name_task_type` (`namespace_id`, `group_name`, `task_type`),
     KEY `idx_namespace_id_group_name_retry_status` (`namespace_id`, `group_name`, `retry_status`),
     KEY `idx_idempotent_id` (`idempotent_id`),
     KEY `idx_biz_no` (`biz_no`),
+    KEY `idx_parent_id` (`parent_id`),
     KEY `idx_create_dt` (`create_dt`),
-    UNIQUE KEY `uk_name_unique_id` (`namespace_id`, `group_name`, `unique_id`)
+    UNIQUE KEY `uk_name_task_type_idempotent_id_deleted` (`namespace_id`, `group_name`, `task_type`, `idempotent_id`, `deleted`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 0
-  DEFAULT CHARSET = utf8mb4 COMMENT ='任务表';
+  DEFAULT CHARSET = utf8mb4 COMMENT ='重试信息表';
 
-CREATE TABLE `sj_retry_task_log`
+CREATE TABLE `sj_retry_task`
 (
-    `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
-    `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
-    `unique_id`     varchar(64)         NOT NULL COMMENT '同组下id唯一',
-    `group_name`    varchar(64)         NOT NULL COMMENT '组名称',
-    `scene_name`    varchar(64)         NOT NULL COMMENT '场景名称',
-    `idempotent_id` varchar(64)         NOT NULL COMMENT '幂等id',
-    `biz_no`        varchar(64)         NOT NULL DEFAULT '' COMMENT '业务编号',
-    `executor_name` varchar(512)        NOT NULL DEFAULT '' COMMENT '执行器名称',
-    `args_str`      text                NOT NULL COMMENT '执行方法参数',
-    `ext_attrs`     text                NOT NULL COMMENT '扩展字段',
-    `retry_status`  tinyint(4)          NOT NULL DEFAULT 0 COMMENT '重试状态 0、重试中 1、成功 2、最大次数',
-    `task_type`     tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
-    `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-    `update_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
+    `scene_name`       varchar(64)         NOT NULL COMMENT '场景名称',
+    `retry_id`         bigint(20)          NOT NULL COMMENT '重试信息Id',
+    `ext_attrs`        text                NOT NULL COMMENT '扩展字段',
+    `task_status`      tinyint(4)          NOT NULL DEFAULT 1 COMMENT '重试状态',
+    `task_type`        tinyint(4)          NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
+    `operation_reason` tinyint(4)          NOT NULL DEFAULT 0 COMMENT '操作原因',
+    `client_info`      varchar(128)        DEFAULT NULL COMMENT '客户端地址 clientId#ip:port',
+    `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
     KEY `idx_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`),
-    KEY `idx_retry_status` (`retry_status`),
-    KEY `idx_idempotent_id` (`idempotent_id`),
-    KEY `idx_unique_id` (`unique_id`),
-    KEY `idx_biz_no` (`biz_no`),
-    KEY `idx_create_dt` (`create_dt`)
+    KEY `task_status` (`task_status`),
+    KEY `idx_create_dt` (`create_dt`),
+    KEY `idx_retry_id` (`retry_id`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 0
-  DEFAULT CHARSET = utf8mb4 COMMENT ='任务日志基础信息表';
+  DEFAULT CHARSET = utf8mb4 COMMENT ='重试任务表';
 
 CREATE TABLE `sj_retry_task_log_message`
 (
-    `id`           bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
-    `namespace_id` varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
-    `group_name`   varchar(64)         NOT NULL COMMENT '组名称',
-    `unique_id`    varchar(64)         NOT NULL COMMENT '同组下id唯一',
-    `message`      longtext            NOT NULL COMMENT '异常信息',
-    `log_num`      int(11)             NOT NULL DEFAULT 1 COMMENT '日志数量',
-    `real_time`    bigint(13)          NOT NULL DEFAULT 0 COMMENT '上报时间',
-    `create_dt`    datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`  varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `group_name`    varchar(64)         NOT NULL COMMENT '组名称',
+    `retry_id`      bigint(20)          NOT NULL COMMENT '重试信息Id',
+    `retry_task_id` bigint(20)          NOT NULL COMMENT '重试任务Id',
+    `message`       longtext            NOT NULL COMMENT '异常信息',
+    `log_num`       int(11)             NOT NULL DEFAULT 1 COMMENT '日志数量',
+    `real_time`     bigint(13)          NOT NULL DEFAULT 0 COMMENT '上报时间',
+    `create_dt`     datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     PRIMARY KEY (`id`),
-    KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `unique_id`),
+    KEY `idx_namespace_id_group_name_retry_task_id` (`namespace_id`, `group_name`, `retry_task_id`),
     KEY `idx_create_dt` (`create_dt`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 0
@@ -180,21 +175,26 @@ CREATE TABLE `sj_retry_task_log_message`
 
 CREATE TABLE `sj_retry_scene_config`
 (
-    `id`               bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
-    `namespace_id`     varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
-    `scene_name`       varchar(64)         NOT NULL COMMENT '场景名称',
-    `group_name`       varchar(64)         NOT NULL COMMENT '组名称',
-    `scene_status`     tinyint(4)          NOT NULL DEFAULT 0 COMMENT '组状态 0、未启用 1、启用',
-    `max_retry_count`  int(11)             NOT NULL DEFAULT 5 COMMENT '最大重试次数',
-    `back_off`         tinyint(4)          NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
-    `trigger_interval` varchar(16)         NOT NULL DEFAULT '' COMMENT '间隔时长',
-    `notify_ids`       varchar(128)        NOT NULL DEFAULT '' COMMENT '通知告警场景配置id列表',
-    `deadline_request` bigint(20) unsigned NOT NULL DEFAULT 60000 COMMENT 'Deadline Request 调用链超时 单位毫秒',
-    `executor_timeout` int(11) unsigned    NOT NULL DEFAULT 5 COMMENT '任务执行超时时间,单位秒',
-    `route_key`        tinyint(4)          NOT NULL DEFAULT 4 COMMENT '路由策略',
-    `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
-    `create_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-    `update_dt`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    `id`                  bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
+    `namespace_id`        varchar(64)         NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
+    `scene_name`          varchar(64)         NOT NULL COMMENT '场景名称',
+    `group_name`          varchar(64)         NOT NULL COMMENT '组名称',
+    `scene_status`        tinyint(4)          NOT NULL DEFAULT 0 COMMENT '组状态 0、未启用 1、启用',
+    `max_retry_count`     int(11)             NOT NULL DEFAULT 5 COMMENT '最大重试次数',
+    `back_off`            tinyint(4)          NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
+    `trigger_interval`    varchar(16)         NOT NULL DEFAULT '' COMMENT '间隔时长',
+    `notify_ids`          varchar(128)        NOT NULL DEFAULT '' COMMENT '通知告警场景配置id列表',
+    `deadline_request`    bigint(20) unsigned NOT NULL DEFAULT 60000 COMMENT 'Deadline Request 调用链超时 单位毫秒',
+    `executor_timeout`    int(11) unsigned    NOT NULL DEFAULT 5 COMMENT '任务执行超时时间,单位秒',
+    `route_key`           tinyint(4)          NOT NULL DEFAULT 4 COMMENT '路由策略',
+    `block_strategy`      tinyint(4)          NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
+    `cb_status`           tinyint(4)          NOT NULL DEFAULT 0 COMMENT '回调状态 0、不开启 1、开启',
+    `cb_trigger_type`     tinyint(4)          NOT NULL DEFAULT 1 COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式',
+    `cb_max_count`        int(11)             NOT NULL DEFAULT 16 COMMENT '回调的最大执行次数',
+    `cb_trigger_interval` varchar(16)         NOT NULL DEFAULT '' COMMENT '回调的最大执行次数',
+    `description`         varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',
+    `create_dt`           datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_dt`           datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
     UNIQUE KEY `uk_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`)
 ) ENGINE = InnoDB
@@ -249,7 +249,8 @@ CREATE TABLE `sj_system_user`
   DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户表';
 
 -- pwd: admin
-INSERT INTO `sj_system_user` VALUES (1, 'admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2, now(), now());
+INSERT INTO `sj_system_user` (username, password, role)
+VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2);
 
 CREATE TABLE `sj_system_user_permission`
 (
@@ -294,7 +295,7 @@ CREATE TABLE `sj_job`
     `executor_info`    varchar(255)                 DEFAULT NULL COMMENT '执行器名称',
     `trigger_type`     tinyint(4)          NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
     `trigger_interval` varchar(255)        NOT NULL COMMENT '间隔时长',
-    `block_strategy`   tinyint(4)          NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
+    `block_strategy`   tinyint(4)          NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复',
     `executor_timeout` int(11)             NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
     `max_retry_times`  int(11)             NOT NULL DEFAULT 0 COMMENT '最大重试次数',
     `parallel_num`     int(11)             NOT NULL DEFAULT 1 COMMENT '并行数',
@@ -448,7 +449,7 @@ CREATE TABLE `sj_workflow`
     `workflow_status`  tinyint(4)          NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启',
     `trigger_type`     tinyint(4)          NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
     `trigger_interval` varchar(255)        NOT NULL COMMENT '间隔时长',
-    `next_trigger_at`  bigint(13)          NOT NULL COMMENT '下次触发时间',
+    `next_trigger_at`  bigint              NOT NULL COMMENT '下次触发时间',
     `block_strategy`   tinyint(4)          NOT NULL DEFAULT 1 COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
     `executor_timeout` int(11)             NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
     `description`      varchar(256)        NOT NULL DEFAULT '' COMMENT '描述',

+ 2 - 1
script/sql/ry_workflow.sql

@@ -146,7 +146,8 @@ CREATE TABLE `flow_user`
     `del_flag`     char(1)     DEFAULT '0' COMMENT '删除标志',
     `tenant_id`    varchar(40) DEFAULT NULL COMMENT '租户id',
     PRIMARY KEY (`id`) USING BTREE,
-    KEY `user_processed_type` (`processed_by`, `type`)
+    KEY `user_processed_type` (`processed_by`, `type`),
+    KEY `user_associated` (`associated`) USING BTREE
 ) ENGINE = InnoDB COMMENT ='流程用户表';
 
 -- ----------------------------

+ 193 - 176
script/sql/sqlserver/sqlserver_ry_job.sql

@@ -2,7 +2,7 @@
  SnailJob Database Transfer Tool
  Source Server Type    : MySQL
  Target Server Type    : Microsoft SQL Server
- Date: 2024-12-27 22:24:37
+ Date: 2025-02-25 22:16:48
 */
 
 
@@ -95,7 +95,6 @@ CREATE TABLE sj_group_config
     group_partition   int           NOT NULL,
     id_generator_mode tinyint       NOT NULL DEFAULT 1,
     init_scene        tinyint       NOT NULL DEFAULT 0,
-    bucket_index      int           NOT NULL DEFAULT 0,
     create_dt         datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
     update_dt         datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
 )
@@ -174,13 +173,6 @@ EXEC sp_addextendedproperty
      'COLUMN', N'init_scene'
 GO
 
-EXEC sp_addextendedproperty
-     'MS_Description', N'bucket',
-     'SCHEMA', N'dbo',
-     'TABLE', N'sj_group_config',
-     'COLUMN', N'bucket_index'
-GO
-
 EXEC sp_addextendedproperty
      'MS_Description', N'创建时间',
      'SCHEMA', N'dbo',
@@ -201,9 +193,9 @@ EXEC sp_addextendedproperty
      'TABLE', N'sj_group_config'
 GO
 
-INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', N'4', getdate(), getdate())
+INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', getdate(), getdate())
 GO
-INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, bucket_index, create_dt, update_dt) VALUES (N'prod', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', N'4', getdate(), getdate())
+INSERT INTO sj_group_config(namespace_id, group_name, description, token, group_status, version, group_partition, id_generator_mode, init_scene, create_dt, update_dt) VALUES (N'prod', N'ruoyi_group', N'', N'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', N'1', N'1', N'0', N'1', N'1', getdate(), getdate())
 GO
 
 -- sj_notify_config
@@ -412,12 +404,11 @@ EXEC sp_addextendedproperty
      'TABLE', N'sj_notify_recipient'
 GO
 
--- sj_retry_dead_letter_0
-CREATE TABLE sj_retry_dead_letter_0
+-- sj_retry_dead_letter
+CREATE TABLE sj_retry_dead_letter
 (
     id            bigint        NOT NULL PRIMARY KEY IDENTITY,
     namespace_id  nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    unique_id     nvarchar(64)  NOT NULL,
     group_name    nvarchar(64)  NOT NULL,
     scene_name    nvarchar(64)  NOT NULL,
     idempotent_id nvarchar(64)  NOT NULL,
@@ -425,119 +416,100 @@ CREATE TABLE sj_retry_dead_letter_0
     executor_name nvarchar(512) NOT NULL DEFAULT '',
     args_str      nvarchar(max) NOT NULL,
     ext_attrs     nvarchar(max) NOT NULL,
-    task_type     tinyint       NOT NULL DEFAULT 1,
     create_dt     datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
 )
 GO
 
-CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id)
-GO
-
-CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name)
+CREATE INDEX idx_sj_retry_dead_letter_01 ON sj_retry_dead_letter (namespace_id, group_name, scene_name)
 GO
-CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id)
+CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id)
 GO
-CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no)
+CREATE INDEX idx_sj_retry_dead_letter_03 ON sj_retry_dead_letter (biz_no)
 GO
-CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt)
+CREATE INDEX idx_sj_retry_dead_letter_04 ON sj_retry_dead_letter (create_dt)
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'主键',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'id'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'命名空间id',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'namespace_id'
 GO
 
-EXEC sp_addextendedproperty
-     'MS_Description', N'同组下id唯一',
-     'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
-     'COLUMN', N'unique_id'
-GO
-
 EXEC sp_addextendedproperty
      'MS_Description', N'组名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'group_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'场景名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'scene_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'幂等id',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'idempotent_id'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'业务编号',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'biz_no'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'执行器名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'executor_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'执行方法参数',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'args_str'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'扩展字段',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'ext_attrs'
 GO
 
-EXEC sp_addextendedproperty
-     'MS_Description', N'任务类型 1、重试数据 2、回调数据',
-     'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
-     'COLUMN', N'task_type'
-GO
-
 EXEC sp_addextendedproperty
      'MS_Description', N'创建时间',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0',
+     'TABLE', N'sj_retry_dead_letter',
      'COLUMN', N'create_dt'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'死信队列表',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_dead_letter_0'
+     'TABLE', N'sj_retry_dead_letter'
 GO
 
--- sj_retry_task_0
-CREATE TABLE sj_retry_task_0
+-- sj_retry
+CREATE TABLE sj_retry
 (
     id              bigint        NOT NULL PRIMARY KEY IDENTITY,
     namespace_id    nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    unique_id       nvarchar(64)  NOT NULL,
     group_name      nvarchar(64)  NOT NULL,
     scene_name      nvarchar(64)  NOT NULL,
     idempotent_id   nvarchar(64)  NOT NULL,
@@ -545,301 +517,299 @@ CREATE TABLE sj_retry_task_0
     executor_name   nvarchar(512) NOT NULL DEFAULT '',
     args_str        nvarchar(max) NOT NULL,
     ext_attrs       nvarchar(max) NOT NULL,
-    next_trigger_at datetime2     NOT NULL,
+    next_trigger_at bigint        NOT NULL,
     retry_count     int           NOT NULL DEFAULT 0,
     retry_status    tinyint       NOT NULL DEFAULT 0,
     task_type       tinyint       NOT NULL DEFAULT 1,
+    bucket_index    int           NOT NULL DEFAULT 0,
+    parent_id       bigint        NOT NULL DEFAULT 0,
+    deleted         bigint        NOT NULL DEFAULT 0,
     create_dt       datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
     update_dt       datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
 )
 GO
 
-CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id)
+CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted)
 GO
 
-CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name)
+CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name)
 GO
-CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type)
+CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status)
 GO
-CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status)
+CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id)
 GO
-CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id)
+CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no)
 GO
-CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no)
+CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id)
 GO
-CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt)
+CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt)
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'主键',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'id'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'命名空间id',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'namespace_id'
 GO
 
-EXEC sp_addextendedproperty
-     'MS_Description', N'同组下id唯一',
-     'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
-     'COLUMN', N'unique_id'
-GO
-
 EXEC sp_addextendedproperty
      'MS_Description', N'组名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'group_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'场景名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'scene_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'幂等id',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'idempotent_id'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'业务编号',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'biz_no'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'执行器名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'executor_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'执行方法参数',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'args_str'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'扩展字段',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'ext_attrs'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'下次触发时间',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'next_trigger_at'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'重试次数',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'retry_count'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'重试状态 0、重试中 1、成功 2、最大重试次数',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'retry_status'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'任务类型 1、重试数据 2、回调数据',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'task_type'
 GO
 
+EXEC sp_addextendedproperty
+     'MS_Description', N'bucket',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry',
+     'COLUMN', N'bucket_index'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'父节点id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry',
+     'COLUMN', N'parent_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'逻辑删除',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry',
+     'COLUMN', N'deleted'
+GO
+
 EXEC sp_addextendedproperty
      'MS_Description', N'创建时间',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'create_dt'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'修改时间',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0',
+     'TABLE', N'sj_retry',
      'COLUMN', N'update_dt'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'任务表',
+     'MS_Description', N'重试信息表',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_0'
+     'TABLE', N'sj_retry'
 GO
 
--- sj_retry_task_log
-CREATE TABLE sj_retry_task_log
+-- sj_retry_task
+CREATE TABLE sj_retry_task
 (
-    id            bigint        NOT NULL PRIMARY KEY IDENTITY,
-    namespace_id  nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    unique_id     nvarchar(64)  NOT NULL,
-    group_name    nvarchar(64)  NOT NULL,
-    scene_name    nvarchar(64)  NOT NULL,
-    idempotent_id nvarchar(64)  NOT NULL,
-    biz_no        nvarchar(64)  NOT NULL DEFAULT '',
-    executor_name nvarchar(512) NOT NULL DEFAULT '',
-    args_str      nvarchar(max) NOT NULL,
-    ext_attrs     nvarchar(max) NOT NULL,
-    retry_status  tinyint       NOT NULL DEFAULT 0,
-    task_type     tinyint       NOT NULL DEFAULT 1,
-    create_dt     datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
-    update_dt     datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
+    id               bigint        NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id     nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name       nvarchar(64)  NOT NULL,
+    scene_name       nvarchar(64)  NOT NULL,
+    retry_id         bigint        NOT NULL,
+    ext_attrs        nvarchar(max) NOT NULL,
+    task_status      tinyint       NOT NULL DEFAULT 1,
+    task_type        tinyint       NOT NULL DEFAULT 1,
+    operation_reason tinyint       NOT NULL DEFAULT 0,
+    client_info      nvarchar(128) NULL     DEFAULT NULL,
+    create_dt        datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt        datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
 )
 GO
 
-CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name)
-GO
-CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status)
-GO
-CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id)
+CREATE INDEX idx_sj_retry_task_01 ON sj_retry_task (namespace_id, group_name, scene_name)
 GO
-CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id)
+CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status)
 GO
-CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no)
+CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt)
 GO
-CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt)
+CREATE INDEX idx_sj_retry_task_04 ON sj_retry_task (retry_id)
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'主键',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
+     'TABLE', N'sj_retry_task',
      'COLUMN', N'id'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'命名空间id',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
+     'TABLE', N'sj_retry_task',
      'COLUMN', N'namespace_id'
 GO
 
-EXEC sp_addextendedproperty
-     'MS_Description', N'同组下id唯一',
-     'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'unique_id'
-GO
-
 EXEC sp_addextendedproperty
      'MS_Description', N'组名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
+     'TABLE', N'sj_retry_task',
      'COLUMN', N'group_name'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'场景名称',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
+     'TABLE', N'sj_retry_task',
      'COLUMN', N'scene_name'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'幂等id',
+     'MS_Description', N'重试信息Id',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'idempotent_id'
-GO
-
-EXEC sp_addextendedproperty
-     'MS_Description', N'业务编号',
-     'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'biz_no'
+     'TABLE', N'sj_retry_task',
+     'COLUMN', N'retry_id'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'执行器名称',
+     'MS_Description', N'扩展字段',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'executor_name'
+     'TABLE', N'sj_retry_task',
+     'COLUMN', N'ext_attrs'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'执行方法参数',
+     'MS_Description', N'重试状态',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'args_str'
+     'TABLE', N'sj_retry_task',
+     'COLUMN', N'task_status'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'扩展字段',
+     'MS_Description', N'任务类型 1、重试数据 2、回调数据',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'ext_attrs'
+     'TABLE', N'sj_retry_task',
+     'COLUMN', N'task_type'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'重试状态 0、重试中 1、成功 2、最大次数',
+     'MS_Description', N'操作原因',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'retry_status'
+     'TABLE', N'sj_retry_task',
+     'COLUMN', N'operation_reason'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'任务类型 1、重试数据 2、回调数据',
+     'MS_Description', N'客户端地址 clientId#ip:port',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
-     'COLUMN', N'task_type'
+     'TABLE', N'sj_retry_task',
+     'COLUMN', N'client_info'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'创建时间',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
+     'TABLE', N'sj_retry_task',
      'COLUMN', N'create_dt'
 GO
 
 EXEC sp_addextendedproperty
      'MS_Description', N'修改时间',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log',
+     'TABLE', N'sj_retry_task',
      'COLUMN', N'update_dt'
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'任务日志基础信息表',
+     'MS_Description', N'重试任务表',
      'SCHEMA', N'dbo',
-     'TABLE', N'sj_retry_task_log'
+     'TABLE', N'sj_retry_task'
 GO
 
 -- sj_retry_task_log_message
 CREATE TABLE sj_retry_task_log_message
 (
-    id           bigint        NOT NULL PRIMARY KEY IDENTITY,
-    namespace_id nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    group_name   nvarchar(64)  NOT NULL,
-    unique_id    nvarchar(64)  NOT NULL,
-    message      nvarchar(max) NOT NULL,
-    log_num      int           NOT NULL DEFAULT 1,
-    real_time    bigint        NOT NULL DEFAULT 0,
-    create_dt    datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
+    id            bigint        NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id  nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    group_name    nvarchar(64)  NOT NULL,
+    retry_id      bigint        NOT NULL,
+    retry_task_id bigint        NOT NULL,
+    message       nvarchar(max) NOT NULL,
+    log_num       int           NOT NULL DEFAULT 1,
+    real_time     bigint        NOT NULL DEFAULT 0,
+    create_dt     datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
 )
 GO
 
-CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id)
+CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, retry_task_id)
 GO
 CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt)
 GO
@@ -866,10 +836,17 @@ EXEC sp_addextendedproperty
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'同组下id唯一',
+     'MS_Description', N'重试信息Id',
      'SCHEMA', N'dbo',
      'TABLE', N'sj_retry_task_log_message',
-     'COLUMN', N'unique_id'
+     'COLUMN', N'retry_id'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'重试任务Id',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry_task_log_message',
+     'COLUMN', N'retry_task_id'
 GO
 
 EXEC sp_addextendedproperty
@@ -909,21 +886,26 @@ GO
 -- sj_retry_scene_config
 CREATE TABLE sj_retry_scene_config
 (
-    id               bigint        NOT NULL PRIMARY KEY IDENTITY,
-    namespace_id     nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
-    scene_name       nvarchar(64)  NOT NULL,
-    group_name       nvarchar(64)  NOT NULL,
-    scene_status     tinyint       NOT NULL DEFAULT 0,
-    max_retry_count  int           NOT NULL DEFAULT 5,
-    back_off         tinyint       NOT NULL DEFAULT 1,
-    trigger_interval nvarchar(16)  NOT NULL DEFAULT '',
-    notify_ids       nvarchar(128) NOT NULL DEFAULT '',
-    deadline_request bigint        NOT NULL DEFAULT 60000,
-    executor_timeout int           NOT NULL DEFAULT 5,
-    route_key        tinyint       NOT NULL DEFAULT 4,
-    description      nvarchar(256) NOT NULL DEFAULT '',
-    create_dt        datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
-    update_dt        datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
+    id                  bigint        NOT NULL PRIMARY KEY IDENTITY,
+    namespace_id        nvarchar(64)  NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a',
+    scene_name          nvarchar(64)  NOT NULL,
+    group_name          nvarchar(64)  NOT NULL,
+    scene_status        tinyint       NOT NULL DEFAULT 0,
+    max_retry_count     int           NOT NULL DEFAULT 5,
+    back_off            tinyint       NOT NULL DEFAULT 1,
+    trigger_interval    nvarchar(16)  NOT NULL DEFAULT '',
+    notify_ids          nvarchar(128) NOT NULL DEFAULT '',
+    deadline_request    bigint        NOT NULL DEFAULT 60000,
+    executor_timeout    int           NOT NULL DEFAULT 5,
+    route_key           tinyint       NOT NULL DEFAULT 4,
+    block_strategy      tinyint       NOT NULL DEFAULT 1,
+    cb_status           tinyint       NOT NULL DEFAULT 0,
+    cb_trigger_type     tinyint       NOT NULL DEFAULT 1,
+    cb_max_count        int           NOT NULL DEFAULT 16,
+    cb_trigger_interval nvarchar(16)  NOT NULL DEFAULT '',
+    description         nvarchar(256) NOT NULL DEFAULT '',
+    create_dt           datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    update_dt           datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP
 )
 GO
 
@@ -1014,6 +996,41 @@ EXEC sp_addextendedproperty
      'COLUMN', N'route_key'
 GO
 
+EXEC sp_addextendedproperty
+     'MS_Description', N'阻塞策略 1、丢弃 2、覆盖 3、并行',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry_scene_config',
+     'COLUMN', N'block_strategy'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'回调状态 0、不开启 1、开启',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry_scene_config',
+     'COLUMN', N'cb_status'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'1、默认等级 2、固定间隔时间 3、CRON 表达式',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry_scene_config',
+     'COLUMN', N'cb_trigger_type'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'回调的最大执行次数',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry_scene_config',
+     'COLUMN', N'cb_max_count'
+GO
+
+EXEC sp_addextendedproperty
+     'MS_Description', N'回调的最大执行次数',
+     'SCHEMA', N'dbo',
+     'TABLE', N'sj_retry_scene_config',
+     'COLUMN', N'cb_trigger_interval'
+GO
+
 EXEC sp_addextendedproperty
      'MS_Description', N'描述',
      'SCHEMA', N'dbo',
@@ -1152,7 +1169,7 @@ GO
 -- sj_distributed_lock
 CREATE TABLE sj_distributed_lock
 (
-    name       nvarchar(64)  NOT NULL PRIMARY KEY,
+    name       nvarchar(64)  NOT NULL,
     lock_until datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
     locked_at  datetime2     NOT NULL DEFAULT CURRENT_TIMESTAMP,
     locked_by  nvarchar(255) NOT NULL,
@@ -1539,7 +1556,7 @@ EXEC sp_addextendedproperty
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'阻塞策略 1、丢弃 2、覆盖 3、并行',
+     'MS_Description', N'阻塞策略 1、丢弃 2、覆盖 3、并行 4、恢复',
      'SCHEMA', N'dbo',
      'TABLE', N'sj_job',
      'COLUMN', N'block_strategy'
@@ -1567,7 +1584,7 @@ EXEC sp_addextendedproperty
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'重试间隔 ( s ) ',
+     'MS_Description', N'重试间隔 ( s)',
      'SCHEMA', N'dbo',
      'TABLE', N'sj_job',
      'COLUMN', N'retry_interval'
@@ -2121,7 +2138,7 @@ EXEC sp_addextendedproperty
 GO
 
 EXEC sp_addextendedproperty
-     'MS_Description', N'业务id  ( job_id或workflow_id ) ',
+     'MS_Description', N'业务id  ( job_id或workflow_id)',
      'SCHEMA', N'dbo',
      'TABLE', N'sj_job_summary',
      'COLUMN', N'business_id'

+ 2 - 0
script/sql/sqlserver/sqlserver_ry_workflow.sql

@@ -918,6 +918,8 @@ GO
 
 CREATE NONCLUSTERED INDEX user_processed_type ON flow_user (processed_by ASC, type ASC)
 GO
+CREATE NONCLUSTERED INDEX user_associated_idx ON flow_user (associated ASC)
+GO
 
 EXEC sp_addextendedproperty
 'MS_Description', N'主键id',

+ 1 - 0
script/sql/update/oracle/update_5.3.0-5.3.1.sql

@@ -1,6 +1,7 @@
 ALTER TABLE flow_node DROP COLUMN skip_any_node;
 ALTER TABLE flow_node ADD (ext VARCHAR2(500));
 COMMENT ON COLUMN flow_node.ext IS '扩展属性';
+create index USER_ASSOCIATED_IDX on FLOW_USER (ASSOCIATED);
 
 ALTER TABLE sys_oss ADD (ext1 VARCHAR2(500));
 COMMENT ON COLUMN sys_oss.ext1 IS '扩展属性';

+ 1 - 0
script/sql/update/postgres/update_5.3.0-5.3.1.sql

@@ -1,6 +1,7 @@
 ALTER TABLE flow_node DROP COLUMN skip_any_node;
 ALTER TABLE flow_node ADD COLUMN ext varchar(500);
 COMMENT ON COLUMN flow_node.ext IS '扩展属性';
+CREATE INDEX user_associated_idx ON FLOW_USER USING btree (associated);
 
 ALTER TABLE sys_oss ADD COLUMN ext1 varchar(500));
 COMMENT ON COLUMN sys_oss.ext1 IS '扩展属性';

+ 3 - 0
script/sql/update/sqlserver/update_5.3.0-5.3.1.sql

@@ -8,6 +8,9 @@ EXEC sp_addextendedproperty
 'COLUMN', N'ext'
 GO
 
+CREATE NONCLUSTERED INDEX user_associated_idx ON flow_user (associated ASC)
+GO
+
 ALTER TABLE sys_oss ADD ext1 nvarchar(500) NULL;
 
 EXEC sp_addextendedproperty

+ 1 - 0
script/sql/update/update_5.3.0-5.3.1.sql

@@ -1,6 +1,7 @@
 ALTER TABLE `flow_node` DROP COLUMN `skip_any_node`;
 ALTER TABLE `flow_node`
     ADD COLUMN `ext` text NULL COMMENT '扩展属性' AFTER `update_time`;
+ALTER TABLE `flow_user` ADD INDEX `user_associated`(`associated`) USING BTREE
 
 ALTER TABLE `sys_oss`
     ADD COLUMN `ext1` text NULL COMMENT '扩展属性' AFTER `url`;