diff --git a/.gitignore b/.gitignore index 03567532a..5e4c3263e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ target/ *.iml *.ipr +### VS CODE ### +.vscode + ### JRebel ### rebel.xml diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml index 5851f8985..6e44a8d91 100644 --- a/.run/ruoyi-monitor-admin.run.xml +++ b/.run/ruoyi-monitor-admin.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-server.run.xml b/.run/ruoyi-server.run.xml index 61f1ddade..815b24c97 100644 --- a/.run/ruoyi-server.run.xml +++ b/.run/ruoyi-server.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-snailjob-server.run.xml b/.run/ruoyi-snailjob-server.run.xml index 4df94ed28..a3ac0d9ac 100644 --- a/.run/ruoyi-snailjob-server.run.xml +++ b/.run/ruoyi-snailjob-server.run.xml @@ -2,7 +2,7 @@ - diff --git a/README.md b/README.md index 6198c7d40..de41cd9d8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![Star](https://gitcode.com/dromara/RuoYi-Vue-Plus/star/badge.svg)](https://gitcode.com/dromara/RuoYi-Vue-Plus) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.6.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.6.1-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-blue.svg)]() [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]() diff --git a/pom.xml b/pom.xml index fa7295f6f..9d74b5126 100644 --- a/pom.xml +++ b/pom.xml @@ -13,32 +13,32 @@ Dromara RuoYi-Vue-Plus多租户管理系统 - 5.6.0 - 3.5.12 + 5.6.1 + 3.5.14 UTF-8 UTF-8 17 3.5.19 - 2.8.15 + 2.8.17 0.15.0 1.3.0 2.3 - 1.44.0 + 1.45.0 3.5.16 3.9.1 5.8.43 - 3.5.6 + 3.5.8 3.52.0 2.2.7 4.3.1 - 1.9.0 + 1.10.0 1.5.0 0.2.0 - 1.18.42 + 1.18.44 1.83 1.16.7 - 3.3.4 + 3.3.7 2.28.22 @@ -46,9 +46,9 @@ 1.2.83 - 8.7.3-20251210 + 8.7.3-20260319 - 1.8.4 + 1.8.5 3.4.2 diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index 6c8accb69..a45be585b 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -14,6 +14,7 @@ import org.dromara.common.core.domain.dto.UserOnlineDTO; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ip.AddressUtils; import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.redis.utils.RedisUtils; @@ -73,7 +74,7 @@ public class UserActionListener implements SaTokenListener { SpringUtils.context().publishEvent(logininforEvent); // 更新登录信息 loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip); - log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); + log.info("user doLogin, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8)); } /** @@ -85,7 +86,7 @@ public class UserActionListener implements SaTokenListener { TenantHelper.dynamic(tenantId, () -> { RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); }); - log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); + log.info("user doLogout, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8)); } /** @@ -97,7 +98,7 @@ public class UserActionListener implements SaTokenListener { TenantHelper.dynamic(tenantId, () -> { RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); }); - log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue); + log.info("user doKickout, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8)); } /** @@ -109,7 +110,7 @@ public class UserActionListener implements SaTokenListener { TenantHelper.dynamic(tenantId, () -> { RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); }); - log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); + log.info("user doReplaced, userId:{}, token:***{}", loginId, StringUtils.right(tokenValue, 8)); } /** diff --git a/ruoyi-admin/src/main/resources/ip2region_v4.xdb b/ruoyi-admin/src/main/resources/ip2region_v4.xdb index 707ea3d45..6b53b1f61 100644 Binary files a/ruoyi-admin/src/main/resources/ip2region_v4.xdb and b/ruoyi-admin/src/main/resources/ip2region_v4.xdb differ diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 00b7e7f41..74dcc8f35 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 5.6.0 + 5.6.1 diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java index b88c3e429..c8038623c 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelBigNumberConvert.java @@ -33,7 +33,7 @@ public class ExcelBigNumberConvert implements Converter { @Override public Long convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - return Convert.toLong(cellData.getData()); + return Convert.toLong(cellData.getStringValue()); } @Override diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java index 05c79c410..9123e5e9a 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelDownHandler.java @@ -130,8 +130,9 @@ public class ExcelDownHandler implements SheetWriteHandler { } if (ObjectUtil.isNotEmpty(options)) { // 仅当下拉可选项不为空时执行 - if (options.size() > 20) { - // 这里限制如果可选项大于20,则使用额外表形式 + int totalCharacter = options.stream().mapToInt(String::length).sum() + options.size(); + if (options.size() > 20 || totalCharacter > 255) { + // 这里限制如果可选项大于20 或 总字符数超过255,则使用额外表形式 dropDownWithSheet(helper, workbook, sheet, index, options); } else { // 否则使用固定值形式 diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java index 5a27e9189..6f1f523b9 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java @@ -12,6 +12,7 @@ import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.domain.R; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MessageUtils; @@ -76,16 +77,16 @@ public class RepeatSubmitAspect { */ @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult") public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) { - if (jsonResult instanceof R r) { - try { + try { + if (jsonResult instanceof R r) { // 成功则不删除redis数据 保证在有效时间内无法重复提交 - if (r.getCode() == R.SUCCESS) { + if (r.getCode() == HttpStatus.SUCCESS) { return; } RedisUtils.deleteObject(KEY_CACHE.get()); - } finally { - KEY_CACHE.remove(); } + } finally { + KEY_CACHE.remove(); } } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java index 84a8a5c2a..4e410736d 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java @@ -46,6 +46,24 @@ public class DataBaseHelper { } } + /** + * 获取指定数据源对应的数据库类型 + * + * @param dsName 数据源名称 + * @return 指定数据库对应的 DataBaseType 枚举,找不到时默认返回 MY_SQL + * @throws ServiceException 当获取数据库连接或元数据出现异常时抛出业务异常 + */ + public static DataBaseType getDataBaseType(String dsName) { + DataSource dataSource = DS.getDataSource(dsName); + try (Connection conn = dataSource.getConnection()) { + DatabaseMetaData metaData = conn.getMetaData(); + String databaseProductName = metaData.getDatabaseProductName(); + return DataBaseType.find(databaseProductName); + } catch (SQLException e) { + throw new RuntimeException("获取数据库类型失败", e); + } + } + /** * 根据当前数据库类型,生成兼容的 FIND_IN_SET 语句片段 *

diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java index 4c39196e8..0e7094ca2 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.redis.config.properties.RedissonProperties; import org.dromara.common.redis.handler.KeyPrefixHandler; import org.dromara.common.redis.handler.RedisExceptionHandler; @@ -21,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.task.VirtualThreadTaskExecutor; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -65,9 +63,10 @@ public class RedisConfig { // 缓存 Lua 脚本 减少网络传输(redisson 大部分的功能都是基于 Lua 脚本实现) .setUseScriptCache(true) .setCodec(codec); - if (SpringUtils.isVirtual()) { - config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-")); - } + // netty 对虚拟线程适配有问题 暂时禁止使用 + //if (SpringUtils.isVirtual()) { + // config.setNettyExecutor(new VirtualThreadTaskExecutor("redisson-")); + //} RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); if (ObjectUtil.isNotNull(singleServerConfig)) { // 使用单机模式 diff --git a/ruoyi-common/ruoyi-common-satoken/pom.xml b/ruoyi-common/ruoyi-common-satoken/pom.xml index 4df7d4ded..078e8976c 100644 --- a/ruoyi-common/ruoyi-common-satoken/pom.xml +++ b/ruoyi-common/ruoyi-common-satoken/pom.xml @@ -41,6 +41,11 @@ caffeine + + org.springframework + spring-webmvc + + diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java index 7a5d82c3e..0c09a7ebf 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java @@ -2,7 +2,6 @@ package org.dromara.common.web.handler; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; -import com.fasterxml.jackson.core.JsonParseException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.ConstraintViolation; @@ -14,6 +13,7 @@ import org.dromara.common.core.exception.SseException; import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.json.utils.JsonUtils; +import org.springframework.boot.json.JsonParseException; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.expression.ExpressionException; @@ -80,7 +80,7 @@ public class GlobalExceptionHandler { public R handleServletException(ServletException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生未知异常.", requestURI, e); - return R.fail(e.getMessage()); + return R.fail("发生未知异常,请联系管理员"); } /** @@ -119,7 +119,7 @@ public class GlobalExceptionHandler { public R handleNoHandlerFoundException(NoHandlerFoundException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}'不存在.", requestURI); - return R.fail(HttpStatus.HTTP_NOT_FOUND, e.getMessage()); + return R.fail(HttpStatus.HTTP_NOT_FOUND, "请求地址不存在"); } /** @@ -150,7 +150,7 @@ public class GlobalExceptionHandler { public R handleRuntimeException(RuntimeException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生未知异常.", requestURI, e); - return R.fail(e.getMessage()); + return R.fail("发生未知异常,请联系管理员"); } /** @@ -160,7 +160,7 @@ public class GlobalExceptionHandler { public R handleException(Exception e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生系统异常.", requestURI, e); - return R.fail(e.getMessage()); + return R.fail("发生系统异常,请联系管理员"); } /** diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 455f8d9e6..cb4737dbc 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -331,7 +331,7 @@ public class GenTableServiceImpl implements IGenTableService { VelocityContext context = VelocityUtils.prepareContext(table); // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName()); for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); @@ -374,7 +374,7 @@ public class GenTableServiceImpl implements IGenTableService { VelocityContext context = VelocityUtils.prepareContext(table); // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName()); for (String template : templates) { if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) { // 渲染模板 @@ -478,7 +478,7 @@ public class GenTableServiceImpl implements IGenTableService { VelocityContext context = VelocityUtils.prepareContext(table); // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDataName()); for (String template : templates) { // 渲染模板 StringWriter sw = new StringWriter(); diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java index 44c5979ee..f6b4b44aa 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util/VelocityUtils.java @@ -109,7 +109,7 @@ public class VelocityUtils { * * @return 模板列表 */ - public static List getTemplateList(String tplCategory) { + public static List getTemplateList(String tplCategory, String dsName) { List templates = new ArrayList<>(); templates.add("vm/java/domain.java.vm"); templates.add("vm/java/vo.java.vm"); @@ -119,7 +119,7 @@ public class VelocityUtils { templates.add("vm/java/serviceImpl.java.vm"); templates.add("vm/java/controller.java.vm"); templates.add("vm/xml/mapper.xml.vm"); - DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(); + DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(dsName); if (dataBaseType.isOracle()) { templates.add("vm/sql/oracle/sql.vm"); } else if (dataBaseType.isPostgreSql()) { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java index c9f5a1faf..ee557da10 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -104,6 +104,6 @@ public class SysDeptVo implements Serializable { /** * 子部门 */ - private List children = new ArrayList<>(); + private List children = new ArrayList<>(); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index af693e6e1..95f20af7f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -232,8 +232,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { variables.put(SUBMIT, true); } + Map insVariableMap = ins.getVariableMap(); // 设置弹窗处理人 - Map assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap()); + Map assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), insVariableMap); if (CollUtil.isNotEmpty(assigneeMap)) { variables.putAll(assigneeMap); } @@ -249,7 +250,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { .flowStatus(BusinessStatusEnum.WAITING.getStatus()) .hisStatus(TaskStatusEnum.PASS.getStatus()) .hisTaskExt(completeTaskBo.getFileId()); - Boolean autoPass = Convert.toBool(variables.getOrDefault(AUTO_PASS, false)); + Boolean autoPass = Convert.toBool(insVariableMap.getOrDefault(AUTO_PASS, false)); skipTask(taskId, flowParams, flowTask.getInstanceId(), autoPass); return true; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index ead3d0759..3ef902e09 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -88,6 +88,7 @@ and b.del_flag = '0' and c.del_flag = '0' and a.node_type in ('1','3','4') + and a.flow_status ]]> 'copy' ) t ${ew.getCustomSqlSegment} diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index a22ed3163..992a074fc 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -99,7 +99,7 @@ services: network_mode: "host" ruoyi-server1: - image: ruoyi/ruoyi-server:5.6.0 + image: ruoyi/ruoyi-server:5.6.1 container_name: ruoyi-server1 environment: # 时区上海 @@ -115,7 +115,7 @@ services: network_mode: "host" ruoyi-server2: - image: ruoyi/ruoyi-server:5.6.0 + image: ruoyi/ruoyi-server:5.6.1 container_name: ruoyi-server2 environment: # 时区上海 @@ -131,7 +131,7 @@ services: network_mode: "host" ruoyi-monitor-admin: - image: ruoyi/ruoyi-monitor-admin:5.6.0 + image: ruoyi/ruoyi-monitor-admin:5.6.1 container_name: ruoyi-monitor-admin environment: # 时区上海 @@ -143,7 +143,7 @@ services: network_mode: "host" ruoyi-snailjob-server: - image: ruoyi/ruoyi-snailjob-server:5.6.0 + image: ruoyi/ruoyi-snailjob-server:5.6.1 container_name: ruoyi-snailjob-server environment: # 时区上海 diff --git a/script/sql/oracle/oracle_ry_job.sql b/script/sql/oracle/oracle_ry_job.sql index 2a7f11f9a..7a9080666 100644 --- a/script/sql/oracle/oracle_ry_job.sql +++ b/script/sql/oracle/oracle_ry_job.sql @@ -484,6 +484,7 @@ CREATE TABLE sj_job ( id number GENERATED ALWAYS AS IDENTITY, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + biz_id varchar2(64) NOT NULL, group_name varchar2(64) NULL, job_name varchar2(64) NULL, args_str clob DEFAULT NULL NULL, @@ -519,9 +520,11 @@ ALTER TABLE sj_job CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name); CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index); CREATE INDEX idx_sj_job_03 ON sj_job (create_dt); +CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id); COMMENT ON COLUMN sj_job.id IS '主键'; COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job.biz_id IS '业务ID'; COMMENT ON COLUMN sj_job.group_name IS '组名称'; COMMENT ON COLUMN sj_job.job_name IS '名称'; COMMENT ON COLUMN sj_job.args_str IS '执行方法参数'; @@ -551,7 +554,7 @@ COMMENT ON COLUMN sj_job.create_dt IS '创建时间'; COMMENT ON COLUMN sj_job.update_dt IS '修改时间'; COMMENT ON TABLE sj_job IS '任务信息'; -INSERT INTO sj_job(namespace_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES ('dev', 'ruoyi_group', 'demo-job', NULL, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0, sysdate, sysdate); +INSERT INTO sj_job(namespace_id, biz_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES ('dev', 'demo-job', 'ruoyi_group', 'demo-job', NULL, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0, sysdate, sysdate); -- sj_job_log_message CREATE TABLE sj_job_log_message @@ -738,7 +741,7 @@ CREATE TABLE sj_retry_summary id number GENERATED ALWAYS AS IDENTITY, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, group_name varchar2(64) DEFAULT '' NULL, - scene_name varchar2(64) DEFAULT '' NULL, + scene_name varchar2(50) DEFAULT '' NULL, trigger_at date DEFAULT CURRENT_TIMESTAMP NOT NULL, running_num number DEFAULT 0 NOT NULL, finish_num number DEFAULT 0 NOT NULL, @@ -774,6 +777,7 @@ CREATE TABLE sj_workflow id number GENERATED ALWAYS AS IDENTITY, workflow_name varchar2(64) NULL, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + biz_id varchar2(64) NOT NULL, group_name varchar2(64) NULL, workflow_status smallint DEFAULT 1 NOT NULL, trigger_type smallint NOT NULL, @@ -799,10 +803,12 @@ ALTER TABLE sj_workflow CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt); CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name); +CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id); COMMENT ON COLUMN sj_workflow.id IS '主键'; COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称'; COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_workflow.biz_id IS '业务ID'; COMMENT ON COLUMN sj_workflow.group_name IS '组名称'; COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启'; COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; diff --git a/script/sql/postgres/postgres_ry_job.sql b/script/sql/postgres/postgres_ry_job.sql index 9980c3b43..f355632c0 100644 --- a/script/sql/postgres/postgres_ry_job.sql +++ b/script/sql/postgres/postgres_ry_job.sql @@ -445,6 +445,7 @@ CREATE TABLE sj_job ( id bigserial PRIMARY KEY, namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + biz_id varchar(64) NOT NULL, group_name varchar(64) NOT NULL, job_name varchar(64) NOT NULL, args_str text NULL DEFAULT NULL, @@ -477,9 +478,11 @@ CREATE TABLE sj_job CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name); CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index); CREATE INDEX idx_sj_job_03 ON sj_job (create_dt); +CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id); COMMENT ON COLUMN sj_job.id IS '主键'; COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job.biz_id IS '业务ID'; COMMENT ON COLUMN sj_job.group_name IS '组名称'; COMMENT ON COLUMN sj_job.job_name IS '名称'; COMMENT ON COLUMN sj_job.args_str IS '执行方法参数'; @@ -509,7 +512,7 @@ COMMENT ON COLUMN sj_job.create_dt IS '创建时间'; COMMENT ON COLUMN sj_job.update_dt IS '修改时间'; COMMENT ON TABLE sj_job IS '任务信息'; -INSERT INTO sj_job VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '', '', '', 0, now(), now()); +INSERT INTO sj_job VALUES (1, 'dev', 'demo-job', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '', '', '', 0, now(), now()); -- sj_job_log_message CREATE TABLE sj_job_log_message @@ -684,7 +687,7 @@ CREATE TABLE sj_retry_summary id bigserial PRIMARY KEY, namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', group_name varchar(64) NOT NULL DEFAULT '', - scene_name varchar(64) NOT NULL DEFAULT '', + scene_name varchar(50) NOT NULL DEFAULT '', trigger_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, running_num int NOT NULL DEFAULT 0, finish_num int NOT NULL DEFAULT 0, @@ -717,6 +720,7 @@ CREATE TABLE sj_workflow id bigserial PRIMARY KEY, workflow_name varchar(64) NOT NULL, namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + biz_id varchar(64) NOT NULL, group_name varchar(64) NOT NULL, workflow_status smallint NOT NULL DEFAULT 1, trigger_type smallint NOT NULL, @@ -739,10 +743,12 @@ CREATE TABLE sj_workflow CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt); CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name); +CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id); COMMENT ON COLUMN sj_workflow.id IS '主键'; COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称'; COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_workflow.biz_id IS '业务ID'; COMMENT ON COLUMN sj_workflow.group_name IS '组名称'; COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启'; COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; diff --git a/script/sql/ry_job.sql b/script/sql/ry_job.sql index dd8124cf5..e7b627f49 100644 --- a/script/sql/ry_job.sql +++ b/script/sql/ry_job.sql @@ -280,6 +280,7 @@ CREATE TABLE `sj_job` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `biz_id` varchar(64) NOT NULL COMMENT '业务ID', `group_name` varchar(64) NOT NULL COMMENT '组名称', `job_name` varchar(64) NOT NULL COMMENT '名称', `args_str` text DEFAULT NULL COMMENT '执行方法参数', @@ -310,12 +311,13 @@ CREATE TABLE `sj_job` PRIMARY KEY (`id`), KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), KEY `idx_job_status_bucket_index` (`job_status`, `bucket_index`), - KEY `idx_create_dt` (`create_dt`) + KEY `idx_create_dt` (`create_dt`), + UNIQUE KEY `uk_sj_job_01` (`namespace_id`, `biz_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 0 DEFAULT CHARSET = utf8mb4 COMMENT ='任务信息'; -INSERT INTO `sj_job` VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0 , now(), now()); +INSERT INTO `sj_job` VALUES (1, 'dev', 'demo-job', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', 1, '','', '', 0 , now(), now()); CREATE TABLE `sj_job_log_message` ( @@ -443,6 +445,7 @@ CREATE TABLE `sj_workflow` `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `workflow_name` varchar(64) NOT NULL COMMENT '工作流名称', `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `biz_id` varchar(64) NOT NULL COMMENT '业务ID', `group_name` varchar(64) NOT NULL COMMENT '组名称', `workflow_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '工作流状态 0、关闭、1、开启', `trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间', @@ -463,7 +466,8 @@ CREATE TABLE `sj_workflow` `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), KEY `idx_create_dt` (`create_dt`), - KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), + UNIQUE KEY `uk_sj_workflow_01` (`namespace_id`, `biz_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 0 DEFAULT CHARSET = utf8mb4 COMMENT ='工作流'; diff --git a/script/sql/sqlserver/sqlserver_ry_job.sql b/script/sql/sqlserver/sqlserver_ry_job.sql index ceb8c459b..6fbf7a6d2 100644 --- a/script/sql/sqlserver/sqlserver_ry_job.sql +++ b/script/sql/sqlserver/sqlserver_ry_job.sql @@ -1428,6 +1428,7 @@ CREATE TABLE sj_job ( id bigint NOT NULL PRIMARY KEY IDENTITY, namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + biz_id nvarchar(64) NOT NULL, group_name nvarchar(64) NOT NULL, job_name nvarchar(64) NOT NULL, args_str nvarchar(max) NULL DEFAULT NULL, @@ -1464,6 +1465,8 @@ CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index) GO CREATE INDEX idx_sj_job_03 ON sj_job (create_dt) GO +CREATE UNIQUE INDEX uk_sj_job_01 ON sj_job (namespace_id, biz_id) +GO EXEC sp_addextendedproperty 'MS_Description', N'主键', @@ -1479,6 +1482,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'namespace_id' GO +EXEC sp_addextendedproperty + 'MS_Description', N'业务ID', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_job', + 'COLUMN', N'biz_id' +GO + EXEC sp_addextendedproperty 'MS_Description', N'组名称', 'SCHEMA', N'dbo', @@ -1674,7 +1684,7 @@ EXEC sp_addextendedproperty 'TABLE', N'sj_job' GO -INSERT INTO sj_job (namespace_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES (N'dev', N'ruoyi_group', N'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, N'testJobExecutor', 2, N'60', 1, 60, 3, 1, 1, 116, 0, N'', 1, N'', N'', N'', 0, getdate(), getdate()) +INSERT INTO sj_job (namespace_id, biz_id, group_name, job_name, args_str, args_type, next_trigger_at, job_status, task_type, route_key, executor_type, executor_info, trigger_type, trigger_interval, block_strategy,executor_timeout, max_retry_times, parallel_num, retry_interval, bucket_index, resident, notify_ids, owner_id, labels, description, ext_attrs, deleted, create_dt, update_dt) VALUES (N'dev', N'demo-job', N'ruoyi_group', N'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, N'testJobExecutor', 2, N'60', 1, 60, 3, 1, 1, 116, 0, N'', 1, N'', N'', N'', 0, getdate(), getdate()) GO -- sj_job_log_message @@ -2248,7 +2258,7 @@ CREATE TABLE sj_retry_summary id bigint NOT NULL PRIMARY KEY IDENTITY, namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', group_name nvarchar(64) NOT NULL DEFAULT '', - scene_name nvarchar(64) NOT NULL DEFAULT '', + scene_name nvarchar(50) NOT NULL DEFAULT '', trigger_at datetime2 NOT NULL DEFAULT CURRENT_TIMESTAMP, running_num int NOT NULL DEFAULT 0, finish_num int NOT NULL DEFAULT 0, @@ -2354,6 +2364,7 @@ CREATE TABLE sj_workflow id bigint NOT NULL PRIMARY KEY IDENTITY, workflow_name nvarchar(64) NOT NULL, namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + biz_id nvarchar(64) NOT NULL, group_name nvarchar(64) NOT NULL, workflow_status tinyint NOT NULL DEFAULT 1, trigger_type tinyint NOT NULL, @@ -2379,6 +2390,8 @@ CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt) GO CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name) GO +CREATE UNIQUE INDEX uk_sj_workflow_01 ON sj_workflow (namespace_id, biz_id) +GO EXEC sp_addextendedproperty 'MS_Description', N'主键', @@ -2401,6 +2414,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'namespace_id' GO +EXEC sp_addextendedproperty + 'MS_Description', N'业务ID', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_workflow', + 'COLUMN', N'biz_id' +GO + EXEC sp_addextendedproperty 'MS_Description', N'组名称', 'SCHEMA', N'dbo',