From 82a5ed632fe6c9f34067fed63a6b9854007c1b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 19 May 2025 16:06:17 +0800 Subject: [PATCH 1/7] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20=E6=88=90?= =?UTF-8?q?=E5=91=98=E9=A1=B9=E7=9B=AE=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f4d4a2873..fe60405d5 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ > 官方前端项目地址: [gitee](https://gitee.com/JavaLionLi/plus-ui) - [github](https://github.com/JavaLionLi/plus-ui) - [gitcode](https://gitcode.com/dromara/plus-ui)
> 成员前端项目地址: 基于vben5 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5) > 成员前端项目地址: 基于soybean [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean) +> 成员项目地址: 删除多租户与工作流 [RuoYi-Vue-Plus-Single](https://gitee.com/ColorDreams/RuoYi-Vue-Plus-Single) > 文档地址: [plus-doc](https://plus-doc.dromara.org) 文档在华为云上如果打不开大概率是DNS问题 可以尝试切换网络等方式(或者科学上网) From 62bbd78033eae84200b2fcd33ec3cd6f584d5f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 19 May 2025 17:09:38 +0800 Subject: [PATCH 2/7] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20=E6=88=90?= =?UTF-8?q?=E5=91=98=E9=A1=B9=E7=9B=AE=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fe60405d5..a6fd86c93 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ > 系统演示: [传送门](https://plus-doc.dromara.org/#/common/demo_system) > 官方前端项目地址: [gitee](https://gitee.com/JavaLionLi/plus-ui) - [github](https://github.com/JavaLionLi/plus-ui) - [gitcode](https://gitcode.com/dromara/plus-ui)
-> 成员前端项目地址: 基于vben5 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5) -> 成员前端项目地址: 基于soybean [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean) -> 成员项目地址: 删除多租户与工作流 [RuoYi-Vue-Plus-Single](https://gitee.com/ColorDreams/RuoYi-Vue-Plus-Single) +> 成员前端项目地址: 基于vben5 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5)
+> 成员前端项目地址: 基于soybean [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean)
+> 成员项目地址: 删除多租户与工作流 [RuoYi-Vue-Plus-Single](https://gitee.com/ColorDreams/RuoYi-Vue-Plus-Single)
> 文档地址: [plus-doc](https://plus-doc.dromara.org) 文档在华为云上如果打不开大概率是DNS问题 可以尝试切换网络等方式(或者科学上网) From c054029cfcb20411733a369cf9296dba5cbfbcf7 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 19 May 2025 21:23:45 +0800 Subject: [PATCH 3/7] update snailjob 1.4.0 => 1.5.0 --- pom.xml | 2 +- script/sql/oracle/oracle_ry_job.sql | 27 ++++++++----- script/sql/postgres/postgres_ry_job.sql | 24 ++++++++---- script/sql/ry_job.sql | 11 ++++-- script/sql/sqlserver/sqlserver_ry_job.sql | 48 ++++++++++++++++++----- 5 files changed, 80 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index 39ca8809c..cdfd7bc56 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 3.45.1 2.2.7 4.3.1 - 1.4.0 + 1.5.0 1.4.6 0.2.0 1.18.36 diff --git a/script/sql/oracle/oracle_ry_job.sql b/script/sql/oracle/oracle_ry_job.sql index 104aabbaa..ba914e5f6 100644 --- a/script/sql/oracle/oracle_ry_job.sql +++ b/script/sql/oracle/oracle_ry_job.sql @@ -3,7 +3,7 @@ SnailJob Database Transfer Tool Source Server Type : MySQL Target Server Type : Oracle - Date: 2025-02-25 22:16:28 + Date: 2025-04-26 10:01:54 */ @@ -149,7 +149,9 @@ CREATE TABLE sj_retry_dead_letter id number GENERATED ALWAYS AS IDENTITY, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, group_name varchar2(64) NULL, + group_id number NOT NULL, scene_name varchar2(64) NULL, + scene_id number NOT NULL, idempotent_id varchar2(64) NULL, biz_no varchar2(64) DEFAULT '' NULL, executor_name varchar2(512) DEFAULT '' NULL, @@ -169,7 +171,9 @@ 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.group_id IS '组Id'; COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_dead_letter.scene_id IS '场景ID'; 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 '执行器名称'; @@ -184,7 +188,9 @@ CREATE TABLE sj_retry id number GENERATED ALWAYS AS IDENTITY, namespace_id varchar2(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, group_name varchar2(64) NULL, + group_id number NOT NULL, scene_name varchar2(64) NULL, + scene_id number NOT NULL, idempotent_id varchar2(64) NULL, biz_no varchar2(64) DEFAULT '' NULL, executor_name varchar2(512) DEFAULT '' NULL, @@ -204,19 +210,20 @@ CREATE TABLE sj_retry 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 UNIQUE INDEX uk_sj_retry_01 ON sj_retry (scene_id, 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); +CREATE INDEX idx_sj_retry_01 ON sj_retry (biz_no); +CREATE INDEX idx_sj_retry_02 ON sj_retry (retry_status, bucket_index); +CREATE INDEX idx_sj_retry_03 ON sj_retry (parent_id); +CREATE INDEX idx_sj_retry_04 ON sj_retry (create_dt); +CREATE INDEX idx_sj_retry_05 ON sj_retry (idempotent_id); 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.group_id IS '组Id'; COMMENT ON COLUMN sj_retry.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry.scene_id IS '场景ID'; 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 '执行器名称'; @@ -395,7 +402,7 @@ COMMENT ON TABLE sj_server_node IS '服务器节点'; -- sj_distributed_lock CREATE TABLE sj_distributed_lock ( - name varchar2(64) NOT NULL, + name varchar2(64) NULL, lock_until timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, locked_at timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, locked_by varchar2(255) NULL, @@ -404,7 +411,7 @@ CREATE TABLE sj_distributed_lock ); ALTER TABLE sj_distributed_lock - ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (name); + ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (id); COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称'; COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长'; diff --git a/script/sql/postgres/postgres_ry_job.sql b/script/sql/postgres/postgres_ry_job.sql index 8b682dfe5..10612e65c 100644 --- a/script/sql/postgres/postgres_ry_job.sql +++ b/script/sql/postgres/postgres_ry_job.sql @@ -2,7 +2,7 @@ SnailJob Database Transfer Tool Source Server Type : MySQL Target Server Type : PostgreSQL - Date: 2025-02-25 22:15:32 + Date: 2025-04-26 09:56:45 */ @@ -136,7 +136,9 @@ CREATE TABLE sj_retry_dead_letter id bigserial PRIMARY KEY, namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', group_name varchar(64) NOT NULL, + group_id bigint NOT NULL, scene_name varchar(64) NOT NULL, + scene_id bigint NOT NULL, idempotent_id varchar(64) NOT NULL, biz_no varchar(64) NOT NULL DEFAULT '', executor_name varchar(512) NOT NULL DEFAULT '', @@ -153,7 +155,9 @@ 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.group_id IS '组Id'; COMMENT ON COLUMN sj_retry_dead_letter.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_dead_letter.scene_id IS '场景ID'; 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 '执行器名称'; @@ -168,7 +172,9 @@ CREATE TABLE sj_retry id bigserial PRIMARY KEY, namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', group_name varchar(64) NOT NULL, + group_id bigint NOT NULL, scene_name varchar(64) NOT NULL, + scene_id bigint NOT NULL, idempotent_id varchar(64) NOT NULL, biz_no varchar(64) NOT NULL DEFAULT '', executor_name varchar(512) NOT NULL DEFAULT '', @@ -185,19 +191,21 @@ CREATE TABLE sj_retry update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ); -CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted); +CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (scene_id, task_type, idempotent_id, deleted); + +CREATE INDEX idx_sj_retry_01 ON sj_retry (biz_no); +CREATE INDEX idx_sj_retry_02 ON sj_retry (retry_status, bucket_index); +CREATE INDEX idx_sj_retry_03 ON sj_retry (parent_id); +CREATE INDEX idx_sj_retry_04 ON sj_retry (create_dt); +CREATE INDEX idx_sj_retry_05 ON sj_retry (idempotent_id); -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.group_id IS '组Id'; COMMENT ON COLUMN sj_retry.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry.scene_id IS '场景ID'; 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 '执行器名称'; diff --git a/script/sql/ry_job.sql b/script/sql/ry_job.sql index 3577d6614..dd86deb45 100644 --- a/script/sql/ry_job.sql +++ b/script/sql/ry_job.sql @@ -84,7 +84,9 @@ 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', `group_name` varchar(64) NOT NULL COMMENT '组名称', + `group_id` bigint(20) NOT NULL COMMENT '组Id', `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `scene_id` bigint(20) NOT NULL COMMENT '场景ID', `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', @@ -105,7 +107,9 @@ CREATE TABLE `sj_retry` `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 '组名称', + `group_id` bigint(20) NOT NULL COMMENT '组Id', `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `scene_id` bigint(20) NOT NULL COMMENT '场景ID', `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', @@ -121,13 +125,12 @@ CREATE TABLE `sj_retry` `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_retry_status` (`namespace_id`, `group_name`, `retry_status`), - KEY `idx_idempotent_id` (`idempotent_id`), KEY `idx_biz_no` (`biz_no`), + KEY `idx_idempotent_id` (`idempotent_id`), + KEY `idx_retry_status_bucket_index` (`retry_status`, `bucket_index`), KEY `idx_parent_id` (`parent_id`), KEY `idx_create_dt` (`create_dt`), - UNIQUE KEY `uk_name_task_type_idempotent_id_deleted` (`namespace_id`, `group_name`, `task_type`, `idempotent_id`, `deleted`) + UNIQUE KEY `uk_scene_tasktype_idempotentid_deleted` (`scene_id`, `task_type`, `idempotent_id`, `deleted`) ) 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 5a0bbb39b..9268e9f0d 100644 --- a/script/sql/sqlserver/sqlserver_ry_job.sql +++ b/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: 2025-02-25 22:16:48 + Date: 2025-04-26 10:03:23 */ @@ -410,7 +410,9 @@ CREATE TABLE sj_retry_dead_letter id bigint NOT NULL PRIMARY KEY IDENTITY, namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', group_name nvarchar(64) NOT NULL, + group_id bigint NOT NULL, scene_name nvarchar(64) NOT NULL, + scene_id bigint NOT NULL, idempotent_id nvarchar(64) NOT NULL, biz_no nvarchar(64) NOT NULL DEFAULT '', executor_name nvarchar(512) NOT NULL DEFAULT '', @@ -450,6 +452,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'group_name' GO +EXEC sp_addextendedproperty + 'MS_Description', N'组Id', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_retry_dead_letter', + 'COLUMN', N'group_id' +GO + EXEC sp_addextendedproperty 'MS_Description', N'场景名称', 'SCHEMA', N'dbo', @@ -457,6 +466,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'scene_name' GO +EXEC sp_addextendedproperty + 'MS_Description', N'场景ID', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_retry_dead_letter', + 'COLUMN', N'scene_id' +GO + EXEC sp_addextendedproperty 'MS_Description', N'幂等id', 'SCHEMA', N'dbo', @@ -511,7 +527,9 @@ CREATE TABLE sj_retry id bigint NOT NULL PRIMARY KEY IDENTITY, namespace_id nvarchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', group_name nvarchar(64) NOT NULL, + group_id bigint NOT NULL, scene_name nvarchar(64) NOT NULL, + scene_id bigint NOT NULL, idempotent_id nvarchar(64) NOT NULL, biz_no nvarchar(64) NOT NULL DEFAULT '', executor_name nvarchar(512) NOT NULL DEFAULT '', @@ -529,20 +547,18 @@ CREATE TABLE sj_retry ) GO -CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted) +CREATE UNIQUE INDEX uk_sj_retry_01 ON sj_retry (scene_id, task_type, idempotent_id, deleted) GO -CREATE INDEX idx_sj_retry_01 ON sj_retry (namespace_id, group_name, scene_name) +CREATE INDEX idx_sj_retry_01 ON sj_retry (biz_no) GO -CREATE INDEX idx_sj_retry_02 ON sj_retry (namespace_id, group_name, retry_status) +CREATE INDEX idx_sj_retry_02 ON sj_retry (retry_status, bucket_index) GO -CREATE INDEX idx_sj_retry_03 ON sj_retry (idempotent_id) +CREATE INDEX idx_sj_retry_03 ON sj_retry (parent_id) GO -CREATE INDEX idx_sj_retry_04 ON sj_retry (biz_no) +CREATE INDEX idx_sj_retry_04 ON sj_retry (create_dt) GO -CREATE INDEX idx_sj_retry_05 ON sj_retry (parent_id) -GO -CREATE INDEX idx_sj_retry_06 ON sj_retry (create_dt) +CREATE INDEX idx_sj_retry_05 ON sj_retry (idempotent_id) GO EXEC sp_addextendedproperty @@ -566,6 +582,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'group_name' GO +EXEC sp_addextendedproperty + 'MS_Description', N'组Id', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_retry', + 'COLUMN', N'group_id' +GO + EXEC sp_addextendedproperty 'MS_Description', N'场景名称', 'SCHEMA', N'dbo', @@ -573,6 +596,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'scene_name' GO +EXEC sp_addextendedproperty + 'MS_Description', N'场景ID', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_retry', + 'COLUMN', N'scene_id' +GO + EXEC sp_addextendedproperty 'MS_Description', N'幂等id', 'SCHEMA', N'dbo', From 737838d92fafe41882db7552af11f56c5aed945e Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 20 May 2025 12:31:49 +0800 Subject: [PATCH 4/7] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=AD=97=E5=85=B8=E5=80=BC=E6=A0=A1=E9=AA=8C=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/DictService.java | 9 +++ .../common/core/validate/dict/DictValue.java | 35 +++++++++ .../validate/dict/DictValueValidator.java | 42 +++++++++++ .../validate/enumd/EnumPatternValidator.java | 74 +++++++++---------- .../service/impl/SysDictTypeServiceImpl.java | 20 +++++ 5 files changed, 143 insertions(+), 37 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java index d80395cc8..fc33f1e35 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -84,4 +84,13 @@ public interface DictService { */ List getDictData(String dictType); + /** + * 校验指定的字典类型下是否存在指定的字典值 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return true 表示该字典值在指定字典类型中有效;false 表示无效 + */ + Boolean isValidDictValue(String dictType, String dictValue); + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java new file mode 100644 index 000000000..be842723a --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java @@ -0,0 +1,35 @@ +package org.dromara.common.core.validate.dict; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 字典项校验注解 + * + * @author AprilWind + */ +@Constraint(validatedBy = DictValueValidator.class) +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DictValue { + + /** + * 字典类型,如 "sys_user_sex" + */ + String dictType(); + + /** + * 默认校验失败提示信息 + */ + String message() default "字典值无效"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java new file mode 100644 index 000000000..8507e219e --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java @@ -0,0 +1,42 @@ +package org.dromara.common.core.validate.dict; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.SpringUtils; + +/** + * 自定义字典值校验器 + * + * @author AprilWind + */ +public class DictValueValidator implements ConstraintValidator { + + /** + * 字典类型 + */ + private String dictType; + + /** + * 初始化校验器,提取注解上的字典类型 + * + * @param annotation 注解实例 + */ + @Override + public void initialize(DictValue annotation) { + this.dictType = annotation.dictType(); + } + + /** + * 校验字段值是否为指定字典类型中的合法值 + * + * @param value 被校验的字段值 + * @param context 校验上下文(可用于构建错误信息) + * @return true 表示校验通过(合法字典值),false 表示不通过 + */ + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + return SpringUtils.getBean(DictService.class).isValidDictValue(dictType, value); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java index 6cfa11a33..e63f44a00 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/EnumPatternValidator.java @@ -1,37 +1,37 @@ -package org.dromara.common.core.validate.enumd; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.reflect.ReflectUtils; - -/** - * 自定义枚举校验注解实现 - * - * @author 秋辞未寒 - * @date 2024-12-09 - */ -public class EnumPatternValidator implements ConstraintValidator { - - private EnumPattern annotation;; - - @Override - public void initialize(EnumPattern annotation) { - ConstraintValidator.super.initialize(annotation); - this.annotation = annotation; - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { - if (StringUtils.isNotBlank(value)) { - String fieldName = annotation.fieldName(); - for (Object e : annotation.type().getEnumConstants()) { - if (value.equals(ReflectUtils.invokeGetter(e, fieldName))) { - return true; - } - } - } - return false; - } - -} +package org.dromara.common.core.validate.enumd; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; + +/** + * 自定义枚举校验注解实现 + * + * @author 秋辞未寒 + * @date 2024-12-09 + */ +public class EnumPatternValidator implements ConstraintValidator { + + private EnumPattern annotation; + + @Override + public void initialize(EnumPattern annotation) { + ConstraintValidator.super.initialize(annotation); + this.annotation = annotation; + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + if (StringUtils.isNotBlank(value)) { + String fieldName = annotation.fieldName(); + for (Object e : annotation.type().getEnumConstants()) { + if (value.equals(ReflectUtils.invokeGetter(e, fieldName))) { + return true; + } + } + } + return false; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index c417b42ca..7eaea5563 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -294,4 +294,24 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService return BeanUtil.copyToList(list, DictDataDTO.class); } + /** + * 校验指定的字典类型下是否存在指定的字典值 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return true 表示该字典值在指定字典类型中有效;false 表示无效 + */ + @Override + public Boolean isValidDictValue(String dictType, String dictValue) { + if (StringUtils.isBlank(dictType) || StringUtils.isBlank(dictValue)) { + return false; + } + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + if (CollUtil.isEmpty(datas)) { + return false; + } + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + return map.containsKey(dictValue); + } + } From 1228e8f3eaacf96d61a652cf424e9483205ff84c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 20 May 2025 14:03:11 +0800 Subject: [PATCH 5/7] =?UTF-8?q?update=20=E7=BB=9F=E4=B8=80=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E5=99=A8=E5=90=8D=E7=A7=B0=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{dict/DictValue.java => dicts/DictPattern.java} | 6 +++--- .../DictPatternValidator.java} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/{dict/DictValue.java => dicts/DictPattern.java} (83%) rename ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/{dict/DictValueValidator.java => dicts/DictPatternValidator.java} (84%) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java similarity index 83% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java index be842723a..d5199873d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValue.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.validate.dict; +package org.dromara.common.core.validate.dicts; import jakarta.validation.Constraint; import jakarta.validation.Payload; @@ -13,10 +13,10 @@ import java.lang.annotation.Target; * * @author AprilWind */ -@Constraint(validatedBy = DictValueValidator.class) +@Constraint(validatedBy = DictPatternValidator.class) @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) -public @interface DictValue { +public @interface DictPattern { /** * 字典类型,如 "sys_user_sex" diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java similarity index 84% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java index 8507e219e..734975aea 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dict/DictValueValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java @@ -1,4 +1,4 @@ -package org.dromara.common.core.validate.dict; +package org.dromara.common.core.validate.dicts; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; @@ -10,7 +10,7 @@ import org.dromara.common.core.utils.SpringUtils; * * @author AprilWind */ -public class DictValueValidator implements ConstraintValidator { +public class DictPatternValidator implements ConstraintValidator { /** * 字典类型 @@ -23,7 +23,7 @@ public class DictValueValidator implements ConstraintValidator Date: Tue, 20 May 2025 14:19:21 +0800 Subject: [PATCH 6/7] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E9=A1=B9=E6=A0=A1=E9=AA=8C=E6=B3=A8=E8=A7=A3=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=88=86=E9=9A=94=E7=AC=A6=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/DictService.java | 9 --------- .../core/validate/dicts/DictPattern.java | 5 +++++ .../validate/dicts/DictPatternValidator.java | 15 +++++++++++++- .../service/impl/SysDictTypeServiceImpl.java | 20 ------------------- 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java index fc33f1e35..d80395cc8 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -84,13 +84,4 @@ public interface DictService { */ List getDictData(String dictType); - /** - * 校验指定的字典类型下是否存在指定的字典值 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @return true 表示该字典值在指定字典类型中有效;false 表示无效 - */ - Boolean isValidDictValue(String dictType, String dictValue); - } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java index d5199873d..73fc4c444 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPattern.java @@ -23,6 +23,11 @@ public @interface DictPattern { */ String dictType(); + /** + * 分隔符 + */ + String separator(); + /** * 默认校验失败提示信息 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java index 734975aea..558a3438a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/dicts/DictPatternValidator.java @@ -4,6 +4,7 @@ import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; /** * 自定义字典值校验器 @@ -17,6 +18,11 @@ public class DictPatternValidator implements ConstraintValidator datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); - if (CollUtil.isEmpty(datas)) { - return false; - } - Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); - return map.containsKey(dictValue); - } - } From 1db0bc83b27deb43927711d5f40f4b5e613bc234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 21 May 2025 15:42:42 +0800 Subject: [PATCH 7/7] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=88=9B=E5=BB=BA=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E5=B0=86=E7=8A=B6=E6=80=81=E4=BA=A4=E7=BB=99=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E6=96=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/domain/event/ProcessCreateTaskEvent.java | 5 +++++ .../dromara/workflow/handler/FlowProcessEventHandler.java | 1 + .../dromara/workflow/listener/WorkflowGlobalListener.java | 2 +- .../workflow/service/impl/TestLeaveServiceImpl.java | 8 +++++--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java index d603884d1..81d43fdc9 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java @@ -51,4 +51,9 @@ public class ProcessCreateTaskEvent implements Serializable { */ private String businessId; + /** + * 流程状态 + */ + private String status; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index c9e7a9237..6a15d43ba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -68,6 +68,7 @@ public class FlowProcessEventHandler { processCreateTaskEvent.setNodeCode(instance.getNodeCode()); processCreateTaskEvent.setNodeName(instance.getNodeName()); processCreateTaskEvent.setTaskId(taskId); + processCreateTaskEvent.setStatus(instance.getFlowStatus()); SpringUtils.context().publishEvent(processCreateTaskEvent); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index a46cbc5b3..2c95f8aaa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -52,7 +52,7 @@ public class WorkflowGlobalListener implements GlobalListener { Instance instance = listenerVariable.getInstance(); Definition definition = listenerVariable.getDefinition(); Task task = listenerVariable.getTask(); - if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(instance.getFlowStatus())) { + if (task != null) { // 判断流程状态(发布审批中事件) flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), instance, task.getId()); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java index 4ed393e58..521d890e9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java @@ -176,9 +176,11 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @EventListener(condition = "#processCreateTaskEvent.flowCode.startsWith('leave')") public void processCreateTaskHandler(ProcessCreateTaskEvent processCreateTaskEvent) { log.info("当前任务创建了{}", processCreateTaskEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processCreateTaskEvent.getBusinessId())); - testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); - baseMapper.updateById(testLeave); + if (BusinessStatusEnum.WAITING.getStatus().equals(processCreateTaskEvent.getStatus())) { + TestLeave testLeave = baseMapper.selectById(Long.valueOf(processCreateTaskEvent.getBusinessId())); + testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); + baseMapper.updateById(testLeave); + } } /**