From 3c57c0e7f9c16661fe9761140bf4d42a154a87df 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: Tue, 11 Feb 2025 09:51:31 +0800 Subject: [PATCH 001/155] =?UTF-8?q?update=20springboot-admin=203.4.1=20=3D?= =?UTF-8?q?>=203.4.2=20=E4=BF=AE=E5=A4=8D=E9=87=8D=E6=96=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95404=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d4366f2d..2856eefc2 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 3.5.10 3.9.1 5.8.35 - 3.4.1 + 3.4.2 3.44.0 2.2.7 4.3.1 From 78abb617cecc0f07795e83691aa149f89d8c81f2 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: Tue, 11 Feb 2025 16:03:14 +0800 Subject: [PATCH 002/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20nginx?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E9=9D=99=E6=80=81=E8=B5=84=E6=BA=90=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=20=E5=A2=9E=E5=8A=A0=E9=9D=99=E6=80=81=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BC=A0=E8=BE=93=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/nginx/conf/nginx.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf index 3c79d97f6..22b074f1d 100644 --- a/script/docker/nginx/conf/nginx.conf +++ b/script/docker/nginx/conf/nginx.conf @@ -14,6 +14,8 @@ http { keepalive_timeout 65; # 限制body大小 client_max_body_size 100m; + # 开启静态资源压缩 + gzip_static on; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' From 2746af21f0f4228d6cd30b2f27fc742c40c2f583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Thu, 13 Feb 2025 17:39:30 +0800 Subject: [PATCH 003/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=A0=B9?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E7=A5=96=E7=BA=A7=E5=88=97=E8=A1=A8=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E5=92=8C=E5=A4=87=E6=B3=A8=EF=BC=8C=E4=BB=A5=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E6=AD=A7=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/constant/SystemConstants.java | 5 +++++ .../org/dromara/system/service/impl/SysDeptServiceImpl.java | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java index 55240bbf8..8a37a51fc 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/SystemConstants.java @@ -72,4 +72,9 @@ public interface SystemConstants { */ Long SUPER_ADMIN_ID = 1L; + /** + * 根部门祖级列表 + */ + String ROOT_DEPT_ANCESTORS = "0"; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index ca062bee6..ecd309f4e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -323,8 +323,10 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { dept.setAncestors(oldDept.getAncestors()); } int result = baseMapper.updateById(dept); - if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) - && !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) { + // 如果部门状态为启用,且部门祖级列表不为空,且部门祖级列表不等于根部门祖级列表(如果部门祖级列表不等于根部门祖级列表,则说明存在上级部门) + if (SystemConstants.NORMAL.equals(dept.getStatus()) + && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals(SystemConstants.ROOT_DEPT_ANCESTORS, dept.getAncestors())) { // 如果该部门是启用状态,则启用该部门的所有上级部门 updateParentDeptStatusNormal(dept); } From eb17eb655919aa8f24b3f6e8d2e0992921f64e26 Mon Sep 17 00:00:00 2001 From: QianRj <14974713+qianrj@user.noreply.gitee.com> Date: Sat, 15 Feb 2025 04:58:37 +0000 Subject: [PATCH 004/155] =?UTF-8?q?!646=20fix=20=E4=BF=AE=E5=A4=8DCaffeine?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=9C=AA=E6=B8=85=E7=A9=BA=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E9=97=A8=E5=88=9B=E5=BB=BA=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F=E9=97=AE=E9=A2=98=20*=20fix=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DCaffeine=E7=BC=93=E5=AD=98=E6=9C=AA=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E9=83=A8=E9=97=A8=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BB=B6=E8=BF=9F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/redis/manager/CaffeineCacheDecorator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java index 6e83df13a..8662c537d 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/CaffeineCacheDecorator.java @@ -78,6 +78,7 @@ public class CaffeineCacheDecorator implements Cache { @Override public void clear() { + CAFFEINE.invalidateAll(); cache.clear(); } From 236dd6e054658ddb21bc0bd3e6cc979713786218 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, 17 Feb 2025 15:22:42 +0800 Subject: [PATCH 005/155] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-workflow/README.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/README.md diff --git a/ruoyi-modules/ruoyi-workflow/README.md b/ruoyi-modules/ruoyi-workflow/README.md deleted file mode 100644 index 59096b10e..000000000 --- a/ruoyi-modules/ruoyi-workflow/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# 工作流说明 - -工作流目前在未成熟阶段 后续仍会经历重构 甚至重写(生产使用前请慎重考虑后续是否要更新维护) \ No newline at end of file From 906a031172691f928cb3cef638a061fb41d845d8 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 19 Feb 2025 09:07:46 +0800 Subject: [PATCH 006/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E4=B8=8B=E5=B2=97=E4=BD=8D=E5=90=8D=E7=A7=B0=E9=87=8D?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/system/service/impl/SysPostServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 5888985a7..894f6acc8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -154,6 +154,7 @@ public class SysPostServiceImpl implements ISysPostService, PostService { public boolean checkPostNameUnique(SysPostBo post) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysPost::getPostName, post.getPostName()) + .eq(SysPost::getDeptId, post.getDeptId()) .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); return !exist; } From 214cbac9a6864b72406a8e70aac42113e1f4f9e0 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, 19 Feb 2025 09:43:10 +0800 Subject: [PATCH 007/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20ProcessTa?= =?UTF-8?q?skEvent=20=E6=94=B9=E5=90=8D=E4=B8=BA=20ProcessCreateTaskEvent?= =?UTF-8?q?=20=E9=81=BF=E5=85=8D=E9=94=99=E8=AF=AF=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Event.java => ProcessCreateTaskEvent.java} | 4 ++-- .../handler/FlowProcessEventHandler.java | 22 +++++++++---------- .../listener/WorkflowGlobalListener.java | 2 +- .../service/impl/TestLeaveServiceImpl.java | 20 ++++++++--------- 4 files changed, 24 insertions(+), 24 deletions(-) rename ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/{ProcessTaskEvent.java => ProcessCreateTaskEvent.java} (85%) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java similarity index 85% rename from ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java rename to ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java index 33bc6e5a6..05047ab84 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessCreateTaskEvent.java @@ -6,12 +6,12 @@ import java.io.Serial; import java.io.Serializable; /** - * 流程办理监听 + * 流程创建任务监听 * * @author may */ @Data -public class ProcessTaskEvent implements Serializable { +public class ProcessCreateTaskEvent implements Serializable { @Serial private static final long serialVersionUID = 1L; 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 4b215ef60..3efc52da8 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 @@ -1,9 +1,9 @@ package org.dromara.workflow.handler; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessCreateTaskEvent; import org.dromara.common.core.domain.event.ProcessDeleteEvent; import org.dromara.common.core.domain.event.ProcessEvent; -import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.ConditionalOnEnable; @@ -23,7 +23,7 @@ import java.util.Map; public class FlowProcessEventHandler { /** - * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) * * @param flowCode 流程定义编码 * @param businessId 业务id @@ -44,23 +44,23 @@ public class FlowProcessEventHandler { } /** - * 执行办理任务监听 + * 执行创建任务监听 * * @param flowCode 流程定义编码 * @param nodeCode 审批节点编码 * @param taskId 任务id * @param businessId 业务id */ - public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) { + public void processCreateTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) { String tenantId = TenantHelper.getTenantId(); log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点编码: {}, 任务ID: {}, 业务ID: {}", tenantId, flowCode, nodeCode, taskId, businessId); - ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); - processTaskEvent.setTenantId(tenantId); - processTaskEvent.setFlowCode(flowCode); - processTaskEvent.setNodeCode(nodeCode); - processTaskEvent.setTaskId(taskId); - processTaskEvent.setBusinessId(businessId); - SpringUtils.context().publishEvent(processTaskEvent); + ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent(); + processCreateTaskEvent.setTenantId(tenantId); + processCreateTaskEvent.setFlowCode(flowCode); + processCreateTaskEvent.setNodeCode(nodeCode); + processCreateTaskEvent.setTaskId(taskId); + processCreateTaskEvent.setBusinessId(businessId); + 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 b18785484..272f9de92 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 { Task task = listenerVariable.getTask(); if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) { // 判断流程状态(发布审批中事件) - flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId); + flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId); } } 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 2c431737b..537361c3e 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 @@ -9,9 +9,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessCreateTaskEvent; import org.dromara.common.core.domain.event.ProcessDeleteEvent; import org.dromara.common.core.domain.event.ProcessEvent; -import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.MapstructUtils; @@ -123,7 +123,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { } /** - * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) + * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) * 正常使用只需#processEvent.flowCode=='leave1' * 示例为了方便则使用startsWith匹配了全部示例key * @@ -151,19 +151,19 @@ public class TestLeaveServiceImpl implements ITestLeaveService { } /** - * 执行办理任务监听 - * 示例:也可通过 @EventListener(condition = "#processTaskEvent.flowCode=='leave1'")进行判断 + * 执行任务创建监听 + * 示例:也可通过 @EventListener(condition = "#processCreateTaskEvent.flowCode=='leave1'")进行判断 * 在方法中判断流程节点key - * if ("xxx".equals(processTaskEvent.getNodeCode())) { + * if ("xxx".equals(processCreateTaskEvent.getNodeCode())) { * //执行业务逻辑 * } * - * @param processTaskEvent 参数 + * @param processCreateTaskEvent 参数 */ - @EventListener(condition = "#processTaskEvent.flowCode.startsWith('leave')") - public void processTaskHandler(ProcessTaskEvent processTaskEvent) { - log.info("当前任务执行了{}", processTaskEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessId())); + @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); } From 381be5a1a1a6fe4c3d28f4bad323aaef307c9e48 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, 19 Feb 2025 13:27:46 +0800 Subject: [PATCH 008/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20oracle=20?= =?UTF-8?q?=E8=A1=A8=E5=88=AB=E5=90=8D=E4=B8=8D=E8=83=BD=E5=86=99as?= =?UTF-8?q?=E5=85=B3=E9=94=AE=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/workflow/FlwTaskMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 73e4ec789..f539030b4 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 @@ -31,7 +31,7 @@ d.version, uu.processed_by, uu.type - from flow_task as t + from flow_task t left join flow_user uu on uu.associated = t.id left join flow_definition d on t.definition_id = d.id left join flow_instance i on t.instance_id = i.id From d80f6ab69561201bd93e9aa67949f38b77c6f312 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: Thu, 20 Feb 2025 17:46:04 +0800 Subject: [PATCH 009/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20oracle=20?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E7=A7=9F=E6=88=B7=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/impl/SysTenantServiceImpl.java | 15 +++++++++++++++ .../service/impl/FlwDefinitionServiceImpl.java | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index f31bd3027..b2f4872be 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -179,10 +179,20 @@ public class SysTenantServiceImpl implements ISysTenantService { for (SysDictType dictType : dictTypeList) { dictType.setDictId(null); dictType.setTenantId(tenantId); + dictType.setCreateDept(null); + dictType.setCreateBy(null); + dictType.setCreateTime(null); + dictType.setUpdateBy(null); + dictType.setUpdateTime(null); } for (SysDictData dictData : dictDataList) { dictData.setDictCode(null); dictData.setTenantId(tenantId); + dictData.setCreateDept(null); + dictData.setCreateBy(null); + dictData.setCreateTime(null); + dictData.setUpdateBy(null); + dictData.setUpdateTime(null); } dictTypeMapper.insertBatch(dictTypeList); dictDataMapper.insertBatch(dictDataList); @@ -192,6 +202,11 @@ public class SysTenantServiceImpl implements ISysTenantService { for (SysConfig config : sysConfigList) { config.setConfigId(null); config.setTenantId(tenantId); + config.setCreateDept(null); + config.setCreateBy(null); + config.setCreateTime(null); + config.setUpdateBy(null); + config.setUpdateTime(null); } configMapper.insertBatch(sysConfigList); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 591339b3e..b4ebcdf08 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -219,6 +219,11 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { .eq(FlowCategory::getTenantId, DEFAULT_TENANT_ID).eq(FlowCategory::getCategoryId, FlowConstant.FLOW_CATEGORY_ID)); flowCategory.setCategoryId(null); flowCategory.setTenantId(tenantId); + flowCategory.setCreateDept(null); + flowCategory.setCreateBy(null); + flowCategory.setCreateTime(null); + flowCategory.setUpdateBy(null); + flowCategory.setUpdateTime(null); flwCategoryMapper.insert(flowCategory); List defIds = StreamUtils.toList(flowDefinitions, FlowDefinition::getId); List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().in(FlowNode::getDefinitionId, defIds)); From e8700ac44ba40961e55fda81a180db569f450ca6 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: Fri, 21 Feb 2025 09:37:24 +0800 Subject: [PATCH 010/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E5=93=8D=E5=BA=94=E5=A4=B4=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/encrypt/filter/EncryptResponseBodyWrapper.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java index c0af232ee..7bbca49d0 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java @@ -76,10 +76,7 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey); // 设置响应头 - servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag); servletResponse.setHeader(headerFlag, encryptPassword); - servletResponse.setHeader("Access-Control-Allow-Origin", "*"); - servletResponse.setHeader("Access-Control-Allow-Methods", "*"); servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString()); // 获取原始内容 From bdb86e2b3add8f23807fabe66138637d4785932d 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: Fri, 21 Feb 2025 10:10:09 +0800 Subject: [PATCH 011/155] update springboot 3.4.2 => 3.4.3 update springdoc 2.8.4 => 2.8.5 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2856eefc2..cc86e9b83 100644 --- a/pom.xml +++ b/pom.xml @@ -14,12 +14,12 @@ 5.3.0 - 3.4.2 + 3.4.3 UTF-8 UTF-8 17 3.5.16 - 2.8.4 + 2.8.5 0.15.0 4.0.3 2.3 From a217c495d1ea6abc4c3594f53a988f004429ce58 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: Fri, 21 Feb 2025 15:40:31 +0800 Subject: [PATCH 012/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E8=A1=A8=E4=BC=81=E4=B8=9A=E5=90=8D=E4=B8=8E=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E8=A1=A8=E9=95=BF=E5=BA=A6=E4=BF=9D=E6=8C=81=E4=B8=80?= =?UTF-8?q?=E8=87=B4=20=E9=98=B2=E6=AD=A2=E9=95=BF=E5=BA=A6=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_vue_5.X.sql | 2 +- script/sql/postgres/postgres_ry_vue_5.X.sql | 2 +- script/sql/ry_vue_5.X.sql | 2 +- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 94024c999..8390bceef 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -75,7 +75,7 @@ create table sys_tenant ( tenant_id varchar2(20) not null, contact_user_name varchar2(20) default '', contact_phone varchar2(20) default '', - company_name varchar2(50) default '', + company_name varchar2(30) default '', license_number varchar2(30) default '', address varchar2(200) default '', intro varchar2(200) default '', diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index d18cfebd4..463896625 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -75,7 +75,7 @@ create table if not exists sys_tenant tenant_id varchar(20) not null, contact_user_name varchar(20) default null::varchar, contact_phone varchar(20) default null::varchar, - company_name varchar(50) default null::varchar, + company_name varchar(30) default null::varchar, license_number varchar(30) default null::varchar, address varchar(200) default null::varchar, intro varchar(200) default null::varchar, diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 48e5f35b5..95cb04cea 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -45,7 +45,7 @@ create table sys_tenant tenant_id varchar(20) not null comment '租户编号', contact_user_name varchar(20) comment '联系人', contact_phone varchar(20) comment '联系电话', - company_name varchar(50) comment '企业名称', + company_name varchar(30) comment '企业名称', license_number varchar(30) comment '统一社会信用代码', address varchar(200) comment '地址', intro varchar(200) comment '企业简介', diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index 9f8481a22..6fdba1e0d 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -222,7 +222,7 @@ CREATE TABLE sys_tenant tenant_id nvarchar(20) NOT NULL, contact_user_name nvarchar(20) NULL, contact_phone nvarchar(20) NULL, - company_name nvarchar(50) NULL, + company_name nvarchar(30) NULL, license_number nvarchar(30) NULL, address nvarchar(200) NULL, intro nvarchar(200) NULL, From bb475a6088fa83d9e62efdd1b40f44fe697f30f4 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: Fri, 21 Feb 2025 20:31:58 +0800 Subject: [PATCH 013/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E9=85=8D=E7=BD=AE=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/IndexController.java | 12 ++---- .../src/main/resources/application-dev.yml | 4 +- .../src/main/resources/application-prod.yml | 4 +- .../src/main/resources/application.yml | 37 +++++++------------ .../java/org/dromara/test/DemoUnitTest.java | 10 ++--- .../common/core/config/RuoYiConfig.java | 33 ----------------- ...ot.autoconfigure.AutoConfiguration.imports | 1 - 7 files changed, 27 insertions(+), 74 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java index c444f28c9..cdcfed62a 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/IndexController.java @@ -1,9 +1,9 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; -import org.dromara.common.core.config.RuoYiConfig; -import org.dromara.common.core.utils.StringUtils; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,16 +17,12 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { - /** - * 系统基础配置 - */ - private final RuoYiConfig ruoyiConfig; - /** * 访问首页,提示语 */ @GetMapping("/") public String index() { - return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); + return StringUtils.format("欢迎使用{}后台管理框架,请通过前端地址访问。", SpringUtils.getApplicationName()); } + } diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 5465921cb..d2c45eae1 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -120,8 +120,8 @@ redisson: nettyThreads: 8 # 单节点配置 singleServerConfig: - # 客户端名称 - clientName: ${ruoyi.name} + # 客户端名称 不能用中文 + clientName: RuoYi-Vue-Plus # 最小空闲连接数 connectionMinimumIdleSize: 8 # 连接池大小 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 80c1f969c..1c7eae428 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -123,8 +123,8 @@ redisson: nettyThreads: 32 # 单节点配置 singleServerConfig: - # 客户端名称 - clientName: ${ruoyi.name} + # 客户端名称 不能用中文 + clientName: RuoYi-Vue-Plus # 最小空闲连接数 connectionMinimumIdleSize: 32 # 连接池大小 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index dbe16888d..2a134a977 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -1,24 +1,3 @@ -# 项目相关配置 -ruoyi: - # 名称 - name: RuoYi-Vue-Plus - # 版本 - version: ${revision} - # 版权年份 - copyrightYear: 2024 - -captcha: - enable: true - # 页面 <参数设置> 可开启关闭 验证码校验 - # 验证码类型 math 数组计算 char 字符验证 - type: MATH - # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 - category: CIRCLE - # 数字验证码位数 - numberLength: 1 - # 字符验证码长度 - charLength: 4 - # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 @@ -41,6 +20,18 @@ server: # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 worker: 256 +captcha: + enable: true + # 页面 <参数设置> 可开启关闭 验证码校验 + # 验证码类型 math 数组计算 char 字符验证 + type: MATH + # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 + category: CIRCLE + # 数字验证码位数 + numberLength: 1 + # 字符验证码长度 + charLength: 4 + # 日志配置 logging: level: @@ -61,7 +52,7 @@ user: # Spring配置 spring: application: - name: ${ruoyi.name} + name: RuoYi-Vue-Plus threads: # 开启虚拟线程 仅jdk21可用 virtual: @@ -191,7 +182,7 @@ springdoc: # persistAuthorization: true info: # 标题 - title: '标题:${ruoyi.name}多租户管理系统_接口文档' + title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档' # 描述 description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...' # 版本 diff --git a/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java b/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java index 5b3dfdc91..2d11a10f0 100644 --- a/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java +++ b/ruoyi-admin/src/test/java/org/dromara/test/DemoUnitTest.java @@ -1,6 +1,6 @@ package org.dromara.test; -import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.web.config.properties.CaptchaProperties; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -17,19 +17,19 @@ import java.util.concurrent.TimeUnit; public class DemoUnitTest { @Autowired - private RuoYiConfig ruoYiConfig; + private CaptchaProperties captchaProperties; @DisplayName("测试 @SpringBootTest @Test @DisplayName 注解") @Test public void testTest() { - System.out.println(ruoYiConfig); + System.out.println(captchaProperties); } @Disabled @DisplayName("测试 @Disabled 注解") @Test public void testDisabled() { - System.out.println(ruoYiConfig); + System.out.println(captchaProperties); } @Timeout(value = 2L, unit = TimeUnit.SECONDS) @@ -37,7 +37,7 @@ public class DemoUnitTest { @Test public void testTimeout() throws InterruptedException { Thread.sleep(3000); - System.out.println(ruoYiConfig); + System.out.println(captchaProperties); } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java deleted file mode 100644 index cc0d2dfce..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/RuoYiConfig.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.dromara.common.core.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * 读取项目相关配置 - * - * @author Lion Li - */ - -@Data -@Component -@ConfigurationProperties(prefix = "ruoyi") -public class RuoYiConfig { - - /** - * 项目名称 - */ - private String name; - - /** - * 版本 - */ - private String version; - - /** - * 版权年份 - */ - private String copyrightYear; - -} diff --git a/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 3395e73bd..43c7fcfe0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,6 +1,5 @@ org.dromara.common.core.config.ApplicationConfig org.dromara.common.core.config.AsyncConfig -org.dromara.common.core.config.RuoYiConfig org.dromara.common.core.config.ThreadPoolConfig org.dromara.common.core.config.ValidatorConfig org.dromara.common.core.utils.SpringUtils From 7b679e60e07490eb87e41f3e8a7a14c472111950 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 25 Feb 2025 17:55:54 +0800 Subject: [PATCH 014/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E4=BA=BA=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/impl/SysTaskAssigneeServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java index 23dd0520c..2fbf2408b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -53,6 +53,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); QueryWrapper 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()), @@ -75,6 +76,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); LambdaQueryWrapper wrapper = Wrappers.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()), @@ -106,6 +108,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); LambdaQueryWrapper wrapper = Wrappers.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()), @@ -143,6 +146,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); QueryWrapper 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, From b537899e62f35de3a35fec86f878ac477a4e40b6 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 25 Feb 2025 22:18:58 +0800 Subject: [PATCH 015/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0warm-flow?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=B01.6.7-M1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../src/main/resources/application.yml | 8 ++ .../common/core/domain/dto/DeptDTO.java | 1 - .../common/core/domain/dto/DictDataDTO.java | 41 ++++++ .../common/core/domain/dto/DictTypeDTO.java | 41 ++++++ .../common/core/service/DictService.java | 20 +++ .../service/impl/SysDictTypeServiceImpl.java | 35 ++++- .../service/impl/FlwNodeExtServiceImpl.java | 125 ++++++++++++++++++ script/sql/ry_workflow.sql | 4 +- script/sql/update/update_5.3.0-5.3.1.sql | 6 + 10 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java create mode 100644 script/sql/update/update_5.3.0-5.3.1.sql diff --git a/pom.xml b/pom.xml index cc86e9b83..3d8a5c7e3 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20250101 - 1.6.6 + 1.6.7-M1 3.2.2 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 2a134a977..86deca2b2 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -272,3 +272,11 @@ warm-flow: ui: true # 默认Authorization,如果有多个token,用逗号分隔 token-name: ${sa-token.token-name},clientid + # 流程状态对应的三元色 + chart-status-color: + ## 未办理 + - 157,255,0 + ## 待办理 + - 0,0,0 + ## 已办理 + - 255,200,0 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java index 65c012faf..7b748b0b5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DeptDTO.java @@ -11,7 +11,6 @@ import java.io.Serializable; * * @author AprilWind */ - @Data @NoArgsConstructor public class DeptDTO implements Serializable { diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java new file mode 100644 index 000000000..dff1a75dd --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictDataDTO.java @@ -0,0 +1,41 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 字典数据DTO + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class DictDataDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java new file mode 100644 index 000000000..43ab142c2 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/DictTypeDTO.java @@ -0,0 +1,41 @@ +package org.dromara.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 字典类型DTO + * + * @author AprilWind + */ +@Data +@NoArgsConstructor +public class DictTypeDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + private Long dictId; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 备注 + */ + private String remark; + +} 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 b78a7f257..7c5097764 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 @@ -1,5 +1,9 @@ package org.dromara.common.core.service; +import org.dromara.common.core.domain.dto.DictDataDTO; +import org.dromara.common.core.domain.dto.DictTypeDTO; + +import java.util.List; import java.util.Map; /** @@ -64,4 +68,20 @@ public interface DictService { */ Map getAllDictByDictType(String dictType); + /** + * 根据字典类型查询详细信息 + * + * @param dictType 字典类型 + * @return 字典类型详细信息 + */ + DictTypeDTO getDictTypeDto(String dictType); + + /** + * 根据字典类型查询字典数据列表 + * + * @param dictType 字典类型 + * @return 字典数据列表 + */ + List getDictDataDto(String dictType); + } 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 1be0b7f40..acf2816e8 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 @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -8,6 +9,8 @@ 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.domain.dto.DictDataDTO; +import org.dromara.common.core.domain.dto.DictTypeDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.MapstructUtils; @@ -249,10 +252,40 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService } } + /** + * 获取字典下所有的字典值与标签 + * + * @param dictType 字典类型 + * @return dictValue为key,dictLabel为值组成的Map + */ @Override public Map getAllDictByDictType(String dictType) { - List list = selectDictDataByType(dictType); + List list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); } + /** + * 根据字典类型查询详细信息 + * + * @param dictType 字典类型 + * @return 字典类型详细信息 + */ + @Override + public DictTypeDTO getDictTypeDto(String dictType) { + SysDictTypeVo vo = SpringUtils.getAopProxy(this).selectDictTypeByType(dictType); + return BeanUtil.toBean(vo, DictTypeDTO.class); + } + + /** + * 根据字典类型查询字典数据列表 + * + * @param dictType 字典类型 + * @return 字典数据列表 + */ + @Override + public List getDictDataDto(String dictType) { + List list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + return BeanUtil.copyToList(list, DictDataDTO.class); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java new file mode 100644 index 000000000..fe25268fc --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -0,0 +1,125 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +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; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 流程设计器-节点扩展属性 + * + * @author AprilWind + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwNodeExtServiceImpl implements NodeExtService { + + /** + * 权限页 + */ + private static final String BUTTON_PERMISSION_TAB = "wf_button_tab"; + + /** + * 权限页页签名称 + */ + private static final String LIMITS_OF_AUTHORITY = "权限"; + + /** + * 字典类型逗号分隔 + */ + private static final String DICT_TYPES = "wf_button_permission"; + + /** + * 基础设置 + */ + private static final int TYPE_BASE_SETTING = 1; + + /** + * 新页签 + */ + private static final int TYPE_NEW_TAB = 2; + private final DictService dictService; + + /** + * 获取节点扩展属性 + * + * @return 结果 + */ + @Override + public List getNodeExt() { + List nodeExtList = new ArrayList<>(); + // 构建按钮权限页面 + nodeExtList.add(buildNodeExt(BUTTON_PERMISSION_TAB, TYPE_NEW_TAB, DICT_TYPES)); + return nodeExtList; + } + + /** + * 构建一个 NodeExt 对象 + * + * @param code 编码,此json中唯一 + * @param type 节点类型,1:基础设置,2:新页签 + * @return 返回构建好的 NodeExt 对象 + */ + private NodeExt buildNodeExt(String code, int type, String dictTypes) { + NodeExt nodeExt = new NodeExt(); + // 从系统参数配置里面获取信息构建新页面或者基础设置 + // 编码,此json中唯一 + nodeExt.setCode(code); + // 1:基础设置 2:新页签 + nodeExt.setType(type); + // 名称,如果type为新页签时,作为页签名称 + nodeExt.setName(LIMITS_OF_AUTHORITY); + nodeExt.setChilds(StringUtils.splitList(dictTypes) + .stream().map(this::buildChildNode).toList() + ); + return nodeExt; + } + + /** + * 构建一个 ChildNode 对象 + * + * @param dictType 字典类型 + * @return 返回构建好的 ChildNode 对象 + */ + private NodeExt.ChildNode buildChildNode(String dictType) { + NodeExt.ChildNode childNode = new NodeExt.ChildNode(); + if (StringUtils.isBlank(dictType)) { + return childNode; + } + DictTypeDTO dictTypeDTO = dictService.getDictTypeDto(dictType); + if (ObjectUtil.isNull(dictTypeDTO)) { + return childNode; + } + // 编码,此json中唯一 + childNode.setCode(dictType); + // label名称 + childNode.setLabel(dictTypeDTO.getDictName()); + // 描述 + childNode.setDesc(dictTypeDTO.getRemark()); + // 1:输入框 2:输入框 3:下拉框 4:选择框 + childNode.setType(4); + // 是否必填 + childNode.setMust(false); + // 是否多选 + childNode.setMultiple(true); + // 字典,下拉框和复选框时用到 + childNode.setDict(dictService.getDictDataDto(dictType) + .stream().map(x -> + new NodeExt.DictItem(x.getDictLabel(), x.getDictValue(), Convert.toBool(x.getIsDefault(), false)) + ).toList()); + return childNode; + } + +} diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 9455636a0..652f4c084 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -24,7 +24,7 @@ CREATE TABLE `flow_definition` CREATE TABLE `flow_node` ( - `id` bigint unsigned NOT NULL COMMENT '主键id', + `id` bigint NOT NULL COMMENT '主键id', `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', `definition_id` bigint NOT NULL COMMENT '流程定义id', `node_code` varchar(100) NOT NULL COMMENT '流程节点编码', @@ -32,7 +32,6 @@ CREATE TABLE `flow_node` `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用逗号隔开)', `node_ratio` decimal(6, 3) DEFAULT NULL COMMENT '流程签署比例值', `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', - `skip_any_node` varchar(100) DEFAULT 'N' COMMENT '是否可以退回任意节点(Y是 N否)即将删除', `any_node_skip` varchar(100) DEFAULT NULL COMMENT '任意结点跳转', `listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型', `listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径', @@ -43,6 +42,7 @@ CREATE TABLE `flow_node` `version` varchar(20) NOT NULL COMMENT '版本', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `ext` text COMMENT '扩展属性', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', PRIMARY KEY (`id`) USING BTREE diff --git a/script/sql/update/update_5.3.0-5.3.1.sql b/script/sql/update/update_5.3.0-5.3.1.sql new file mode 100644 index 000000000..8c313b25b --- /dev/null +++ b/script/sql/update/update_5.3.0-5.3.1.sql @@ -0,0 +1,6 @@ +ALTER TABLE `flow_node` DROP COLUMN `skip_any_node`; +ALTER TABLE `flow_node` + ADD COLUMN `ext` text NULL COMMENT '扩展属性' AFTER `update_time`; + +INSERT INTO sys_dict_type VALUES (16, '000000', '按钮权限', 'wf_button_permission', 103, 1, sysdate(), NULL, NULL, '按钮权限列表'); +INSERT INTO sys_dict_data VALUES (60, '000000', 1, '是否弹窗选人', '1', 'wf_button_permission', '', 'default', 'N', 103, 1, sysdate(), NULL, NULL,'是否弹窗选人'); From 0673cf88491ce394810e2176b035a1b62a7270cf Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 25 Feb 2025 22:56:27 +0800 Subject: [PATCH 016/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=AE=BE=E8=AE=A1=E5=99=A8-=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E5=B1=9E=E6=80=A7=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwNodeExtServiceImpl.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index fe25268fc..f7e58ed70 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -13,7 +13,9 @@ import org.dromara.workflow.common.ConditionalOnEnable; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 流程设计器-节点扩展属性 @@ -27,14 +29,14 @@ import java.util.List; public class FlwNodeExtServiceImpl implements NodeExtService { /** - * 权限页 + * 权限页code */ - private static final String BUTTON_PERMISSION_TAB = "wf_button_tab"; + private static final String PERMISSION_TAB = "wf_button_tab"; /** - * 权限页页签名称 + * 权限页名称 */ - private static final String LIMITS_OF_AUTHORITY = "权限"; + private static final String PERMISSION_TAB_NAME = "权限"; /** * 字典类型逗号分隔 @@ -50,6 +52,16 @@ public class FlwNodeExtServiceImpl implements NodeExtService { * 新页签 */ private static final int TYPE_NEW_TAB = 2; + + /** + * 存储不同 dictType 对应的配置信息 + */ + private static final Map> CHILD_NODE_MAP = new HashMap<>(); + + static { + CHILD_NODE_MAP.put("wf_button_permission", Map.of("type", 4, "must", false, "multiple", true)); + } + private final DictService dictService; /** @@ -61,26 +73,24 @@ public class FlwNodeExtServiceImpl implements NodeExtService { public List getNodeExt() { List nodeExtList = new ArrayList<>(); // 构建按钮权限页面 - nodeExtList.add(buildNodeExt(BUTTON_PERMISSION_TAB, TYPE_NEW_TAB, DICT_TYPES)); + nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB, DICT_TYPES)); return nodeExtList; } /** * 构建一个 NodeExt 对象 * - * @param code 编码,此json中唯一 - * @param type 节点类型,1:基础设置,2:新页签 + * @param code 编码,此json中唯一 + * @param name 名称,如果type为新页签时,作为页签名称 + * @param type 节点类型,1:基础设置,2:新页签 + * @param dictTypes 字典类型逗号分隔 * @return 返回构建好的 NodeExt 对象 */ - private NodeExt buildNodeExt(String code, int type, String dictTypes) { + private NodeExt buildNodeExt(String code, String name, int type, String dictTypes) { NodeExt nodeExt = new NodeExt(); - // 从系统参数配置里面获取信息构建新页面或者基础设置 - // 编码,此json中唯一 nodeExt.setCode(code); - // 1:基础设置 2:新页签 nodeExt.setType(type); - // 名称,如果type为新页签时,作为页签名称 - nodeExt.setName(LIMITS_OF_AUTHORITY); + nodeExt.setName(name); nodeExt.setChilds(StringUtils.splitList(dictTypes) .stream().map(this::buildChildNode).toList() ); @@ -108,12 +118,13 @@ public class FlwNodeExtServiceImpl implements NodeExtService { childNode.setLabel(dictTypeDTO.getDictName()); // 描述 childNode.setDesc(dictTypeDTO.getRemark()); + Map map = CHILD_NODE_MAP.get(dictType); // 1:输入框 2:输入框 3:下拉框 4:选择框 - childNode.setType(4); + childNode.setType(Convert.toInt(map.get("type"), 1)); // 是否必填 - childNode.setMust(false); + childNode.setMust(Convert.toBool(map.get("must"), false)); // 是否多选 - childNode.setMultiple(true); + childNode.setMultiple(Convert.toBool(map.get("multiple"), true)); // 字典,下拉框和复选框时用到 childNode.setDict(dictService.getDictDataDto(dictType) .stream().map(x -> From 319a89e3205f7a49a810c3ac8efb021884cf55ab 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: Tue, 25 Feb 2025 23:39:02 +0800 Subject: [PATCH 017/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20oracle=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=AD=97=E5=85=B8=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/service/impl/SysTenantServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index b2f4872be..a73415c64 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -448,6 +448,9 @@ public class SysTenantServiceImpl implements ISysTenantService { data.setTenantId(tenantId); data.setCreateTime(null); data.setUpdateTime(null); + data.setCreateDept(null); + data.setCreateBy(null); + data.setUpdateBy(null); set.add(tenantId); saveDataList.add(data); } @@ -469,6 +472,9 @@ public class SysTenantServiceImpl implements ISysTenantService { data.setTenantId(tenantId); data.setCreateTime(null); data.setUpdateTime(null); + data.setCreateDept(null); + data.setCreateBy(null); + data.setUpdateBy(null); set.add(tenantId); saveDataList.add(data); } From 71180584dab104c40351f87ef4cf8070d4201535 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 26 Feb 2025 09:54:20 +0800 Subject: [PATCH 018/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E5=AD=97=E5=85=B8=E7=B1=BB=E5=9E=8B=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=A2=9E=E5=8A=A0=E4=B8=80=E7=BA=A7=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/core/constant/CacheNames.java | 5 +++++ .../dromara/system/service/impl/SysDictTypeServiceImpl.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index bf8efc550..519034cf2 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -30,6 +30,11 @@ public interface CacheNames { */ String SYS_DICT = "sys_dict"; + /** + * 数据字典类型 + */ + String SYS_DICT_TYPE = "sys_dict_type"; + /** * 租户 */ 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 acf2816e8..9d80d50e4 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 @@ -124,6 +124,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService * @param dictType 字典类型 * @return 字典类型 */ + @Cacheable(cacheNames = CacheNames.SYS_DICT_TYPE, key = "#dictType") @Override public SysDictTypeVo selectDictTypeByType(String dictType) { return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); @@ -143,6 +144,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); } CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); + CacheUtils.evict(CacheNames.SYS_DICT_TYPE, dictType.getDictType()); } baseMapper.deleteByIds(Arrays.asList(dictIds)); } @@ -153,6 +155,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public void resetDictCache() { CacheUtils.clear(CacheNames.SYS_DICT); + CacheUtils.clear(CacheNames.SYS_DICT_TYPE); } /** @@ -191,6 +194,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService int row = baseMapper.updateById(dict); if (row > 0) { CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); + CacheUtils.evict(CacheNames.SYS_DICT_TYPE, oldDict.getDictType()); return dictDataMapper.selectDictDataByType(dict.getDictType()); } throw new ServiceException("操作失败"); From 8763bfa3d32b91ca24d9c572ad5a9a5ee46bd6a2 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 27 Feb 2025 17:31:08 +0800 Subject: [PATCH 019/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 86deca2b2..76ed0d695 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -219,7 +219,6 @@ xss: # 排除链接(多个用逗号分隔) excludeUrls: - /system/notice - - /warm-flow/save-xml # 全局线程池相关配置 # 如使用JDK21请直接使用虚拟线程 不要开启此配置 From c0e0b41d13a4d2cc95c697ac3dfc90447f74ac38 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 28 Feb 2025 12:05:35 +0800 Subject: [PATCH 020/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0warm-flow?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=B01.6.7-M2,=E6=9D=83=E9=99=90=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=94=B9=E4=B8=BA=E6=9E=9A=E4=B8=BE=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/enums/ButtonPermissionEnum.java | 30 +++++ .../workflow/common/enums/NodeExtEnum.java | 26 +++++ .../service/impl/FlwNodeExtServiceImpl.java | 110 +++++++++++++----- 4 files changed, 139 insertions(+), 29 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java diff --git a/pom.xml b/pom.xml index 3d8a5c7e3..8bde7d395 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20250101 - 1.6.7-M1 + 1.6.7-M2 3.2.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java new file mode 100644 index 000000000..6bc818c4c --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java @@ -0,0 +1,30 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 按钮权限枚举 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum ButtonPermissionEnum implements NodeExtEnum { + + /** + * 是否弹窗选人 + */ + APPROVE("是否弹窗选人", "1", false), + + /** + * 是否能委托 + */ + REJECT("是否能委托", "2", false); + + private final String label; + private final String value; + private final boolean selected; + +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java new file mode 100644 index 000000000..dfa9e9a99 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java @@ -0,0 +1,26 @@ +package org.dromara.workflow.common.enums; + +/** + * 节点扩展属性枚举 + * + * @author AprilWind + */ +public interface NodeExtEnum { + + /** + * 选项label + */ + String getLabel(); + + /** + * 选项值 + */ + String getValue(); + + /** + * 是否默认选中 + */ + boolean isSelected(); + +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index f7e58ed70..0b4d4b790 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -10,12 +10,11 @@ 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; +import org.dromara.workflow.common.enums.ButtonPermissionEnum; +import org.dromara.workflow.common.enums.NodeExtEnum; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 流程设计器-节点扩展属性 @@ -39,9 +38,9 @@ public class FlwNodeExtServiceImpl implements NodeExtService { private static final String PERMISSION_TAB_NAME = "权限"; /** - * 字典类型逗号分隔 + * 枚举类型标识 */ - private static final String DICT_TYPES = "wf_button_permission"; + private static final String ENUM_TYPE_PREFIX = "enum:"; /** * 基础设置 @@ -59,7 +58,8 @@ public class FlwNodeExtServiceImpl implements NodeExtService { private static final Map> CHILD_NODE_MAP = new HashMap<>(); static { - CHILD_NODE_MAP.put("wf_button_permission", Map.of("type", 4, "must", false, "multiple", true)); + CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getName(), + Map.of("label", "权限按钮", "type", 4, "must", false, "multiple", true)); } private final DictService dictService; @@ -73,26 +73,29 @@ public class FlwNodeExtServiceImpl implements NodeExtService { public List getNodeExt() { List nodeExtList = new ArrayList<>(); // 构建按钮权限页面 - nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB, DICT_TYPES)); + nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB, + ENUM_TYPE_PREFIX + ButtonPermissionEnum.class.getName())); return nodeExtList; } /** * 构建一个 NodeExt 对象 * - * @param code 编码,此json中唯一 - * @param name 名称,如果type为新页签时,作为页签名称 - * @param type 节点类型,1:基础设置,2:新页签 - * @param dictTypes 字典类型逗号分隔 + * @param code 编码,此json中唯一 + * @param name 名称,如果type为新页签时,作为页签名称 + * @param type 节点类型,1:基础设置,2:新页签 + * @param sourceTypes 字典/枚举类型来源(逗号分隔) * @return 返回构建好的 NodeExt 对象 */ - private NodeExt buildNodeExt(String code, String name, int type, String dictTypes) { + private NodeExt buildNodeExt(String code, String name, int type, String sourceTypes) { NodeExt nodeExt = new NodeExt(); nodeExt.setCode(code); nodeExt.setType(type); nodeExt.setName(name); - nodeExt.setChilds(StringUtils.splitList(dictTypes) - .stream().map(this::buildChildNode).toList() + nodeExt.setChilds(StringUtils.splitList(sourceTypes) + .stream().map(this::buildChildNode) + .filter(ObjectUtil::isNotNull) + .toList() ); return nodeExt; } @@ -100,31 +103,61 @@ public class FlwNodeExtServiceImpl implements NodeExtService { /** * 构建一个 ChildNode 对象 * + * @param sourceType 字典类型 + * @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); + } + return null; + } + + /** + * 根据字典构建一个 ChildNode 对象 + * * @param dictType 字典类型 * @return 返回构建好的 ChildNode 对象 */ - private NodeExt.ChildNode buildChildNode(String dictType) { - NodeExt.ChildNode childNode = new NodeExt.ChildNode(); - if (StringUtils.isBlank(dictType)) { - return childNode; - } + private NodeExt.ChildNode buildChildNodeFromDict(String dictType) { DictTypeDTO dictTypeDTO = dictService.getDictTypeDto(dictType); if (ObjectUtil.isNull(dictTypeDTO)) { - return childNode; + return null; } + NodeExt.ChildNode childNode = buildChildNodeMap(dictType); // 编码,此json中唯一 childNode.setCode(dictType); // label名称 childNode.setLabel(dictTypeDTO.getDictName()); // 描述 childNode.setDesc(dictTypeDTO.getRemark()); - Map map = CHILD_NODE_MAP.get(dictType); - // 1:输入框 2:输入框 3:下拉框 4:选择框 - childNode.setType(Convert.toInt(map.get("type"), 1)); - // 是否必填 - childNode.setMust(Convert.toBool(map.get("must"), false)); - // 是否多选 - childNode.setMultiple(Convert.toBool(map.get("multiple"), true)); // 字典,下拉框和复选框时用到 childNode.setDict(dictService.getDictDataDto(dictType) .stream().map(x -> @@ -133,4 +166,25 @@ public class FlwNodeExtServiceImpl implements NodeExtService { return childNode; } + /** + * 根据 CHILD_NODE_MAP 中的配置信息,构建一个基本的 ChildNode 对象 + * 该方法用于设置 ChildNode 的常规属性,例如 label、type、是否必填、是否多选等 + * + * @param key CHILD_NODE_MAP 的 key + * @return 返回构建好的 ChildNode 对象 + */ + private NodeExt.ChildNode buildChildNodeMap(String key) { + NodeExt.ChildNode childNode = new NodeExt.ChildNode(); + Map map = CHILD_NODE_MAP.get(key); + // label名称 + childNode.setLabel((String) map.get("label")); + // 1:输入框 2:输入框 3:下拉框 4:选择框 + childNode.setType(Convert.toInt(map.get("type"), 1)); + // 是否必填 + childNode.setMust(Convert.toBool(map.get("must"), false)); + // 是否多选 + childNode.setMultiple(Convert.toBool(map.get("multiple"), true)); + return childNode; + } + } From 2623d0b3438f247b0c3c68bfcd26d387215da9ec Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 28 Feb 2025 14:46:59 +0800 Subject: [PATCH 021/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E9=94=99=E8=AF=AF=EF=BC=8C=E8=A1=A5=E5=85=85=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/common/core/domain/dto/RoleDTO.java | 2 +- .../src/main/java/org/dromara/system/domain/SysRole.java | 2 +- .../src/main/java/org/dromara/system/domain/bo/SysRoleBo.java | 2 +- .../src/main/java/org/dromara/system/domain/vo/SysRoleVo.java | 4 ++-- script/sql/oracle/oracle_ry_vue_5.X.sql | 2 +- script/sql/postgres/postgres_ry_vue_5.X.sql | 2 +- script/sql/ry_vue_5.X.sql | 2 +- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java index aea8e7a9d..d14ffbb0f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/RoleDTO.java @@ -35,7 +35,7 @@ public class RoleDTO implements Serializable { private String roleKey; /** - * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限) */ private String dataScope; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java index a7c0ad5a0..aa1b19a4f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -42,7 +42,7 @@ public class SysRole extends TenantEntity { private Integer roleSort; /** - * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限) */ private String dataScope; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java index 3207bad1e..5e3e60260 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -49,7 +49,7 @@ public class SysRoleBo extends BaseEntity { private Integer roleSort; /** - * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限) */ private String dataScope; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index ffb2c6d5a..1913170ed 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -51,10 +51,10 @@ public class SysRoleVo implements Serializable { private Integer roleSort; /** - * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限) */ @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + @ExcelDictFormat(readConverterExp = "1=全部数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限,6=部门及以下或本人数据权限") private String dataScope; /** diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 8390bceef..a1c1d99e1 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -352,7 +352,7 @@ comment on column sys_role.tenant_id is '租户编号'; comment on column sys_role.role_name is '角色名称'; comment on column sys_role.role_key is '角色权限字符串'; comment on column sys_role.role_sort is '显示顺序'; -comment on column sys_role.data_scope is '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +comment on column sys_role.data_scope is '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限)'; comment on column sys_role.menu_check_strictly is '菜单树选择项是否关联显示'; comment on column sys_role.dept_check_strictly is '部门树选择项是否关联显示'; comment on column sys_role.status is '角色状态(0正常 1停用)'; diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 463896625..22c60650b 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -353,7 +353,7 @@ comment on column sys_role.tenant_id is '租户编号'; comment on column sys_role.role_name is '角色名称'; comment on column sys_role.role_key is '角色权限字符串'; comment on column sys_role.role_sort is '显示顺序'; -comment on column sys_role.data_scope is '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +comment on column sys_role.data_scope is '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限)'; comment on column sys_role.menu_check_strictly is '菜单树选择项是否关联显示'; comment on column sys_role.dept_check_strictly is '部门树选择项是否关联显示'; comment on column sys_role.status is '角色状态(0正常 1停用)'; diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 95cb04cea..f2167fa30 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -208,7 +208,7 @@ create table sys_role ( role_name varchar(30) not null comment '角色名称', role_key varchar(100) not null comment '角色权限字符串', role_sort int(4) not null comment '显示顺序', - data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限)', menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示', status char(1) not null comment '角色状态(0正常 1停用)', diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index 6fdba1e0d..c6d2960d5 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -2318,7 +2318,7 @@ EXEC sys.sp_addextendedproperty 'COLUMN', N'role_sort' GO EXEC sys.sp_addextendedproperty - 'MS_Description', N'数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)' , + 'MS_Description', N'数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限)' , 'SCHEMA', N'dbo', 'TABLE', N'sys_role', 'COLUMN', N'data_scope' From df65670d3de065c046d25d677492a6da1006f772 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 28 Feb 2025 16:06:16 +0800 Subject: [PATCH 022/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=A1=86=E6=9E=B6=E9=85=8D=E7=BD=AE=E7=B1=BB=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E9=A1=BA=E5=BA=8F=EF=BC=8C=E7=A1=AE=E4=BF=9D=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BA=8E=E9=BB=98=E8=AE=A4=E7=9A=84=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/config/ValidatorConfig.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java index 45c5bd13c..ddcd836e4 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ValidatorConfig.java @@ -3,6 +3,7 @@ package org.dromara.common.core.config; import jakarta.validation.Validator; import org.hibernate.validator.HibernateValidator; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; @@ -14,11 +15,11 @@ import java.util.Properties; * * @author Lion Li */ -@AutoConfiguration +@AutoConfiguration(before = ValidationAutoConfiguration.class) public class ValidatorConfig { /** - * 配置校验框架 快速返回模式 + * 配置校验框架 快速失败模式 */ @Bean public Validator validator(MessageSource messageSource) { @@ -28,7 +29,7 @@ public class ValidatorConfig { // 设置使用 HibernateValidator 校验器 factoryBean.setProviderClass(HibernateValidator.class); Properties properties = new Properties(); - // 设置 快速异常返回 + // 设置快速失败模式(fail-fast),即校验过程中一旦遇到失败,立即停止并返回错误 properties.setProperty("hibernate.validator.fail_fast", "true"); factoryBean.setValidationProperties(properties); // 加载配置 From fe27d8920a024cc402d6c57064a04bd96354b0fa Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 1 Mar 2025 23:46:20 +0800 Subject: [PATCH 023/155] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/ButtonPermissionEnum.java | 34 ++++++++++++++++- .../workflow/common/enums/NodeExtEnum.java | 6 +++ .../workflow/domain/vo/ButtonPermission.java | 34 +++++++++++++++++ .../workflow/domain/vo/FlowTaskVo.java | 38 ++++++++++++++++++- .../service/impl/FlwTaskServiceImpl.java | 2 + 5 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java index 6bc818c4c..7a224051d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java @@ -15,12 +15,42 @@ public enum ButtonPermissionEnum implements NodeExtEnum { /** * 是否弹窗选人 */ - APPROVE("是否弹窗选人", "1", false), + POP("是否弹窗选人", "pop", false), /** * 是否能委托 */ - REJECT("是否能委托", "2", false); + TRUST("是否能委托", "trust", false), + + /** + * 是否能转办 + */ + TRANSFER("是否能转办", "transfer", false), + + /** + * 是否能抄送 + */ + COPY("是否能抄送", "copy", false), + + /** + * 是否显示退回 + */ + BACK("是否显示退回", "back", true), + + /** + * 是否能加签 + */ + ADD_SIGN("是否能加签", "addSign", false), + + /** + * 是否能减签 + */ + SUB_SIGN("是否能减签", "subSign", false), + + /** + * 是否能终止 + */ + TERMINATION("是否能终止", "termination", true); private final String label; private final String value; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java index dfa9e9a99..9926a8eb9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java @@ -9,16 +9,22 @@ public interface NodeExtEnum { /** * 选项label + * + * @return 选项label */ String getLabel(); /** * 选项值 + * + * @return 选项值 */ String getValue(); /** * 是否默认选中 + * + * @return 是否默认选中 */ boolean isSelected(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java new file mode 100644 index 000000000..51f320d2d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java @@ -0,0 +1,34 @@ +package org.dromara.workflow.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 按钮权限 + * + * @author may + * @date 2025-02-28 + */ +@Data +public class ButtonPermission implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 枚举路径 + */ + private String code; + + /** + * 按钮编码 + */ + private String value; + + /** + * 是否显示 + */ + private boolean show; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 3fb08d954..2a2a9ee26 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -1,16 +1,20 @@ package org.dromara.workflow.domain.vo; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; import lombok.Data; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.warm.flow.core.entity.User; import org.dromara.workflow.common.constant.FlowConstant; +import org.dromara.workflow.common.enums.ButtonPermissionEnum; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 任务视图 @@ -173,4 +177,34 @@ public class FlowTaskVo implements Serializable { */ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") private String createByName; + + /** + * 按钮权限 + */ + private List buttonList; + + public List getButtonList(String ext) { + List buttonPermissions = Arrays.stream(ButtonPermissionEnum.values()) + .map(value -> { + ButtonPermission buttonPermission = new ButtonPermission(); + buttonPermission.setCode(value.getValue()); + buttonPermission.setShow(false); + return buttonPermission; + }) + .collect(Collectors.toList()); + if (StringUtils.isNotBlank(ext)) { + List buttonCodeList = JSONUtil.toList(JSONUtil.parseArray(ext), ButtonPermission.class); + if (CollUtil.isNotEmpty(buttonCodeList)) { + Optional firstPermission = buttonCodeList.stream().findFirst(); + firstPermission.ifPresent(permission -> { + Set codeSet = Arrays.stream(permission.getValue().split(",")) + .map(String::trim) + .filter(code -> !code.isEmpty()) + .collect(Collectors.toSet()); + buttonPermissions.forEach(bp -> bp.setShow(codeSet.contains(bp.getCode()))); + }); + } + } + return buttonPermissions; + } } 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 21a54d740..c59768f6d 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 @@ -487,9 +487,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowTaskVo.setFlowCode(definition.getFlowCode()); flowTaskVo.setFlowName(definition.getFlowName()); flowTaskVo.setBusinessId(instance.getBusinessId()); + //设置按钮权限 List nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId()); if (CollUtil.isNotEmpty(nodeList)) { Node node = nodeList.get(0); + flowTaskVo.setButtonList(flowTaskVo.getButtonList(node.getExt())); flowTaskVo.setNodeRatio(node.getNodeRatio()); } return flowTaskVo; From 055d1f3bb2281133f81e31c600577f5d02584eff Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 1 Mar 2025 23:55:48 +0800 Subject: [PATCH 024/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=9B=BE=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 76ed0d695..c15d89c02 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -274,8 +274,8 @@ warm-flow: # 流程状态对应的三元色 chart-status-color: ## 未办理 - - 157,255,0 + - 62,62,62 ## 待办理 - - 0,0,0 + - 255,205,23 ## 已办理 - - 255,200,0 + - 157,255,0 From c4ef05395850402503e65137f99cd12c289148bd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sun, 2 Mar 2025 00:09:18 +0800 Subject: [PATCH 025/155] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/IFlwTaskService.java | 10 ++++++++ .../service/impl/FlwTaskServiceImpl.java | 24 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 11034e753..4d98906e7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -6,6 +6,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -188,4 +189,13 @@ public interface IFlwTaskService { * @return 结果 */ List currentTaskAllUser(Long taskId); + + /** + * 按照节点编码查询节点 + * + * @param nodeCode 节点编码 + * @param definitionId 流程定义id + * @return 节点 + */ + FlowNode getByNodeCode(String nodeCode, Long definitionId); } 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 c59768f6d..d87135d15 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 @@ -33,6 +33,7 @@ import org.dromara.warm.flow.core.service.*; import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; +import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskAssigneeType; @@ -79,6 +80,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final UserService userService; private final FlwTaskMapper flwTaskMapper; private final FlwCategoryMapper flwCategoryMapper; + private final FlowNodeMapper flowNodeMapper; /** * 启动任务 @@ -488,11 +490,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowTaskVo.setFlowName(definition.getFlowName()); flowTaskVo.setBusinessId(instance.getBusinessId()); //设置按钮权限 - List nodeList = nodeService.getByNodeCodes(Collections.singletonList(flowTaskVo.getNodeCode()), instance.getDefinitionId()); - if (CollUtil.isNotEmpty(nodeList)) { - Node node = nodeList.get(0); - flowTaskVo.setButtonList(flowTaskVo.getButtonList(node.getExt())); - flowTaskVo.setNodeRatio(node.getNodeRatio()); + FlowNode flowNode = getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId()); + if (ObjectUtil.isNotNull(flowNode)) { + flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt())); + flowTaskVo.setNodeRatio(flowNode.getNodeRatio()); } return flowTaskVo; } @@ -686,4 +687,17 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } return userService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); } + + /** + * 按照节点编码查询节点 + * + * @param nodeCode 节点编码 + * @param definitionId 流程定义id + */ + @Override + public FlowNode getByNodeCode(String nodeCode, Long definitionId) { + return flowNodeMapper.selectOne(new LambdaQueryWrapper() + .eq(FlowNode::getNodeCode, nodeCode) + .eq(FlowNode::getDefinitionId, definitionId)); + } } From 723a0b6d9c584d0f1d6b749a8ef24b1486b7a417 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, 3 Mar 2025 13:49:58 +0800 Subject: [PATCH 026/155] =?UTF-8?q?update=20mybatis-plus=203.5.10=20=3D>?= =?UTF-8?q?=203.5.10.1=20=E4=BF=AE=E5=A4=8D=E4=B8=AAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8bde7d395..f420f3cd4 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 4.0.3 2.3 1.40.0 - 3.5.10 + 3.5.10.1 3.9.1 5.8.35 3.4.2 From 21c12a791aa6e7ede7a2c81bc9ffb499eb277abb Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Mon, 3 Mar 2025 21:02:03 +0800 Subject: [PATCH 027/155] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=8A=82=E7=82=B9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 11 ++++ .../workflow/domain/bo/FlowNextNodeBo.java | 38 +++++++++++++ .../workflow/domain/vo/FlowTaskVo.java | 5 ++ .../workflow/service/IFlwTaskService.java | 8 +++ .../service/impl/FlwTaskServiceImpl.java | 53 ++++++++++++++++--- 5 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 463916b10..5534b6732 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -12,6 +12,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -127,6 +128,16 @@ public class FlwTaskController extends BaseController { return R.ok(flwTaskService.selectById(taskId)); } + /** + * 获取下一节点信息 + * + * @param bo 参数 + */ + @PostMapping("/getNextNodeList") + public R> getNextNodeList(@RequestBody FlowNextNodeBo bo) { + return R.ok(flwTaskService.getNextNodeList(bo)); + } + /** * 终止任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java new file mode 100644 index 000000000..385eb892b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java @@ -0,0 +1,38 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 下一节点信息 + * + * @author may + */ +@Data +public class FlowNextNodeBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * 任务id + */ + private String taskId; + + /** + * 流程变量 + */ + private Map variables; + + public Map getVariables() { + if (variables == null) { + return new HashMap<>(16); + } + variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); + return variables; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 2a2a9ee26..785e866c8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -178,6 +178,11 @@ public class FlowTaskVo implements Serializable { @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") private String createByName; + /** + * 是否为申请人节点 + */ + private boolean applyNode; + /** * 按钮权限 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 4d98906e7..fcb078295 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -133,6 +133,14 @@ public interface IFlwTaskService { */ FlowTaskVo selectById(Long taskId); + /** + * 获取下一节点信息 + * + * @param bo 参数 + * @return 结果 + */ + List getNextNodeList(FlowNextNodeBo bo); + /** * 按照任务id查询任务 * 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 d87135d15..21e6d1946 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 @@ -30,6 +30,8 @@ import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.*; +import org.dromara.warm.flow.core.utils.ExpressionUtil; +import org.dromara.warm.flow.core.utils.MapUtil; import org.dromara.warm.flow.orm.entity.*; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; @@ -45,6 +47,7 @@ import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwTaskMapper; +import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; @@ -81,6 +84,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final FlwTaskMapper flwTaskMapper; private final FlwCategoryMapper flwCategoryMapper; private final FlowNodeMapper flowNodeMapper; + private final IFlwTaskAssigneeService flwTaskAssigneeService; /** * 启动任务 @@ -491,13 +495,49 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowTaskVo.setBusinessId(instance.getBusinessId()); //设置按钮权限 FlowNode flowNode = getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId()); - if (ObjectUtil.isNotNull(flowNode)) { - flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt())); - flowTaskVo.setNodeRatio(flowNode.getNodeRatio()); + if (ObjectUtil.isNull(flowNode)) { + throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在"); } + flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt())); + flowTaskVo.setNodeRatio(flowNode.getNodeRatio()); + flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(WorkflowUtils.applyNodeCode(task.getDefinitionId()))); return flowTaskVo; } + /** + * 获取下一节点信息 + * + * @param bo 参数 + */ + @Override + public List getNextNodeList(FlowNextNodeBo bo) { + String taskId = bo.getTaskId(); + Map variables = bo.getVariables(); + Task task = taskService.getById(taskId); + Instance instance = insService.getById(task.getInstanceId()); + Definition definition = defService.getById(task.getDefinitionId()); + //获取下一节点列表 + List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), variables); + if (CollUtil.isNotEmpty(nextNodeList)) { + //构建以下节点数据 + List buildTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null)); + //办理人变量替换 + ExpressionUtil.evalVariable(buildTaskList, MapUtil.mergeAll(instance.getVariableMap(), variables)); + for (Node nextNode : nextNodeList) { + buildTaskList.stream().filter(t -> t.getNodeCode().equals(nextNode.getNodeCode())).findFirst().ifPresent(t -> { + nextNode.setPermissionFlag(StringUtils.join(t.getPermissionList(), StringUtils.SEPARATOR)); + }); + } + List flowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class); + for (FlowNode flowNode : flowNodes) { + if (StringUtils.isNotBlank(flowNode.getPermissionFlag())) { + flwTaskAssigneeService.fetchUsersByStorageId(flowNode.getPermissionFlag()); + } + } + } + return BeanUtil.copyToList(nextNodeList, FlowNode.class); + } + /** * 按照任务id查询任务 * @@ -580,10 +620,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } Long taskId = bo.getTaskId(); - FlowTaskVo flowTaskVo = selectById(taskId); + Task task = taskService.getById(taskId); + FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId()); if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) { - if (flowTaskVo.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) { - throw new ServiceException(flowTaskVo.getNodeName() + "不是会签节点!"); + if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) { + throw new ServiceException(task.getNodeName() + "不是会签节点!"); } } // 设置任务状态并执行对应的任务操作 From 0c6faa751ac16a3e1c3dfa7c2648aceeba170385 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: Tue, 4 Mar 2025 09:34:17 +0800 Subject: [PATCH 028/155] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/update/update_5.3.0-5.3.1.sql | 3 --- 1 file changed, 3 deletions(-) diff --git a/script/sql/update/update_5.3.0-5.3.1.sql b/script/sql/update/update_5.3.0-5.3.1.sql index 8c313b25b..7a26f43d1 100644 --- a/script/sql/update/update_5.3.0-5.3.1.sql +++ b/script/sql/update/update_5.3.0-5.3.1.sql @@ -1,6 +1,3 @@ ALTER TABLE `flow_node` DROP COLUMN `skip_any_node`; ALTER TABLE `flow_node` ADD COLUMN `ext` text NULL COMMENT '扩展属性' AFTER `update_time`; - -INSERT INTO sys_dict_type VALUES (16, '000000', '按钮权限', 'wf_button_permission', 103, 1, sysdate(), NULL, NULL, '按钮权限列表'); -INSERT INTO sys_dict_data VALUES (60, '000000', 1, '是否弹窗选人', '1', 'wf_button_permission', '', 'default', 'N', 103, 1, sysdate(), NULL, NULL,'是否弹窗选人'); From 9dcb7c6a12416aa900f93eae1ae0bcd8f3bc004a 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: Tue, 4 Mar 2025 09:44:11 +0800 Subject: [PATCH 029/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A05.3.0-5.3.1=E5=8D=87=E7=BA=A7sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_workflow.sql | 4 ++-- script/sql/postgres/postgres_ry_workflow.sql | 4 ++-- script/sql/sqlserver/sqlserver_ry_workflow.sql | 16 ++++++++-------- script/sql/update/oracle/update_5.3.0-5.3.1.sql | 3 +++ .../sql/update/postgres/update_5.3.0-5.3.1.sql | 3 +++ .../sql/update/sqlserver/update_5.3.0-5.3.1.sql | 9 +++++++++ 6 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 script/sql/update/oracle/update_5.3.0-5.3.1.sql create mode 100644 script/sql/update/postgres/update_5.3.0-5.3.1.sql create mode 100644 script/sql/update/sqlserver/update_5.3.0-5.3.1.sql diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index b515b78ff..baecd91fa 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -47,7 +47,6 @@ create table FLOW_NODE NODE_NAME VARCHAR2(100), NODE_RATIO NUMBER(6, 3), COORDINATE VARCHAR2(100), - SKIP_ANY_NODE VARCHAR2(100) default 'N', ANY_NODE_SKIP VARCHAR2(100), LISTENER_TYPE VARCHAR2(100), LISTENER_PATH VARCHAR2(500), @@ -58,6 +57,7 @@ create table FLOW_NODE VERSION VARCHAR2(20), CREATE_TIME DATE, UPDATE_TIME DATE, + EXT VARCHAR2(500), DEL_FLAG VARCHAR2(1) default '0', TENANT_ID VARCHAR2(40), PERMISSION_FLAG VARCHAR2(200) @@ -73,7 +73,6 @@ comment on column FLOW_NODE.NODE_CODE is '流程节点编码'; comment on column FLOW_NODE.NODE_NAME is '流程节点名称'; comment on column FLOW_NODE.NODE_RATIO is '流程签署比例值'; comment on column FLOW_NODE.COORDINATE is '坐标'; -comment on column FLOW_NODE.SKIP_ANY_NODE is '是否可以退回任意节点(Y是 N否)即将删除'; comment on column FLOW_NODE.ANY_NODE_SKIP is '任意结点跳转'; comment on column FLOW_NODE.LISTENER_TYPE is '监听器类型'; comment on column FLOW_NODE.LISTENER_PATH is '监听器路径'; @@ -84,6 +83,7 @@ comment on column FLOW_NODE.FORM_PATH is '审批表单路径'; comment on column FLOW_NODE.VERSION is '版本'; comment on column FLOW_NODE.CREATE_TIME is '创建时间'; comment on column FLOW_NODE.UPDATE_TIME is '更新时间'; +comment on column FLOW_NODE.EXT is '扩展属性'; comment on column FLOW_NODE.DEL_FLAG is '删除标志'; comment on column FLOW_NODE.TENANT_ID is '租户id'; comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index 80cd414c3..3fbd70f05 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -50,7 +50,6 @@ CREATE TABLE flow_node permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开) node_ratio numeric(6, 3) NULL, -- 流程签署比例值 coordinate varchar(100) NULL, -- 坐标 - skip_any_node varchar(100) NULL DEFAULT 'N':: character varying, -- 是否可以退回任意节点(Y是 N否)即将删除 any_node_skip varchar(100) NULL, -- 任意结点跳转 listener_type varchar(100) NULL, -- 监听器类型 listener_path varchar(400) NULL, -- 监听器路径 @@ -61,6 +60,7 @@ CREATE TABLE flow_node "version" varchar(20) NOT NULL, -- 版本 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 + ext varchar(500) NULL, -- 扩展属性 del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_node_pkey PRIMARY KEY (id) @@ -75,7 +75,6 @@ COMMENT ON COLUMN flow_node.node_name IS '流程节点名称'; COMMENT ON COLUMN flow_node.permission_flag IS '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; COMMENT ON COLUMN flow_node.node_ratio IS '流程签署比例值'; COMMENT ON COLUMN flow_node.coordinate IS '坐标'; -COMMENT ON COLUMN flow_node.skip_any_node IS '是否可以退回任意节点(Y是 N否)即将删除'; COMMENT ON COLUMN flow_node.any_node_skip IS '任意结点跳转'; COMMENT ON COLUMN flow_node.listener_type IS '监听器类型'; COMMENT ON COLUMN flow_node.listener_path IS '监听器路径'; @@ -86,6 +85,7 @@ COMMENT ON COLUMN flow_node.form_path IS '审批表单路径'; COMMENT ON COLUMN flow_node."version" IS '版本'; COMMENT ON COLUMN flow_node.create_time IS '创建时间'; COMMENT ON COLUMN flow_node.update_time IS '更新时间'; +COMMENT ON COLUMN flow_node.ext IS '扩展属性'; COMMENT ON COLUMN flow_node.del_flag IS '删除标志'; COMMENT ON COLUMN flow_node.tenant_id IS '租户id'; diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql index ea4b7205a..f376e8485 100644 --- a/script/sql/sqlserver/sqlserver_ry_workflow.sql +++ b/script/sql/sqlserver/sqlserver_ry_workflow.sql @@ -149,7 +149,6 @@ CREATE TABLE flow_node ( permission_flag nvarchar(200) NULL, node_ratio decimal(6,3) NULL, coordinate nvarchar(100) NULL, - skip_any_node nvarchar(100) DEFAULT('N') NULL, any_node_skip nvarchar(100) NULL, listener_type nvarchar(100) NULL, listener_path nvarchar(400) NULL, @@ -160,6 +159,7 @@ CREATE TABLE flow_node ( version nvarchar(20) NOT NULL, create_time datetime2(7) NULL, update_time datetime2(7) NULL, + ext nvarchar(500) NULL, del_flag nchar(1) DEFAULT('0') NULL, tenant_id nvarchar(40) NULL, CONSTRAINT PK__flow_nod__3213E83F372470DE PRIMARY KEY CLUSTERED (id) @@ -225,13 +225,6 @@ EXEC sp_addextendedproperty 'COLUMN', N'coordinate' GO -EXEC sp_addextendedproperty -'MS_Description', N'是否可以退回任意节点(Y是 N否)即将删除', -'SCHEMA', N'dbo', -'TABLE', N'flow_node', -'COLUMN', N'skip_any_node' -GO - EXEC sp_addextendedproperty 'MS_Description', N'任意结点跳转', 'SCHEMA', N'dbo', @@ -302,6 +295,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'update_time' GO +EXEC sp_addextendedproperty +'MS_Description', N'扩展属性', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'ext' +GO + EXEC sp_addextendedproperty 'MS_Description', N'删除标志', 'SCHEMA', N'dbo', diff --git a/script/sql/update/oracle/update_5.3.0-5.3.1.sql b/script/sql/update/oracle/update_5.3.0-5.3.1.sql new file mode 100644 index 000000000..044990e57 --- /dev/null +++ b/script/sql/update/oracle/update_5.3.0-5.3.1.sql @@ -0,0 +1,3 @@ +ALTER TABLE flow_node DROP COLUMN skip_any_node; +ALTER TABLE flow_node ADD (ext VARCHAR2(500)); +COMMENT ON COLUMN flow_node.ext IS '扩展属性'; diff --git a/script/sql/update/postgres/update_5.3.0-5.3.1.sql b/script/sql/update/postgres/update_5.3.0-5.3.1.sql new file mode 100644 index 000000000..85d17b9d9 --- /dev/null +++ b/script/sql/update/postgres/update_5.3.0-5.3.1.sql @@ -0,0 +1,3 @@ +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 '扩展属性'; diff --git a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql new file mode 100644 index 000000000..2cdae2c23 --- /dev/null +++ b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql @@ -0,0 +1,9 @@ +ALTER TABLE flow_node DROP COLUMN skip_any_node; +ALTER TABLE flow_node ADD ext nvarchar(500) NULL; + +EXEC sp_addextendedproperty +'MS_Description', N'扩展属性', +'SCHEMA', N'dbo', +'TABLE', N'flow_node', +'COLUMN', N'ext' +GO From 65c54184e8d087632d2953924ef8f2e2c980cb08 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: Tue, 4 Mar 2025 09:51:46 +0800 Subject: [PATCH 030/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sys=5Foss?= =?UTF-8?q?=20=E8=A1=A8=E5=A2=9E=E5=8A=A0=E6=89=A9=E5=B1=95=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=20ext1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/system/domain/SysOss.java | 5 +++++ .../main/java/org/dromara/system/domain/bo/SysOssBo.java | 5 +++++ .../main/java/org/dromara/system/domain/vo/SysOssVo.java | 5 +++++ script/sql/oracle/oracle_ry_vue_5.X.sql | 2 ++ script/sql/postgres/postgres_ry_vue_5.X.sql | 2 ++ script/sql/ry_vue_5.X.sql | 1 + script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 7 +++++++ script/sql/update/oracle/update_5.3.0-5.3.1.sql | 3 +++ script/sql/update/postgres/update_5.3.0-5.3.1.sql | 3 +++ script/sql/update/sqlserver/update_5.3.0-5.3.1.sql | 9 +++++++++ script/sql/update/update_5.3.0-5.3.1.sql | 3 +++ 11 files changed, 45 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java index af88898ec..2285a5da7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOss.java @@ -42,6 +42,11 @@ public class SysOss extends TenantEntity { */ private String url; + /** + * 扩展字段 + */ + private String ext1; + /** * 服务商 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java index 7cb3104c2..ff624c9bf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOssBo.java @@ -41,6 +41,11 @@ public class SysOssBo extends BaseEntity { */ private String url; + /** + * 扩展字段 + */ + private String ext1; + /** * 服务商 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java index 8d5c429ca..fe0565182 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssVo.java @@ -47,6 +47,11 @@ public class SysOssVo implements Serializable { */ private String url; + /** + * 扩展字段 + */ + private String ext1; + /** * 创建时间 */ diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index a1c1d99e1..85de77d8d 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -1159,6 +1159,7 @@ create table sys_oss ( file_suffix varchar2(10) not null, url varchar2(500) not null, service varchar2(20) default 'minio' not null, + ext1 varchar2(255) default '', create_dept number(20) default null, create_by number(20) default null, create_time date, @@ -1176,6 +1177,7 @@ comment on column sys_oss.original_name is '原名'; comment on column sys_oss.file_suffix is '文件后缀名'; comment on column sys_oss.url is 'URL地址'; comment on column sys_oss.service is '服务商'; +comment on column sys_oss.ext1 is '扩展字段'; comment on column sys_oss.create_dept is '创建部门'; comment on column sys_oss.create_time is '创建时间'; comment on column sys_oss.create_by is '上传者'; diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 22c60650b..68cab46b8 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -1160,6 +1160,7 @@ create table if not exists sys_oss original_name varchar(255) default ''::varchar not null, file_suffix varchar(10) default ''::varchar not null, url varchar(500) default ''::varchar not null, + ext1 varchar(255) default ''::varchar, create_dept int8, create_by int8, create_time timestamp, @@ -1176,6 +1177,7 @@ comment on column sys_oss.file_name is '文件名'; comment on column sys_oss.original_name is '原名'; comment on column sys_oss.file_suffix is '文件后缀名'; comment on column sys_oss.url is 'URL地址'; +comment on column sys_oss.ext1 is '扩展字段'; comment on column sys_oss.create_by is '上传人'; comment on column sys_oss.create_dept is '创建部门'; comment on column sys_oss.create_time is '创建时间'; diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index f2167fa30..3ac8116e2 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -828,6 +828,7 @@ create table sys_oss ( original_name varchar(255) not null default '' comment '原名', file_suffix varchar(10) not null default '' comment '文件后缀名', url varchar(500) not null comment 'URL地址', + ext1 text default '' comment '扩展字段', create_dept bigint(20) default null comment '创建部门', create_time datetime default null comment '创建时间', create_by bigint(20) default null comment '上传人', diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index c6d2960d5..b514d4360 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -2923,6 +2923,7 @@ CREATE TABLE sys_oss original_name nvarchar(255) DEFAULT '' NOT NULL, file_suffix nvarchar(10) DEFAULT '' NOT NULL, url nvarchar(500) NOT NULL, + ext1 nvarchar(255) DEFAULT '' NULL, create_dept bigint NULL, create_time datetime2(7) NULL, create_by bigint NULL, @@ -2972,6 +2973,12 @@ EXEC sp_addextendedproperty 'TABLE', N'sys_oss', 'COLUMN', N'url' GO +EXEC sp_addextendedproperty + 'MS_Description', N'扩展字段', + 'SCHEMA', N'dbo', + 'TABLE', N'sys_oss', + 'COLUMN', N'ext1' +GO EXEC sys.sp_addextendedproperty 'MS_Description', N'创建部门' , 'SCHEMA', N'dbo', diff --git a/script/sql/update/oracle/update_5.3.0-5.3.1.sql b/script/sql/update/oracle/update_5.3.0-5.3.1.sql index 044990e57..3a1474bd7 100644 --- a/script/sql/update/oracle/update_5.3.0-5.3.1.sql +++ b/script/sql/update/oracle/update_5.3.0-5.3.1.sql @@ -1,3 +1,6 @@ ALTER TABLE flow_node DROP COLUMN skip_any_node; ALTER TABLE flow_node ADD (ext VARCHAR2(500)); COMMENT ON COLUMN flow_node.ext IS '扩展属性'; + +ALTER TABLE sys_oss ADD (ext1 VARCHAR2(255)); +COMMENT ON COLUMN sys_oss.ext1 IS '扩展属性'; diff --git a/script/sql/update/postgres/update_5.3.0-5.3.1.sql b/script/sql/update/postgres/update_5.3.0-5.3.1.sql index 85d17b9d9..1f64d6001 100644 --- a/script/sql/update/postgres/update_5.3.0-5.3.1.sql +++ b/script/sql/update/postgres/update_5.3.0-5.3.1.sql @@ -1,3 +1,6 @@ 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 '扩展属性'; + +ALTER TABLE sys_oss ADD COLUMN ext1 varchar(255)); +COMMENT ON COLUMN sys_oss.ext1 IS '扩展属性'; diff --git a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql index 2cdae2c23..50d4e9bc0 100644 --- a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql +++ b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql @@ -7,3 +7,12 @@ EXEC sp_addextendedproperty 'TABLE', N'flow_node', 'COLUMN', N'ext' GO + +ALTER TABLE sys_oss ADD ext1 nvarchar(255) NULL; + +EXEC sp_addextendedproperty +'MS_Description', N'扩展属性', +'SCHEMA', N'dbo', +'TABLE', N'sys_oss', +'COLUMN', N'ext1' +GO diff --git a/script/sql/update/update_5.3.0-5.3.1.sql b/script/sql/update/update_5.3.0-5.3.1.sql index 7a26f43d1..f1a0efd7b 100644 --- a/script/sql/update/update_5.3.0-5.3.1.sql +++ b/script/sql/update/update_5.3.0-5.3.1.sql @@ -1,3 +1,6 @@ ALTER TABLE `flow_node` DROP COLUMN `skip_any_node`; ALTER TABLE `flow_node` ADD COLUMN `ext` text NULL COMMENT '扩展属性' AFTER `update_time`; + +ALTER TABLE `sys_oss` + ADD COLUMN `ext1` text NULL COMMENT '扩展属性' AFTER `url`; From 23405560912247361cfc9560123d73203f5c03e8 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: Tue, 4 Mar 2025 10:03:13 +0800 Subject: [PATCH 031/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=AD=97=E6=AE=B5=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_vue_5.X.sql | 2 +- script/sql/postgres/postgres_ry_vue_5.X.sql | 2 +- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 2 +- script/sql/update/oracle/update_5.3.0-5.3.1.sql | 2 +- script/sql/update/postgres/update_5.3.0-5.3.1.sql | 2 +- script/sql/update/sqlserver/update_5.3.0-5.3.1.sql | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 85de77d8d..7fff0b443 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -1159,7 +1159,7 @@ create table sys_oss ( file_suffix varchar2(10) not null, url varchar2(500) not null, service varchar2(20) default 'minio' not null, - ext1 varchar2(255) default '', + ext1 varchar2(500) default '', create_dept number(20) default null, create_by number(20) default null, create_time date, diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 68cab46b8..523cbe266 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -1160,7 +1160,7 @@ create table if not exists sys_oss original_name varchar(255) default ''::varchar not null, file_suffix varchar(10) default ''::varchar not null, url varchar(500) default ''::varchar not null, - ext1 varchar(255) default ''::varchar, + ext1 varchar(500) default ''::varchar, create_dept int8, create_by int8, create_time timestamp, diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index b514d4360..0567f31d9 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -2923,7 +2923,7 @@ CREATE TABLE sys_oss original_name nvarchar(255) DEFAULT '' NOT NULL, file_suffix nvarchar(10) DEFAULT '' NOT NULL, url nvarchar(500) NOT NULL, - ext1 nvarchar(255) DEFAULT '' NULL, + ext1 nvarchar(500) DEFAULT '' NULL, create_dept bigint NULL, create_time datetime2(7) NULL, create_by bigint NULL, diff --git a/script/sql/update/oracle/update_5.3.0-5.3.1.sql b/script/sql/update/oracle/update_5.3.0-5.3.1.sql index 3a1474bd7..143c909d3 100644 --- a/script/sql/update/oracle/update_5.3.0-5.3.1.sql +++ b/script/sql/update/oracle/update_5.3.0-5.3.1.sql @@ -2,5 +2,5 @@ ALTER TABLE flow_node DROP COLUMN skip_any_node; ALTER TABLE flow_node ADD (ext VARCHAR2(500)); COMMENT ON COLUMN flow_node.ext IS '扩展属性'; -ALTER TABLE sys_oss ADD (ext1 VARCHAR2(255)); +ALTER TABLE sys_oss ADD (ext1 VARCHAR2(500)); COMMENT ON COLUMN sys_oss.ext1 IS '扩展属性'; diff --git a/script/sql/update/postgres/update_5.3.0-5.3.1.sql b/script/sql/update/postgres/update_5.3.0-5.3.1.sql index 1f64d6001..31bf7465e 100644 --- a/script/sql/update/postgres/update_5.3.0-5.3.1.sql +++ b/script/sql/update/postgres/update_5.3.0-5.3.1.sql @@ -2,5 +2,5 @@ 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 '扩展属性'; -ALTER TABLE sys_oss ADD COLUMN ext1 varchar(255)); +ALTER TABLE sys_oss ADD COLUMN ext1 varchar(500)); COMMENT ON COLUMN sys_oss.ext1 IS '扩展属性'; diff --git a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql index 50d4e9bc0..8a22c00bb 100644 --- a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql +++ b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql @@ -8,7 +8,7 @@ EXEC sp_addextendedproperty 'COLUMN', N'ext' GO -ALTER TABLE sys_oss ADD ext1 nvarchar(255) NULL; +ALTER TABLE sys_oss ADD ext1 nvarchar(500) NULL; EXEC sp_addextendedproperty 'MS_Description', N'扩展属性', From 15eb08c065649744cfaa5142a072863e89bb439d Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 4 Mar 2025 21:51:16 +0800 Subject: [PATCH 032/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=B8=8B=E4=B8=80=E8=8A=82=E7=82=B9=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/domain/bo/SysUserBo.java | 5 +++++ .../system/service/ISysUserService.java | 15 ++++++++++--- .../service/impl/SysUserServiceImpl.java | 1 + .../service/impl/FlwTaskServiceImpl.java | 22 +++++++++---------- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index 2669a8179..1472d2428 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -103,6 +103,11 @@ public class SysUserBo extends BaseEntity { */ private Long roleId; + /** + * 用户ID + */ + private String userIds; + /** * 排除不查询的用户(工作流用) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 0325a2558..1fe554547 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -16,10 +16,17 @@ import java.util.List; public interface ISysUserService { + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @param pageQuery 发呢也 + * @return 用户信息 + */ TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); /** - * 根据条件分页查询用户列表 + * 导出用户列表 * * @param user 用户信息 * @return 用户信息集合信息 @@ -29,7 +36,8 @@ public interface ISysUserService { /** * 根据条件分页查询已分配用户角色列表 * - * @param user 用户信息 + * @param user 用户信息 + * @param pageQuery 分页 * @return 用户信息集合信息 */ TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); @@ -37,7 +45,8 @@ public interface ISysUserService { /** * 根据条件分页查询未分配用户角色列表 * - * @param user 用户信息 + * @param user 用户信息 + * @param pageQuery 分页 * @return 用户信息集合信息 */ TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 40811707b..cecd7f56f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -79,6 +79,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", SystemConstants.NORMAL) .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .in(StringUtils.isNotBlank(user.getUserIds()), "u.user_id", StringUtils.splitTo(user.getUserIds(), Convert::toLong)) .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()) 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 21e6d1946..08574f627 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 @@ -518,24 +518,22 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Definition definition = defService.getById(task.getDefinitionId()); //获取下一节点列表 List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), variables); + List nextFlowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class); if (CollUtil.isNotEmpty(nextNodeList)) { //构建以下节点数据 - List buildTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null)); + List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null)); //办理人变量替换 - ExpressionUtil.evalVariable(buildTaskList, MapUtil.mergeAll(instance.getVariableMap(), variables)); - for (Node nextNode : nextNodeList) { - buildTaskList.stream().filter(t -> t.getNodeCode().equals(nextNode.getNodeCode())).findFirst().ifPresent(t -> { - nextNode.setPermissionFlag(StringUtils.join(t.getPermissionList(), StringUtils.SEPARATOR)); + ExpressionUtil.evalVariable(buildNextTaskList, MapUtil.mergeAll(instance.getVariableMap(), variables)); + for (FlowNode flowNode : nextFlowNodes) { + buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { + List users = flwTaskAssigneeService.fetchUsersByStorageId(flowNode.getPermissionFlag()); + if (CollUtil.isNotEmpty(users)) { + flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId()))); + } }); } - List flowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class); - for (FlowNode flowNode : flowNodes) { - if (StringUtils.isNotBlank(flowNode.getPermissionFlag())) { - flwTaskAssigneeService.fetchUsersByStorageId(flowNode.getPermissionFlag()); - } - } } - return BeanUtil.copyToList(nextNodeList, FlowNode.class); + return nextFlowNodes; } /** From ad01406fc18b62c593e6884d17b830a57e87511b 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, 5 Mar 2025 15:33:00 +0800 Subject: [PATCH 033/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20text=20?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=BB=98=E8=AE=A4=E5=80=BC=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=AF=E8=83=BD=E6=9C=89=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20=E6=94=B9=E4=B8=BA=E9=BB=98=E8=AE=A4null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/ry_vue_5.X.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 3ac8116e2..c17e4a01a 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -828,7 +828,7 @@ create table sys_oss ( original_name varchar(255) not null default '' comment '原名', file_suffix varchar(10) not null default '' comment '文件后缀名', url varchar(500) not null comment 'URL地址', - ext1 text default '' comment '扩展字段', + ext1 text default null comment '扩展字段', create_dept bigint(20) default null comment '创建部门', create_time datetime default null comment '创建时间', create_by bigint(20) default null comment '上传人', From bcb97bc4068053614e64f180967471cd30057e2b Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 5 Mar 2025 22:26:31 +0800 Subject: [PATCH 034/155] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=B8=8B=E4=B8=80=E5=AE=A1=E6=89=B9=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/bo/CompleteTaskBo.java | 6 +- .../service/impl/FlwTaskServiceImpl.java | 61 +++++++++++++++++++ .../dromara/workflow/utils/WorkflowUtils.java | 27 ++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 9fdf48478..e5befff75 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -58,9 +58,13 @@ public class CompleteTaskBo implements Serializable { */ private Map variables; + /** + * 弹窗选择的办理人 + */ + private Map assigneeMap; + /** * 扩展变量(此处为逗号分隔的ossId) - * @return */ private String ext; 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 08574f627..6caa8cddc 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 @@ -161,6 +161,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), null, true); } + // 设置弹窗处理人 + Map assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap()); + if (CollUtil.isNotEmpty(assigneeMap)) { + completeTaskBo.getVariables().putAll(assigneeMap); + } // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 FlowParams flowParams = new FlowParams(); flowParams.variable(completeTaskBo.getVariables()); @@ -174,6 +179,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { this.setHandler(instance, flowTask, flowCopyList); // 消息通知 WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + //设置下一环节处理人 + setNextHandler(ins.getId()); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -181,6 +188,60 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } + /** + * 设置下一环节处理人 + * + * @param instanceId 实例ID + */ + private void setNextHandler(Long instanceId) { + Instance inst = insService.getById(instanceId); + List flowTaskList = selectByInstId(instanceId); + Map variableMap = inst.getVariableMap(); + for (FlowTask task : flowTaskList) { + if (variableMap != null && variableMap.containsKey(task.getNodeCode())) { + String userIds = variableMap.get(task.getNodeCode()).toString(); + // 批量删除现有任务的办理人记录 + WorkflowUtils.getFlowUserService().deleteByTaskIds(List.of(task.getId())); + // 批量新增任务办理人记录 + Set users = WorkflowUtils.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId()); + WorkflowUtils.getFlowUserService().saveBatch(new ArrayList<>(users)); + variableMap.remove(task.getNodeCode()); + } + } + taskService.mergeVariable(inst, variableMap); + } + + /** + * 设置弹窗处理人 + * + * @param assigneeMap 处理人 + * @param variablesMap 变量 + */ + private Map setPopAssigneeMap(Map assigneeMap, Map variablesMap) { + Map map = new HashMap<>(); + if (CollUtil.isEmpty(assigneeMap)) { + return map; + } + for (Map.Entry entry : assigneeMap.entrySet()) { + if (variablesMap.containsKey(entry.getKey())) { + String userIds = variablesMap.get(entry.getKey()).toString(); + if (StringUtils.isNotBlank(userIds)) { + Set hashSet = new HashSet<>(); + //弹窗传入的选人 + List popUserIds = Arrays.asList(entry.getValue().toString().split(StringUtils.SEPARATOR)); + //已有的选人 + List variableUserIds = Arrays.asList(userIds.split(StringUtils.SEPARATOR)); + hashSet.addAll(popUserIds); + hashSet.addAll(variableUserIds); + map.put(entry.getKey(), String.join(StringUtils.SEPARATOR, hashSet)); + } + } else { + map.put(entry.getKey(), entry.getValue()); + } + } + return map; + } + /** * 设置办理人 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index e48ffc820..d524e7d4b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -29,6 +29,7 @@ import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; @@ -96,6 +97,32 @@ public class WorkflowUtils { return list; } + /** + * 构建工作流用户 + * + * @param userIdList 办理用户 + * @param taskId 任务ID + * @return 用户 + */ + public static Set buildFlowUser(List userIdList, Long taskId) { + if (CollUtil.isEmpty(userIdList)) { + return Set.of(); + } + Set list = new HashSet<>(); + Set processedBySet = new HashSet<>(); + for (String userId : userIdList) { + if (!processedBySet.contains(userId)) { + FlowUser flowUser = new FlowUser(); + flowUser.setType(TaskAssigneeType.APPROVER.getCode()); + flowUser.setProcessedBy(String.valueOf(userId)); + flowUser.setAssociated(taskId); + list.add(flowUser); + processedBySet.add(String.valueOf(userId)); + } + } + return list; + } + /** * 发送消息 * From e99e4f6c588998d0f92cfe3935819c9a6b555b58 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 5 Mar 2025 22:32:18 +0800 Subject: [PATCH 035/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=B8=8B=E4=B8=80=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwTaskServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 6caa8cddc..8a0082af0 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 @@ -587,9 +587,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService { ExpressionUtil.evalVariable(buildNextTaskList, MapUtil.mergeAll(instance.getVariableMap(), variables)); for (FlowNode flowNode : nextFlowNodes) { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { - List users = flwTaskAssigneeService.fetchUsersByStorageId(flowNode.getPermissionFlag()); - if (CollUtil.isNotEmpty(users)) { - flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId()))); + if (CollUtil.isNotEmpty(t.getPermissionList())) { + List users = flwTaskAssigneeService.fetchUsersByStorageId(String.join(StringUtils.SEPARATOR, t.getPermissionList())); + if (CollUtil.isNotEmpty(users)) { + flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId()))); + } } }); } From a6b7c3afe6acca83ab23d1230c9af03bffe27eba 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: Thu, 6 Mar 2025 16:08:07 +0800 Subject: [PATCH 036/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=A0=91=E5=A4=84=E7=90=86=E4=BC=98=E5=8C=96=E5=90=8E?= =?UTF-8?q?=20=E5=90=8E=E7=AB=AF=E7=BC=BA=E5=AD=97=E6=AE=B5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/domain/FlowCategory.java | 9 +++++++++ .../org/dromara/workflow/domain/vo/FlowCategoryVo.java | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java index 86ac1ac32..28918f1d9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java @@ -1,5 +1,6 @@ package org.dromara.workflow.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @@ -8,6 +9,8 @@ import lombok.EqualsAndHashCode; import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; +import java.util.ArrayList; +import java.util.List; /** * 流程分类对象 wf_category @@ -55,4 +58,10 @@ public class FlowCategory extends TenantEntity { @TableLogic private String delFlag; + /** + * 子菜单 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java index c5d27855f..f1c4caad5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -8,7 +8,9 @@ import org.dromara.workflow.domain.FlowCategory; import java.io.Serial; import java.io.Serializable; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** @@ -64,4 +66,9 @@ public class FlowCategoryVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; + /** + * 子菜单 + */ + private List children = new ArrayList<>(); + } From 45eac02f4f8480457563479573b62e94f1ac72d1 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: Thu, 6 Mar 2025 16:46:39 +0800 Subject: [PATCH 037/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B0=86?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81?= =?UTF-8?q?=E4=BB=8E=E5=B7=A5=E5=85=B7=E7=B1=BB=E8=BF=81=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=86=85=20=E4=BE=BF=E4=BA=8E=E6=89=A9?= =?UTF-8?q?=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 53 ++++++++++++++++++- .../dromara/workflow/utils/WorkflowUtils.java | 53 ------------------- 2 files changed, 51 insertions(+), 55 deletions(-) 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 8a0082af0..c9c3315f8 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 @@ -22,9 +22,12 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; @@ -38,6 +41,7 @@ import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; @@ -178,7 +182,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = taskService.skip(taskId, flowParams); this.setHandler(instance, flowTask, flowCopyList); // 消息通知 - WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + this.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); //设置下一环节处理人 setNextHandler(ins.getId()); return true; @@ -461,7 +465,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = insService.getById(inst.getId()); this.setHandler(instance, task, null); // 消息通知 - WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + this.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -802,4 +806,49 @@ public class FlwTaskServiceImpl implements IFlwTaskService { .eq(FlowNode::getNodeCode, nodeCode) .eq(FlowNode::getDefinitionId, definitionId)); } + + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public void sendMessage(String flowName, Long instId, List messageType, String message) { + List userList = new ArrayList<>(); + List list = this.selectByInstId(instId); + if (StringUtils.isBlank(message)) { + message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; + } + for (Task task : list) { + List users = this.currentTaskAllUser(task.getId()); + if (CollUtil.isNotEmpty(users)) { + userList.addAll(users); + } + } + if (CollUtil.isNotEmpty(userList)) { + for (String code : messageType) { + MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); + if (ObjectUtil.isNotEmpty(messageTypeEnum)) { + switch (messageTypeEnum) { + case SYSTEM_MESSAGE: + SseMessageDto dto = new SseMessageDto(); + dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); + dto.setMessage(message); + SseMessageUtils.publishMessage(dto); + break; + case EMAIL_MESSAGE: + MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); + break; + case SMS_MESSAGE: + //todo 短信发送 + break; + default: + throw new IllegalStateException("Unexpected value: " + messageTypeEnum); + } + } + } + } + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index d524e7d4b..3c75e8682 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -1,21 +1,15 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mail.utils.MailUtils; -import org.dromara.common.sse.dto.SseMessageDto; -import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Node; -import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; @@ -28,16 +22,13 @@ import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; -import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; /** @@ -123,50 +114,6 @@ public class WorkflowUtils { return list; } - /** - * 发送消息 - * - * @param flowName 流程定义名称 - * @param messageType 消息类型 - * @param message 消息内容,为空则发送默认配置的消息内容 - */ - public static void sendMessage(String flowName, Long instId, List messageType, String message) { - List userList = new ArrayList<>(); - List list = FLW_TASK_SERVICE.selectByInstId(instId); - if (StringUtils.isBlank(message)) { - message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; - } - for (Task task : list) { - List users = FLW_TASK_SERVICE.currentTaskAllUser(task.getId()); - if (CollUtil.isNotEmpty(users)) { - userList.addAll(users); - } - } - if (CollUtil.isNotEmpty(userList)) { - for (String code : messageType) { - MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); - if (ObjectUtil.isNotEmpty(messageTypeEnum)) { - switch (messageTypeEnum) { - case SYSTEM_MESSAGE: - SseMessageDto dto = new SseMessageDto(); - dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); - dto.setMessage(message); - SseMessageUtils.publishMessage(dto); - break; - case EMAIL_MESSAGE: - MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); - break; - case SMS_MESSAGE: - //todo 短信发送 - break; - default: - throw new IllegalStateException("Unexpected value: " + messageTypeEnum); - } - } - } - } - } - /** * 驳回 * From b7517cbbd4bbab0475e64c22a89be550c6f2e8db 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: Thu, 6 Mar 2025 17:36:47 +0800 Subject: [PATCH 038/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=B0=86=20WorkflowUtils=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E6=94=B9=E4=B8=BA=20FlwCommonService=20=E6=9B=B4?= =?UTF-8?q?=E9=80=9A=E7=94=A8=E7=9A=84=E4=B8=9A=E5=8A=A1=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/IFlwCommonService.java | 73 +++++++++++ .../impl/FlwCommonServiceImpl.java} | 123 ++++++++++++++---- .../impl/FlwDefinitionServiceImpl.java | 5 +- .../service/impl/FlwInstanceServiceImpl.java | 9 +- .../service/impl/FlwTaskServiceImpl.java | 83 +++--------- 5 files changed, 194 insertions(+), 99 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/{utils/WorkflowUtils.java => service/impl/FlwCommonServiceImpl.java} (53%) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java new file mode 100644 index 000000000..2830416d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java @@ -0,0 +1,73 @@ +package org.dromara.workflow.service; + +import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.core.service.UserService; + +import java.util.List; +import java.util.Set; + +/** + * 通用 工作流服务 + * + * @author LionLi + */ +public interface IFlwCommonService { + + /** + * 获取工作流用户service + */ + UserService getFlowUserService(); + + /** + * 构建工作流用户 + * + * @param userList 办理用户 + * @param taskId 任务ID + * @return 用户 + */ + Set buildUser(List userList, Long taskId); + + /** + * 构建工作流用户 + * + * @param userIdList 办理用户 + * @param taskId 任务ID + * @return 用户 + */ + Set buildFlowUser(List userIdList, Long taskId); + + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + void sendMessage(String flowName, Long instId, List messageType, String message); + + /** + * 驳回 + * + * @param message 审批意见 + * @param instanceId 流程实例id + * @param targetNodeCode 目标节点 + * @param flowStatus 流程状态 + * @param flowHisStatus 节点操作状态 + */ + void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus); + + /** + * 申请人节点编码 + * + * @param definitionId 流程定义id + * @return 申请人节点编码 + */ + String applyNodeCode(Long definitionId); + + /** + * 删除运行中的任务 + * + * @param taskIds 任务id + */ + void deleteRunTask(List taskIds); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java similarity index 53% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 3c75e8682..bbc5734c9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -1,15 +1,21 @@ -package org.dromara.workflow.utils; +package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mail.utils.MailUtils; +import org.dromara.common.sse.dto.SseMessageDto; +import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Node; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; @@ -22,36 +28,44 @@ import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.TaskAssigneeType; +import org.dromara.workflow.service.IFlwCommonService; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; +import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * 工作流工具 * - * @author may + * @author LionLi */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class WorkflowUtils { +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwCommonServiceImpl implements IFlwCommonService { - private static final IFlwTaskAssigneeService TASK_ASSIGNEE_SERVICE = SpringUtils.getBean(IFlwTaskAssigneeService.class); - private static final IFlwTaskService FLW_TASK_SERVICE = SpringUtils.getBean(IFlwTaskService.class); - private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class); - private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class); - private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class); - private static final TaskService TASK_SERVICE = SpringUtils.getBean(TaskService.class); - private static final NodeService NODE_SERVICE = SpringUtils.getBean(NodeService.class); + private final FlowNodeMapper flowNodeMapper; + private final FlowTaskMapper flowTaskMapper; + private final UserService userService; + private final TaskService taskService; + private final NodeService nodeService; /** * 获取工作流用户service */ - public static UserService getFlowUserService() { - return USER_SERVICE; + @Override + public UserService getFlowUserService() { + return userService; } /** @@ -61,15 +75,17 @@ public class WorkflowUtils { * @param taskId 任务ID * @return 用户 */ - public static Set buildUser(List userList, Long taskId) { + @Override + public Set buildUser(List userList, Long taskId) { if (CollUtil.isEmpty(userList)) { return Set.of(); } Set list = new HashSet<>(); Set processedBySet = new HashSet<>(); + IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); for (User user : userList) { // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List users = TASK_ASSIGNEE_SERVICE.fetchUsersByStorageId(user.getProcessedBy()); + List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); // 转换为 FlowUser 并添加到结果集合 if (CollUtil.isNotEmpty(users)) { users.forEach(dto -> { @@ -95,7 +111,8 @@ public class WorkflowUtils { * @param taskId 任务ID * @return 用户 */ - public static Set buildFlowUser(List userIdList, Long taskId) { + @Override + public Set buildFlowUser(List userIdList, Long taskId) { if (CollUtil.isEmpty(userIdList)) { return Set.of(); } @@ -114,6 +131,52 @@ public class WorkflowUtils { return list; } + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + @Override + public void sendMessage(String flowName, Long instId, List messageType, String message) { + IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class); + List userList = new ArrayList<>(); + List list = flwTaskService.selectByInstId(instId); + if (StringUtils.isBlank(message)) { + message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; + } + for (Task task : list) { + List users = flwTaskService.currentTaskAllUser(task.getId()); + if (CollUtil.isNotEmpty(users)) { + userList.addAll(users); + } + } + if (CollUtil.isNotEmpty(userList)) { + for (String code : messageType) { + MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); + if (ObjectUtil.isNotEmpty(messageTypeEnum)) { + switch (messageTypeEnum) { + case SYSTEM_MESSAGE: + SseMessageDto dto = new SseMessageDto(); + dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); + dto.setMessage(message); + SseMessageUtils.publishMessage(dto); + break; + case EMAIL_MESSAGE: + MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); + break; + case SMS_MESSAGE: + //todo 短信发送 + break; + default: + throw new IllegalStateException("Unexpected value: " + messageTypeEnum); + } + } + } + } + } + /** * 驳回 * @@ -123,8 +186,10 @@ public class WorkflowUtils { * @param flowStatus 流程状态 * @param flowHisStatus 节点操作状态 */ - public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) { - List list = FLW_TASK_SERVICE.selectByInstId(instanceId); + @Override + public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) { + IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class); + List list = flwTaskService.selectByInstId(instanceId); if (CollUtil.isNotEmpty(list)) { List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode)); if (list.size() == tasks.size()) { @@ -132,7 +197,7 @@ public class WorkflowUtils { } } for (FlowTask task : list) { - List userList = FLW_TASK_SERVICE.currentTaskAllUser(task.getId()); + List userList = flwTaskService.currentTaskAllUser(task.getId()); FlowParams flowParams = FlowParams.build(); flowParams.nodeCode(targetNodeCode); flowParams.message(message); @@ -143,7 +208,7 @@ public class WorkflowUtils { if (CollUtil.isNotEmpty(userList)) { flowParams.handler(userList.get(0).getUserId().toString()); } - TASK_SERVICE.skip(task.getId(), flowParams); + taskService.skip(task.getId(), flowParams); } //解决会签多人审批问题 backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus); @@ -155,13 +220,14 @@ public class WorkflowUtils { * @param definitionId 流程定义id * @return 申请人节点编码 */ - public static String applyNodeCode(Long definitionId) { + @Override + public String applyNodeCode(Long definitionId) { //获取已发布的流程节点 - List flowNodes = FLOW_NODE_MAPPER.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definitionId)); + List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definitionId)); AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); - Node nextNode = NODE_SERVICE.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey()); + Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey()); return nextNode.getNodeCode(); } @@ -170,11 +236,12 @@ public class WorkflowUtils { * * @param taskIds 任务id */ - public static void deleteRunTask(List taskIds) { + @Override + public void deleteRunTask(List taskIds) { if (CollUtil.isEmpty(taskIds)) { return; } - USER_SERVICE.deleteByTaskIds(taskIds); - FLOW_TASK_MAPPER.deleteByIds(taskIds); + userService.deleteByTaskIds(taskIds); + flowTaskMapper.deleteByIds(taskIds); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index b4ebcdf08..7f0f67ec6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -33,8 +33,8 @@ import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.FlowCategory; import org.dromara.workflow.domain.vo.FlowDefinitionVo; import org.dromara.workflow.mapper.FlwCategoryMapper; +import org.dromara.workflow.service.IFlwCommonService; import org.dromara.workflow.service.IFlwDefinitionService; -import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -64,6 +64,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { private final FlowNodeMapper flowNodeMapper; private final FlowSkipMapper flowSkipMapper; private final FlwCategoryMapper flwCategoryMapper; + private final IFlwCommonService flwCommonService; /** * 查询流程定义列表 @@ -125,7 +126,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { List errorMsg = new ArrayList<>(); if (CollUtil.isNotEmpty(flowNodes)) { for (FlowNode flowNode : flowNodes) { - String applyNodeCode = WorkflowUtils.applyNodeCode(id); + String applyNodeCode = flwCommonService.applyNodeCode(id); if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) { errorMsg.add(flowNode.getNodeName()); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index db8ab71b9..5e4f4613e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -46,9 +46,9 @@ import org.dromara.workflow.domain.vo.FlowVariableVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwInstanceMapper; +import org.dromara.workflow.service.IFlwCommonService; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; -import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -76,6 +76,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final IFlwTaskService flwTaskService; private final FlwInstanceMapper flwInstanceMapper; private final FlwCategoryMapper flwCategoryMapper; + private final IFlwCommonService flwCommonService; /** * 分页查询正在运行的流程实例 @@ -245,15 +246,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } String message = bo.getMessage(); BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); - String applyNodeCode = WorkflowUtils.applyNodeCode(definition.getId()); + String applyNodeCode = flwCommonService.applyNodeCode(definition.getId()); //撤销 - WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus()); + flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus()); //判断或签节点是否有多个,只保留一个 List currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId())); if (CollUtil.isNotEmpty(currentTaskList)) { if (currentTaskList.size() > 1) { currentTaskList.remove(0); - WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId)); + flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId)); } } 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 c9c3315f8..ec2ab57d1 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 @@ -22,12 +22,9 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.sse.dto.SseMessageDto; -import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.*; import org.dromara.warm.flow.core.enums.NodeType; @@ -41,7 +38,6 @@ import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.TaskAssigneeType; import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; @@ -51,9 +47,9 @@ import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwTaskMapper; +import org.dromara.workflow.service.IFlwCommonService; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; -import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -89,6 +85,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final FlwCategoryMapper flwCategoryMapper; private final FlowNodeMapper flowNodeMapper; private final IFlwTaskAssigneeService flwTaskAssigneeService; + private final IFlwCommonService flwCommonService; /** * 启动任务 @@ -182,7 +179,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = taskService.skip(taskId, flowParams); this.setHandler(instance, flowTask, flowCopyList); // 消息通知 - this.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); //设置下一环节处理人 setNextHandler(ins.getId()); return true; @@ -205,10 +202,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (variableMap != null && variableMap.containsKey(task.getNodeCode())) { String userIds = variableMap.get(task.getNodeCode()).toString(); // 批量删除现有任务的办理人记录 - WorkflowUtils.getFlowUserService().deleteByTaskIds(List.of(task.getId())); + flwCommonService.getFlowUserService().deleteByTaskIds(List.of(task.getId())); // 批量新增任务办理人记录 - Set users = WorkflowUtils.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId()); - WorkflowUtils.getFlowUserService().saveBatch(new ArrayList<>(users)); + Set users = flwCommonService.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId()); + flwCommonService.getFlowUserService().saveBatch(new ArrayList<>(users)); variableMap.remove(task.getNodeCode()); } } @@ -266,7 +263,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } List taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId); // 获取与当前任务关联的用户列表 - List associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList); + List associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList); if (CollUtil.isEmpty(associatedUsers)) { return; } @@ -275,16 +272,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService { for (FlowTask flowTask : flowTasks) { List users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId())); if (CollUtil.isNotEmpty(users)) { - userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId())); + userList.addAll(flwCommonService.buildUser(users, flowTask.getId())); } } // 批量删除现有任务的办理人记录 - WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList); + flwCommonService.getFlowUserService().deleteByTaskIds(taskIdList); // 确保要保存的 userList 不为空 if (CollUtil.isEmpty(userList)) { return; } - WorkflowUtils.getFlowUserService().saveBatch(userList); + flwCommonService.getFlowUserService().saveBatch(userList); } /** @@ -324,7 +321,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return flowUser; }).collect(Collectors.toList()); // 批量保存抄送人员 - WorkflowUtils.getFlowUserService().saveBatch(userList); + flwCommonService.getFlowUserService().saveBatch(userList); } /** @@ -452,7 +449,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { BusinessStatusEnum.checkBackStatus(inst.getFlowStatus()); Long definitionId = task.getDefinitionId(); Definition definition = defService.getById(definitionId); - String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId); + String applyNodeCode = flwCommonService.applyNodeCode(definitionId); FlowParams flowParams = FlowParams.build(); flowParams.nodeCode(bo.getNodeCode()); flowParams.message(message); @@ -465,7 +462,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = insService.getById(inst.getId()); this.setHandler(instance, task, null); // 消息通知 - this.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -565,7 +562,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt())); flowTaskVo.setNodeRatio(flowNode.getNodeRatio()); - flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(WorkflowUtils.applyNodeCode(task.getDefinitionId()))); + flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId()))); return flowTaskVo; } @@ -737,7 +734,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List flowTasks = this.selectByIdList(taskIdList); // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { - WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); List userList = flowTasks.stream() .map(flowTask -> { FlowUser flowUser = new FlowUser(); @@ -748,7 +745,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { }) .collect(Collectors.toList()); if (CollUtil.isNotEmpty(userList)) { - WorkflowUtils.getFlowUserService().saveBatch(userList); + flwCommonService.getFlowUserService().saveBatch(userList); } } } catch (Exception e) { @@ -767,7 +764,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public Map> currentTaskAllUser(List taskIdList) { Map> map = new HashMap<>(); // 获取与当前任务关联的用户列表 - List associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList); + List associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList); Map> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); for (Map.Entry> entry : listMap.entrySet()) { List value = entry.getValue(); @@ -787,7 +784,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public List currentTaskAllUser(Long taskId) { // 获取与当前任务关联的用户列表 - List userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId)); + List userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId)); if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } @@ -807,48 +804,4 @@ public class FlwTaskServiceImpl implements IFlwTaskService { .eq(FlowNode::getDefinitionId, definitionId)); } - /** - * 发送消息 - * - * @param flowName 流程定义名称 - * @param messageType 消息类型 - * @param message 消息内容,为空则发送默认配置的消息内容 - */ - public void sendMessage(String flowName, Long instId, List messageType, String message) { - List userList = new ArrayList<>(); - List list = this.selectByInstId(instId); - if (StringUtils.isBlank(message)) { - message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; - } - for (Task task : list) { - List users = this.currentTaskAllUser(task.getId()); - if (CollUtil.isNotEmpty(users)) { - userList.addAll(users); - } - } - if (CollUtil.isNotEmpty(userList)) { - for (String code : messageType) { - MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); - if (ObjectUtil.isNotEmpty(messageTypeEnum)) { - switch (messageTypeEnum) { - case SYSTEM_MESSAGE: - SseMessageDto dto = new SseMessageDto(); - dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); - dto.setMessage(message); - SseMessageUtils.publishMessage(dto); - break; - case EMAIL_MESSAGE: - MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message); - break; - case SMS_MESSAGE: - //todo 短信发送 - break; - default: - throw new IllegalStateException("Unexpected value: " + messageTypeEnum); - } - } - } - } - } - } From 279c8e014a6e51b57578ad17561a6cec2372453e Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Thu, 6 Mar 2025 22:23:48 +0800 Subject: [PATCH 039/155] =?UTF-8?q?update=20=E8=A1=A5=E5=85=85=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/service/IFlwCommonService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java index 2830416d4..73201f43f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java @@ -15,6 +15,8 @@ public interface IFlwCommonService { /** * 获取工作流用户service + * + * @return 工作流用户service */ UserService getFlowUserService(); @@ -40,6 +42,7 @@ public interface IFlwCommonService { * 发送消息 * * @param flowName 流程定义名称 + * @param instId 实例id * @param messageType 消息类型 * @param message 消息内容,为空则发送默认配置的消息内容 */ From 7adf702283140793d5bbaa959423db8c3995dd36 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: Fri, 7 Mar 2025 15:05:08 +0800 Subject: [PATCH 040/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20getLoginU?= =?UTF-8?q?ser=20=E6=96=B9=E6=B3=95=20=E6=94=AF=E6=8C=81=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=A4=9A=E7=A7=8D=E7=B1=BB=E5=9E=8B=E7=99=BB=E9=99=86=E5=AE=9E?= =?UTF-8?q?=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/web/service/SysLoginService.java | 3 ++- .../common/satoken/utils/LoginHelper.java | 16 +++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 41a802b44..7ef4c5f18 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -17,6 +17,7 @@ import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.dto.PostDTO; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.XcxLoginUser; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.user.UserException; @@ -109,7 +110,7 @@ public class SysLoginService { */ public void logout() { try { - LoginUser loginUser = LoginHelper.getLoginUser(); + XcxLoginUser loginUser = LoginHelper.getLoginUser(); if (ObjectUtil.isNull(loginUser)) { return; } diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index e2c92366f..96aaa95f9 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -63,23 +63,25 @@ public class LoginHelper { /** * 获取用户(多级缓存) */ - public static LoginUser getLoginUser() { + @SuppressWarnings("unchecked cast") + public static T getLoginUser() { SaSession session = StpUtil.getTokenSession(); if (ObjectUtil.isNull(session)) { return null; } - return (LoginUser) session.get(LOGIN_USER_KEY); + return (T) session.get(LOGIN_USER_KEY); } /** * 获取用户基于token */ - public static LoginUser getLoginUser(String token) { + @SuppressWarnings("unchecked cast") + public static T getLoginUser(String token) { SaSession session = StpUtil.getTokenSessionByToken(token); if (ObjectUtil.isNull(session)) { return null; } - return (LoginUser) session.get(LOGIN_USER_KEY); + return (T) session.get(LOGIN_USER_KEY); } /** @@ -191,7 +193,11 @@ public class LoginHelper { * @return 结果 */ public static boolean isTenantAdmin() { - return Convert.toBool(isTenantAdmin(getLoginUser().getRolePermission())); + LoginUser loginUser = getLoginUser(); + if (loginUser == null) { + return false; + } + return Convert.toBool(isTenantAdmin(loginUser.getRolePermission())); } /** From 96a62a3564bc4bee05fe1ffdfa14332f591ddf8f 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: Fri, 7 Mar 2025 15:06:36 +0800 Subject: [PATCH 041/155] =?UTF-8?q?update=20=E5=9B=9E=E6=BB=9A=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/web/service/SysLoginService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 7ef4c5f18..41a802b44 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -17,7 +17,6 @@ import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.dto.PostDTO; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.XcxLoginUser; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.user.UserException; @@ -110,7 +109,7 @@ public class SysLoginService { */ public void logout() { try { - XcxLoginUser loginUser = LoginHelper.getLoginUser(); + LoginUser loginUser = LoginHelper.getLoginUser(); if (ObjectUtil.isNull(loginUser)) { return; } From 13ac302525f3a37ed61bd5f1c097ec3facc8feac 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: Fri, 7 Mar 2025 15:09:44 +0800 Subject: [PATCH 042/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20getLoginU?= =?UTF-8?q?ser=20=E6=96=B9=E6=B3=95=20=E6=94=AF=E6=8C=81=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=A4=9A=E7=A7=8D=E7=B1=BB=E5=9E=8B=E7=99=BB=E9=99=86=E5=AE=9E?= =?UTF-8?q?=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/satoken/utils/LoginHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 96aaa95f9..a5729387d 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -64,7 +64,7 @@ public class LoginHelper { * 获取用户(多级缓存) */ @SuppressWarnings("unchecked cast") - public static T getLoginUser() { + public static T getLoginUser() { SaSession session = StpUtil.getTokenSession(); if (ObjectUtil.isNull(session)) { return null; @@ -76,7 +76,7 @@ public class LoginHelper { * 获取用户基于token */ @SuppressWarnings("unchecked cast") - public static T getLoginUser(String token) { + public static T getLoginUser(String token) { SaSession session = StpUtil.getTokenSessionByToken(token); if (ObjectUtil.isNull(session)) { return null; From 23245b78cab594aa479020a69f0be1c73d9ca1bd Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 8 Mar 2025 00:09:08 +0800 Subject: [PATCH 043/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=B8=8B=E4=B8=80=E7=8E=AF=E8=8A=82=E6=8E=92=E4=BB=96?= =?UTF-8?q?=E7=BD=91=E5=85=B3=E5=87=BA=E7=8E=B0=E6=9D=A1=E4=BB=B6=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20add=20=E5=A2=9E=E5=8A=A0=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwTaskServiceImpl.java | 5 +- script/leave/leave6.json | 211 ++++++++++++++++++ 2 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 script/leave/leave6.json 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 ec2ab57d1..2e985f7e5 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 @@ -578,14 +578,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Task task = taskService.getById(taskId); Instance instance = insService.getById(task.getInstanceId()); Definition definition = defService.getById(task.getDefinitionId()); + Map mergeVariable = MapUtil.mergeAll(instance.getVariableMap(), variables); //获取下一节点列表 - List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), variables); + List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable); List nextFlowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class); if (CollUtil.isNotEmpty(nextNodeList)) { //构建以下节点数据 List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null)); //办理人变量替换 - ExpressionUtil.evalVariable(buildNextTaskList, MapUtil.mergeAll(instance.getVariableMap(), variables)); + ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable); for (FlowNode flowNode : nextFlowNodes) { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { if (CollUtil.isNotEmpty(t.getPermissionList())) { diff --git a/script/leave/leave6.json b/script/leave/leave6.json new file mode 100644 index 000000000..dd0aae1cb --- /dev/null +++ b/script/leave/leave6.json @@ -0,0 +1,211 @@ +{ + "flowCode" : "leave6", + "flowName" : "请假申请-排他并行会签", + "category" : "100", + "version" : "1", + "formCustom" : "N", + "formPath" : "/workflow/leaveEdit/index", + "nodeList" : [ { + "nodeType" : 0, + "nodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054", + "nodeName" : "开始", + "nodeRatio" : 0.000, + "coordinate" : "240,300|240,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054", + "nextNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", + "skipType" : "PASS", + "coordinate" : "260,300;350,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", + "nodeName" : "申请人", + "nodeRatio" : 0.000, + "coordinate" : "400,300|400,300", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", + "nextNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", + "skipType" : "PASS", + "coordinate" : "450,300;510,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", + "nodeName" : "副经理", + "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\"}]", + "skipList" : [ { + "nowNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", + "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "skipType" : "PASS", + "coordinate" : "910,200;1000,200;1000,275" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", + "nodeName" : "组长", + "permissionFlag" : "1", + "nodeRatio" : 0.000, + "coordinate" : "860,400|860,400", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", + "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "skipType" : "PASS", + "coordinate" : "910,400;1000,400;1000,325" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", + "nodeName" : "副组长", + "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\"}]", + "skipList" : [ { + "nowNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", + "nextNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "skipType" : "PASS", + "coordinate" : "610,300;675,300" + } ] + }, { + "nodeType" : 3, + "nodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "nodeRatio" : 0.000, + "coordinate" : "700,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "nextNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", + "skipName" : "大于两天", + "skipType" : "PASS", + "skipCondition" : "gt@@leaveDays|2", + "coordinate" : "700,275;700,200;810,200|700,237" + }, { + "nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "nextNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", + "skipType" : "PASS", + "coordinate" : "700,325;700,400;810,400" + } ] + }, { + "nodeType" : 3, + "nodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "nodeRatio" : 0.000, + "coordinate" : "1000,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "nextNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", + "skipType" : "PASS", + "coordinate" : "1025,300;1130,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", + "nodeName" : "经理会签", + "permissionFlag" : "1@@3", + "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\"}]", + "skipList" : [ { + "nowNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", + "nextNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "skipType" : "PASS", + "coordinate" : "1230,300;1315,300" + } ] + }, { + "nodeType" : 4, + "nodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "nodeRatio" : 0.000, + "coordinate" : "1340,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "nextNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", + "skipType" : "PASS", + "coordinate" : "1340,325;1340,400;1430,400" + }, { + "nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "nextNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", + "skipType" : "PASS", + "coordinate" : "1340,275;1340,200;1430,200" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", + "nodeName" : "总经理", + "permissionFlag" : "3@@1", + "nodeRatio" : 0.000, + "coordinate" : "1480,200|1480,200", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", + "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "skipType" : "PASS", + "coordinate" : "1530,200;1640,200;1640,275" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", + "nodeName" : "副总经理", + "permissionFlag" : "1@@3", + "nodeRatio" : 0.000, + "coordinate" : "1480,400|1480,400", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", + "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "skipType" : "PASS", + "coordinate" : "1530,400;1640,400;1640,325" + } ] + }, { + "nodeType" : 4, + "nodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "nodeRatio" : 0.000, + "coordinate" : "1640,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "nextNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", + "skipType" : "PASS", + "coordinate" : "1665,300;1770,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", + "nodeName" : "董事", + "permissionFlag" : "1", + "nodeRatio" : 0.000, + "coordinate" : "1820,300|1820,300", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", + "nextNodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31", + "skipType" : "PASS", + "coordinate" : "1870,300;1960,300" + } ] + }, { + "nodeType" : 2, + "nodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31", + "nodeName" : "结束", + "nodeRatio" : 0.000, + "coordinate" : "1980,300|1980,300", + "formCustom" : "N", + "ext" : "[]" + } ] +} \ No newline at end of file From 5a4be5fba161be0cc9a39a8a5315b890e90c96c3 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 8 Mar 2025 00:35:57 +0800 Subject: [PATCH 044/155] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=A4=BA=E4=BE=8B=20fix=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=8F=82=E6=95=B0=E6=B2=A1=E6=9C=89=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwInstanceServiceImpl.java | 1 + .../service/impl/FlwTaskServiceImpl.java | 2 + .../service/impl/TestLeaveServiceImpl.java | 13 ++ script/leave/leave6.json | 211 ------------------ 4 files changed, 16 insertions(+), 211 deletions(-) delete mode 100644 script/leave/leave6.json diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 5e4f4613e..b5c943e90 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -374,6 +374,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { Instance instance = insService.getById(instanceId); if (instance != null) { taskService.mergeVariable(instance, variable); + insService.updateById(instance); } } 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 2e985f7e5..209073bdb 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 @@ -110,6 +110,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNotNull(flowInstance)) { BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); + taskService.mergeVariable(flowInstance, variables); + insService.updateById(flowInstance); StartProcessReturnDTO dto = new StartProcessReturnDTO(); dto.setProcessInstanceId(taskList.get(0).getInstanceId()); dto.setTaskId(taskList.get(0).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 537361c3e..a1ac84595 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 @@ -47,6 +47,19 @@ public class TestLeaveServiceImpl implements ITestLeaveService { private final TestLeaveMapper baseMapper; private final WorkflowService workflowService; + /** + * spel条件表达:判断小于2 + * + * @param leaveDays 待判断的变量(可不传自行返回true或false) + * @return boolean + */ + public boolean eval(Integer leaveDays) { + if (leaveDays < 2) { + return true; + } + return false; + } + /** * 查询请假 */ diff --git a/script/leave/leave6.json b/script/leave/leave6.json deleted file mode 100644 index dd0aae1cb..000000000 --- a/script/leave/leave6.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "flowCode" : "leave6", - "flowName" : "请假申请-排他并行会签", - "category" : "100", - "version" : "1", - "formCustom" : "N", - "formPath" : "/workflow/leaveEdit/index", - "nodeList" : [ { - "nodeType" : 0, - "nodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054", - "nodeName" : "开始", - "nodeRatio" : 0.000, - "coordinate" : "240,300|240,300", - "formCustom" : "N", - "ext" : "[]", - "skipList" : [ { - "nowNodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054", - "nextNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", - "skipType" : "PASS", - "coordinate" : "260,300;350,300" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", - "nodeName" : "申请人", - "nodeRatio" : 0.000, - "coordinate" : "400,300|400,300", - "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", - "skipList" : [ { - "nowNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", - "nextNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", - "skipType" : "PASS", - "coordinate" : "450,300;510,300" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", - "nodeName" : "副经理", - "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\"}]", - "skipList" : [ { - "nowNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", - "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", - "skipType" : "PASS", - "coordinate" : "910,200;1000,200;1000,275" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", - "nodeName" : "组长", - "permissionFlag" : "1", - "nodeRatio" : 0.000, - "coordinate" : "860,400|860,400", - "formCustom" : "N", - "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", - "skipList" : [ { - "nowNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", - "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", - "skipType" : "PASS", - "coordinate" : "910,400;1000,400;1000,325" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", - "nodeName" : "副组长", - "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\"}]", - "skipList" : [ { - "nowNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", - "nextNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", - "skipType" : "PASS", - "coordinate" : "610,300;675,300" - } ] - }, { - "nodeType" : 3, - "nodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", - "nodeRatio" : 0.000, - "coordinate" : "700,300", - "formCustom" : "N", - "ext" : "[]", - "skipList" : [ { - "nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", - "nextNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", - "skipName" : "大于两天", - "skipType" : "PASS", - "skipCondition" : "gt@@leaveDays|2", - "coordinate" : "700,275;700,200;810,200|700,237" - }, { - "nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", - "nextNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", - "skipType" : "PASS", - "coordinate" : "700,325;700,400;810,400" - } ] - }, { - "nodeType" : 3, - "nodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", - "nodeRatio" : 0.000, - "coordinate" : "1000,300", - "formCustom" : "N", - "ext" : "[]", - "skipList" : [ { - "nowNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", - "nextNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", - "skipType" : "PASS", - "coordinate" : "1025,300;1130,300" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", - "nodeName" : "经理会签", - "permissionFlag" : "1@@3", - "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\"}]", - "skipList" : [ { - "nowNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", - "nextNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", - "skipType" : "PASS", - "coordinate" : "1230,300;1315,300" - } ] - }, { - "nodeType" : 4, - "nodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", - "nodeRatio" : 0.000, - "coordinate" : "1340,300", - "formCustom" : "N", - "ext" : "[]", - "skipList" : [ { - "nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", - "nextNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", - "skipType" : "PASS", - "coordinate" : "1340,325;1340,400;1430,400" - }, { - "nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", - "nextNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", - "skipType" : "PASS", - "coordinate" : "1340,275;1340,200;1430,200" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", - "nodeName" : "总经理", - "permissionFlag" : "3@@1", - "nodeRatio" : 0.000, - "coordinate" : "1480,200|1480,200", - "formCustom" : "N", - "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", - "skipList" : [ { - "nowNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", - "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", - "skipType" : "PASS", - "coordinate" : "1530,200;1640,200;1640,275" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", - "nodeName" : "副总经理", - "permissionFlag" : "1@@3", - "nodeRatio" : 0.000, - "coordinate" : "1480,400|1480,400", - "formCustom" : "N", - "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", - "skipList" : [ { - "nowNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", - "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", - "skipType" : "PASS", - "coordinate" : "1530,400;1640,400;1640,325" - } ] - }, { - "nodeType" : 4, - "nodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", - "nodeRatio" : 0.000, - "coordinate" : "1640,300", - "formCustom" : "N", - "ext" : "[]", - "skipList" : [ { - "nowNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", - "nextNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", - "skipType" : "PASS", - "coordinate" : "1665,300;1770,300" - } ] - }, { - "nodeType" : 1, - "nodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", - "nodeName" : "董事", - "permissionFlag" : "1", - "nodeRatio" : 0.000, - "coordinate" : "1820,300|1820,300", - "formCustom" : "N", - "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", - "skipList" : [ { - "nowNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", - "nextNodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31", - "skipType" : "PASS", - "coordinate" : "1870,300;1960,300" - } ] - }, { - "nodeType" : 2, - "nodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31", - "nodeName" : "结束", - "nodeRatio" : 0.000, - "coordinate" : "1980,300|1980,300", - "formCustom" : "N", - "ext" : "[]" - } ] -} \ No newline at end of file From f028cb76fc32140c58094a92d58b04040c2a00ca Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 8 Mar 2025 00:36:44 +0800 Subject: [PATCH 045/155] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/leave/leave6.json | 212 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 script/leave/leave6.json diff --git a/script/leave/leave6.json b/script/leave/leave6.json new file mode 100644 index 000000000..c0fb172ec --- /dev/null +++ b/script/leave/leave6.json @@ -0,0 +1,212 @@ +{ + "flowCode" : "leave6", + "flowName" : "请假申请-排他并行会签", + "category" : "100", + "version" : "4", + "formCustom" : "N", + "formPath" : "/workflow/leaveEdit/index", + "nodeList" : [ { + "nodeType" : 0, + "nodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054", + "nodeName" : "开始", + "nodeRatio" : 0.000, + "coordinate" : "240,300|240,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "122b89a5-7c6f-40a3-aa09-7a263f902054", + "nextNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", + "skipType" : "PASS", + "coordinate" : "260,300;350,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", + "nodeName" : "申请人", + "nodeRatio" : 0.000, + "coordinate" : "400,300|400,300", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "c25a0e86-fdd1-4f03-8e22-14db70389dbd", + "nextNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", + "skipType" : "PASS", + "coordinate" : "450,300;510,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", + "nodeName" : "副经理", + "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\"}]", + "skipList" : [ { + "nowNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", + "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "skipType" : "PASS", + "coordinate" : "910,200;1000,200;1000,275" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", + "nodeName" : "组长", + "permissionFlag" : "1", + "nodeRatio" : 0.000, + "coordinate" : "860,400|860,400", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", + "nextNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "skipType" : "PASS", + "coordinate" : "910,400;1000,400;1000,325" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", + "nodeName" : "副组长", + "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\"}]", + "skipList" : [ { + "nowNodeCode" : "07ecda1d-7a0a-47b5-8a91-6186c9473742", + "nextNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "skipType" : "PASS", + "coordinate" : "610,300;675,300" + } ] + }, { + "nodeType" : 3, + "nodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "nodeRatio" : 0.000, + "coordinate" : "700,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "nextNodeCode" : "2bfa3919-78cf-4bc1-b59b-df463a4546f9", + "skipName" : "大于两天", + "skipType" : "PASS", + "skipCondition" : "default@@${leaveDays > 2}", + "coordinate" : "700,275;700,200;810,200|700,237" + }, { + "nowNodeCode" : "48117e2c-6328-406b-b102-c4a9d115bb13", + "nextNodeCode" : "ec17f60e-94e0-4d96-a3ce-3417e9d32d60", + "skipType" : "PASS", + "skipCondition" : "spel@@#{@testLeaveServiceImpl.eval(#leaveDays)}", + "coordinate" : "700,325;700,400;810,400" + } ] + }, { + "nodeType" : 3, + "nodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "nodeRatio" : 0.000, + "coordinate" : "1000,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "394e1cc8-b8b2-4189-9f81-44448e88ac32", + "nextNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", + "skipType" : "PASS", + "coordinate" : "1025,300;1130,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", + "nodeName" : "经理会签", + "permissionFlag" : "1@@3", + "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\"}]", + "skipList" : [ { + "nowNodeCode" : "9c93a195-cff2-4e17-ab0a-a4f264191496", + "nextNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "skipType" : "PASS", + "coordinate" : "1230,300;1315,300" + } ] + }, { + "nodeType" : 4, + "nodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "nodeRatio" : 0.000, + "coordinate" : "1340,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "nextNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", + "skipType" : "PASS", + "coordinate" : "1340,325;1340,400;1430,400" + }, { + "nowNodeCode" : "a1a42056-afd1-4e90-88bc-36cbf5a66992", + "nextNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", + "skipType" : "PASS", + "coordinate" : "1340,275;1340,200;1430,200" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", + "nodeName" : "总经理", + "permissionFlag" : "3@@1", + "nodeRatio" : 0.000, + "coordinate" : "1480,200|1480,200", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "350dfa0c-a77c-4efa-8527-10efa02d8be4", + "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "skipType" : "PASS", + "coordinate" : "1530,200;1640,200;1640,275" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", + "nodeName" : "副总经理", + "permissionFlag" : "1@@3", + "nodeRatio" : 0.000, + "coordinate" : "1480,400|1480,400", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5", + "nextNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "skipType" : "PASS", + "coordinate" : "1530,400;1640,400;1640,325" + } ] + }, { + "nodeType" : 4, + "nodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "nodeRatio" : 0.000, + "coordinate" : "1640,300", + "formCustom" : "N", + "ext" : "[]", + "skipList" : [ { + "nowNodeCode" : "c36a46ef-04f9-463f-bad7-4b395c818519", + "nextNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", + "skipType" : "PASS", + "coordinate" : "1665,300;1770,300" + } ] + }, { + "nodeType" : 1, + "nodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", + "nodeName" : "董事", + "permissionFlag" : "1", + "nodeRatio" : 0.000, + "coordinate" : "1820,300|1820,300", + "formCustom" : "N", + "ext" : "[{\"code\":\"enum:org.dromara.workflow.common.enums.ButtonPermissionEnum\",\"value\":\"back,termination\"}]", + "skipList" : [ { + "nowNodeCode" : "3fcea762-b53a-4ae1-8365-7bec90444828", + "nextNodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31", + "skipType" : "PASS", + "coordinate" : "1870,300;1960,300" + } ] + }, { + "nodeType" : 2, + "nodeCode" : "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31", + "nodeName" : "结束", + "nodeRatio" : 0.000, + "coordinate" : "1980,300|1980,300", + "formCustom" : "N", + "ext" : "[]" + } ] +} \ No newline at end of file From 34bac1add9ce0a065ccb174072d8e6ef0ea148ed Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 10 Mar 2025 11:12:39 +0800 Subject: [PATCH 046/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A0=87=E8=AF=86=E7=AC=A6=E5=A2=9E=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E9=85=8D=E7=AC=A6*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/constant/RegexConstants.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java index 77eed8c09..f1e04f760 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java @@ -17,9 +17,14 @@ public interface RegexConstants extends RegexPool { String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$"; /** - * 权限标识必须符合 tool:build:list 格式,或者空字符串 + * 权限标识必须符合以下格式: + * 1. 标准格式:xxx:yyy:zzz + * - 第一部分(xxx):只能包含字母、数字和下划线(_),不能使用 `*` + * - 第二部分(yyy):可以包含字母、数字、下划线(_)和 `*` + * - 第三部分(zzz):可以包含字母、数字、下划线(_)和 `*` + * 2. 允许空字符串(""),表示没有权限标识 */ - String PERMISSION_STRING = "^(|^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+:[a-zA-Z0-9_]+)$"; + String PERMISSION_STRING = "^$|^[a-zA-Z0-9_]+:[a-zA-Z0-9_*]+:[a-zA-Z0-9_*]+$"; /** * 身份证号码(后6位) From a93b30ec9114a32bfb5811fa23772836be51dd8c 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: Tue, 11 Mar 2025 14:15:20 +0800 Subject: [PATCH 047/155] =?UTF-8?q?update=20warm-flow=201.6.7=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E6=AD=A3=E5=BC=8F=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f420f3cd4..9742a21f2 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ 8.7.2-20250101 - 1.6.7-M2 + 1.6.7 3.2.2 From 460545a75e5894ea2ba81aa9240ff3f9289265c9 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: Tue, 11 Mar 2025 17:56:02 +0800 Subject: [PATCH 048/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=96=B9=E6=B3=95=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/core/service/DictService.java | 4 ++-- .../dromara/system/service/impl/SysDictTypeServiceImpl.java | 4 ++-- .../dromara/workflow/service/impl/FlwNodeExtServiceImpl.java | 4 ++-- 3 files changed, 6 insertions(+), 6 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 7c5097764..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 @@ -74,7 +74,7 @@ public interface DictService { * @param dictType 字典类型 * @return 字典类型详细信息 */ - DictTypeDTO getDictTypeDto(String dictType); + DictTypeDTO getDictType(String dictType); /** * 根据字典类型查询字典数据列表 @@ -82,6 +82,6 @@ public interface DictService { * @param dictType 字典类型 * @return 字典数据列表 */ - List getDictDataDto(String dictType); + List getDictData(String dictType); } 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 9d80d50e4..1e5188c38 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 @@ -275,7 +275,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService * @return 字典类型详细信息 */ @Override - public DictTypeDTO getDictTypeDto(String dictType) { + public DictTypeDTO getDictType(String dictType) { SysDictTypeVo vo = SpringUtils.getAopProxy(this).selectDictTypeByType(dictType); return BeanUtil.toBean(vo, DictTypeDTO.class); } @@ -287,7 +287,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService * @return 字典数据列表 */ @Override - public List getDictDataDto(String dictType) { + public List getDictData(String dictType) { List list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); return BeanUtil.copyToList(list, DictDataDTO.class); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index 0b4d4b790..4d8368a85 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -147,7 +147,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService { * @return 返回构建好的 ChildNode 对象 */ private NodeExt.ChildNode buildChildNodeFromDict(String dictType) { - DictTypeDTO dictTypeDTO = dictService.getDictTypeDto(dictType); + DictTypeDTO dictTypeDTO = dictService.getDictType(dictType); if (ObjectUtil.isNull(dictTypeDTO)) { return null; } @@ -159,7 +159,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService { // 描述 childNode.setDesc(dictTypeDTO.getRemark()); // 字典,下拉框和复选框时用到 - childNode.setDict(dictService.getDictDataDto(dictType) + childNode.setDict(dictService.getDictData(dictType) .stream().map(x -> new NodeExt.DictItem(x.getDictLabel(), x.getDictValue(), Convert.toBool(x.getIsDefault(), false)) ).toList()); From 8bf741fd5b2682b0dc95821b7a7d58e0625c24e3 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, 12 Mar 2025 17:29:48 +0800 Subject: [PATCH 049/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E9=AA=8C=E8=AF=81=E7=A0=81=E5=90=8E=20=E9=99=90?= =?UTF-8?q?=E6=B5=81=E6=B3=A8=E8=A7=A3=E4=BB=8D=E7=84=B6=E7=94=9F=E6=95=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/CaptchaController.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 1a476a94a..0848170af 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.reflect.ReflectUtils; @@ -79,12 +80,21 @@ public class CaptchaController { * * @param email 邮箱 */ - @RateLimiter(key = "#email", time = 60, count = 1) @GetMapping("/resource/email/code") public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) { if (!mailProperties.getEnabled()) { return R.fail("当前系统没有开启邮箱功能!"); } + SpringUtils.getAopProxy(this).emailCodeImpl(email); + return R.ok(); + } + + /** + * 邮箱验证码 + * 独立方法避免验证码关闭之后仍然走限流 + */ + @RateLimiter(key = "#email", time = 60, count = 1) + public void emailCodeImpl(String email) { String key = GlobalConstants.CAPTCHA_CODE_KEY + email; String code = RandomUtil.randomNumbers(4); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); @@ -92,23 +102,30 @@ public class CaptchaController { MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。"); } catch (Exception e) { log.error("验证码短信发送异常 => {}", e.getMessage()); - return R.fail(e.getMessage()); + throw new ServiceException(e.getMessage()); } - return R.ok(); } /** * 生成验证码 */ - @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) @GetMapping("/auth/code") public R getCode() { - CaptchaVo captchaVo = new CaptchaVo(); boolean captchaEnabled = captchaProperties.getEnable(); if (!captchaEnabled) { + CaptchaVo captchaVo = new CaptchaVo(); captchaVo.setCaptchaEnabled(false); return R.ok(captchaVo); } + return R.ok(SpringUtils.getAopProxy(this).getCodeImpl()); + } + + /** + * 生成验证码 + * 独立方法避免验证码关闭之后仍然走限流 + */ + @RateLimiter(time = 60, count = 10, limitType = LimitType.IP) + public CaptchaVo getCodeImpl() { // 保存验证码信息 String uuid = IdUtil.simpleUUID(); String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; @@ -128,9 +145,10 @@ public class CaptchaController { code = exp.getValue(String.class); } RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + CaptchaVo captchaVo = new CaptchaVo(); captchaVo.setUuid(uuid); captchaVo.setImg(captcha.getImageBase64()); - return R.ok(captchaVo); + return captchaVo; } } From bfc73ed21445bfe1a5536c07c058b14315ef0fab 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: Thu, 13 Mar 2025 11:34:26 +0800 Subject: [PATCH 050/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B0=86?= =?UTF-8?q?crt=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=9B=BF=E6=8D=A2=E4=B8=BANetty?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=20=E8=8A=82=E7=BA=A617M=E6=89=93?= =?UTF-8?q?=E5=8C=85=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 ++++----- ruoyi-common/ruoyi-common-oss/pom.xml | 11 ++------ .../dromara/common/oss/core/OssClient.java | 28 +++++++++++++------ 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index 9742a21f2..45d4ece78 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,6 @@ 2.28.22 - 0.31.3 3.3.3 @@ -245,18 +244,18 @@ s3 ${aws.sdk.version} - - - software.amazon.awssdk.crt - aws-crt - ${aws.crt.version} - software.amazon.awssdk s3-transfer-manager ${aws.sdk.version} + + + software.amazon.awssdk + netty-nio-client + ${aws.sdk.version} + org.dromara.sms4j diff --git a/ruoyi-common/ruoyi-common-oss/pom.xml b/ruoyi-common/ruoyi-common-oss/pom.xml index 18d004f57..190dc5d46 100644 --- a/ruoyi-common/ruoyi-common-oss/pom.xml +++ b/ruoyi-common/ruoyi-common-oss/pom.xml @@ -31,11 +31,6 @@ software.amazon.awssdk s3 - - - software.amazon.awssdk - netty-nio-client - software.amazon.awssdk @@ -54,10 +49,10 @@ - + - software.amazon.awssdk.crt - aws-crt + software.amazon.awssdk + netty-nio-client diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java index e3b20dde3..41e74969d 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java @@ -16,10 +16,10 @@ import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.async.AsyncResponseTransformer; import software.amazon.awssdk.core.async.BlockingInputStreamAsyncRequestBody; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.S3Configuration; -import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.transfer.s3.S3TransferManager; @@ -84,18 +84,28 @@ public class OssClient { // MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问 boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE); - // 创建AWS基于 CRT 的 S3 客户端 - this.client = S3AsyncClient.crtBuilder() +// // 创建AWS基于 CRT 的 S3 客户端 +// this.client = S3AsyncClient.crtBuilder() +// .credentialsProvider(credentialsProvider) +// .endpointOverride(URI.create(getEndpoint())) +// .region(of()) +// .targetThroughputInGbps(20.0) +// .minimumPartSizeInBytes(10 * 1025 * 1024L) +// .checksumValidationEnabled(false) +// .forcePathStyle(isStyle) +// .httpConfiguration(S3CrtHttpConfiguration.builder() +// .connectionTimeout(Duration.ofSeconds(60)) // 设置连接超时 +// .build()) +// .build(); + + // 创建AWS基于 Netty 的 S3 客户端 + this.client = S3AsyncClient.builder() .credentialsProvider(credentialsProvider) .endpointOverride(URI.create(getEndpoint())) .region(of()) - .targetThroughputInGbps(20.0) - .minimumPartSizeInBytes(10 * 1025 * 1024L) - .checksumValidationEnabled(false) .forcePathStyle(isStyle) - .httpConfiguration(S3CrtHttpConfiguration.builder() - .connectionTimeout(Duration.ofSeconds(60)) // 设置连接超时 - .build()) + .httpClient(NettyNioAsyncHttpClient.builder() + .connectionTimeout(Duration.ofSeconds(60)).build()) .build(); //AWS基于 CRT 的 S3 AsyncClient 实例用作 S3 传输管理器的底层客户端 From 2de9397db8c7fbaa0b5aedeeb36389d8a7f64468 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: Thu, 13 Mar 2025 11:36:49 +0800 Subject: [PATCH 051/155] =?UTF-8?q?remove=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/oss/core/OssClient.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java index 41e74969d..7ac044c8e 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java @@ -84,20 +84,6 @@ public class OssClient { // MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问 boolean isStyle = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE); -// // 创建AWS基于 CRT 的 S3 客户端 -// this.client = S3AsyncClient.crtBuilder() -// .credentialsProvider(credentialsProvider) -// .endpointOverride(URI.create(getEndpoint())) -// .region(of()) -// .targetThroughputInGbps(20.0) -// .minimumPartSizeInBytes(10 * 1025 * 1024L) -// .checksumValidationEnabled(false) -// .forcePathStyle(isStyle) -// .httpConfiguration(S3CrtHttpConfiguration.builder() -// .connectionTimeout(Duration.ofSeconds(60)) // 设置连接超时 -// .build()) -// .build(); - // 创建AWS基于 Netty 的 S3 客户端 this.client = S3AsyncClient.builder() .credentialsProvider(credentialsProvider) From 4d8a45204c1fc50e041d7576dcd316bb999ec7fe 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: Thu, 13 Mar 2025 12:51:42 +0800 Subject: [PATCH 052/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E6=A0=91=E5=AF=B9=E5=BA=94=E5=89=8D=E7=AB=AF=E6=96=B0?= =?UTF-8?q?=E6=A0=91=E7=BB=93=E6=9E=84=E7=BC=BA=E5=B0=91=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/system/domain/SysDept.java | 9 +++++++++ .../java/org/dromara/system/domain/vo/SysDeptVo.java | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java index b94fd8a31..8252ed5e5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -1,5 +1,6 @@ package org.dromara.system.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @@ -8,6 +9,8 @@ import lombok.EqualsAndHashCode; import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; +import java.util.ArrayList; +import java.util.List; /** * 部门表 sys_dept @@ -80,4 +83,10 @@ public class SysDept extends TenantEntity { */ private String ancestors; + /** + * 子部门 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + } 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 c56fb09bc..24ae56476 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 @@ -2,15 +2,18 @@ package org.dromara.system.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysDept; -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; +import org.dromara.system.domain.SysMenu; import java.io.Serial; import java.io.Serializable; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** * 部门视图对象 sys_dept @@ -99,4 +102,9 @@ public class SysDeptVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; + /** + * 子部门 + */ + private List children = new ArrayList<>(); + } From 5fc76b64263c78c41e7b8bb9738a74ec0095c128 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: Thu, 13 Mar 2025 13:26:46 +0800 Subject: [PATCH 053/155] =?UTF-8?q?=E5=8F=91=E5=B8=83=205.3.1-BETA=20?= =?UTF-8?q?=E5=85=AC=E6=B5=8B=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/ruoyi-monitor-admin.run.xml | 2 +- .run/ruoyi-server.run.xml | 2 +- .run/ruoyi-snailjob-server.run.xml | 2 +- README.md | 2 +- pom.xml | 2 +- ruoyi-common/ruoyi-common-bom/pom.xml | 2 +- script/docker/docker-compose.yml | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml index c399b2967..4e0c21057 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 5dbde4ec4..bf72a8bae 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 e1e13fc6f..885007b07 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 fc3131a24..08832377e 100644 --- a/README.md +++ b/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)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0--BETA-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)]() diff --git a/pom.xml b/pom.xml index 45d4ece78..21d163bae 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ Dromara RuoYi-Vue-Plus多租户管理系统 - 5.3.0 + 5.3.1-BETA 3.4.3 UTF-8 UTF-8 diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 24acb086d..e82179891 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 5.3.0 + 5.3.1-BETA diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index 885c236ae..35979cb3a 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -98,7 +98,7 @@ services: network_mode: "host" ruoyi-server1: - image: ruoyi/ruoyi-server:5.3.0 + image: ruoyi/ruoyi-server:5.3.1-BETA container_name: ruoyi-server1 environment: # 时区上海 @@ -113,7 +113,7 @@ services: network_mode: "host" ruoyi-server2: - image: ruoyi/ruoyi-server:5.3.0 + image: ruoyi/ruoyi-server:5.3.1-BETA container_name: ruoyi-server2 environment: # 时区上海 @@ -128,7 +128,7 @@ services: network_mode: "host" ruoyi-monitor-admin: - image: ruoyi/ruoyi-monitor-admin:5.3.0 + image: ruoyi/ruoyi-monitor-admin:5.3.1-BETA container_name: ruoyi-monitor-admin environment: # 时区上海 @@ -140,7 +140,7 @@ services: network_mode: "host" ruoyi-snailjob-server: - image: ruoyi/ruoyi-snailjob-server:5.3.0 + image: ruoyi/ruoyi-snailjob-server:5.3.1-BETA container_name: ruoyi-snailjob-server environment: # 时区上海 From 384f9528e70e9a45aaca54f62a5b7beca6aa8838 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: Thu, 13 Mar 2025 13:39:36 +0800 Subject: [PATCH 054/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/system/domain/SysDept.java | 2 +- .../src/main/java/org/dromara/system/domain/vo/SysDeptVo.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java index 8252ed5e5..d436a1cfc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/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 children = new ArrayList<>(); + private List children = new ArrayList<>(); } 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 24ae56476..1f182a248 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 @@ -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 children = new ArrayList<>(); + private List children = new ArrayList<>(); } From 192537672e66a97cf9f65a764a671b86fd089ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E5=B0=8F=E9=A3=8E?= <13852492678@163.com> Date: Thu, 13 Mar 2025 07:37:22 +0000 Subject: [PATCH 055/155] =?UTF-8?q?!654=20update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=B3=A8=E9=87=8A=E4=BB=A5=E5=87=86=E7=A1=AE?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0SSE=E4=BC=9A=E8=AF=9D=20*=20update=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=87=BD=E6=95=B0=E6=B3=A8=E9=87=8A=E4=BB=A5?= =?UTF-8?q?=E5=87=86=E7=A1=AE=E6=8F=8F=E8=BF=B0SSE=E4=BC=9A=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/common/sse/utils/SseMessageUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java index 586103417..ce3aad472 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/utils/SseMessageUtils.java +++ b/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 要发送的消息内容 From 865627fdad325fe7df687e2173d2df82b9644560 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 13 Mar 2025 16:20:48 +0800 Subject: [PATCH 056/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=8A=82=E7=82=B9=E6=89=A9=E5=B1=95=E5=B1=9E=E6=80=A7?= =?UTF-8?q?,=E7=AE=80=E5=8C=96=E8=8A=82=E7=82=B9=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwNodeExtServiceImpl.java | 95 ++++++++----------- 1 file changed, 40 insertions(+), 55 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index 4d8368a85..2dc30607c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/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> 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,40 @@ public class FlwNodeExtServiceImpl implements NodeExtService { /** * 获取节点扩展属性 * - * @return 结果 + * @return 节点扩展属性列表 */ @Override public List getNodeExt() { List 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) { + private NodeExt buildNodeExt(String code, String name, int type, List 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>) clazz); + } else if (source instanceof String dictType) { + return buildChildNode(dictType); + } + return null; + }) .filter(ObjectUtil::isNotNull) .toList() ); @@ -101,52 +102,36 @@ 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> 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()) + .filter(NodeExtEnum.class::isInstance) + .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; From 800c6c8ff381d12cc555c9245e592f050ead71ac Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 13 Mar 2025 17:26:05 +0800 Subject: [PATCH 057/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=8A=9E=E7=90=86=E4=BA=BA=E6=A0=87=E8=AF=86?= =?UTF-8?q?=E7=AC=A6=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/FlwTaskAssigneeServiceImpl.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 5877bb503..1e0d17278 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/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 fetchUsersByStorageId(String storageId) { List list = new ArrayList<>(); + Map> 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(); } /** From 92e9ed771b801cee4a6981b7126dd529859254b2 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: Thu, 13 Mar 2025 17:47:03 +0800 Subject: [PATCH 058/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B9=A6=E5=86=99=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwNodeExtServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index 2dc30607c..231487d04 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -81,6 +81,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService { * @param sources 数据来源(枚举类或字典类型) * @return 构建的 `NodeExt` 对象 */ + @SuppressWarnings("unchecked cast") private NodeExt buildNodeExt(String code, String name, int type, List sources) { NodeExt nodeExt = new NodeExt(); nodeExt.setCode(code); @@ -89,7 +90,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService { nodeExt.setChilds(sources.stream() .map(source -> { if (source instanceof Class clazz && NodeExtEnum.class.isAssignableFrom(clazz)) { - return buildChildNode((Class>) clazz); + return buildChildNode((Class) clazz); } else if (source instanceof String dictType) { return buildChildNode(dictType); } @@ -107,7 +108,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService { * @param enumClass 枚举类,必须实现 `NodeExtEnum` 接口 * @return 构建的 `ChildNode` 对象 */ - private NodeExt.ChildNode buildChildNode(Class> enumClass) { + private NodeExt.ChildNode buildChildNode(Class enumClass) { if (!enumClass.isEnum()) { return null; } @@ -117,7 +118,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService { childNode.setCode(simpleName); // 字典,下拉框和复选框时用到 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()) From c79e053beaabc490051fcc98159a68866cb306d1 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 15 Mar 2025 22:53:31 +0800 Subject: [PATCH 059/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8leave6=E6=8F=90=E4=BA=A4=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TestLeaveServiceImpl.java | 2 +- script/leave/leave1.json | 14 +++++------ script/leave/leave2.json | 20 ++++++++-------- script/leave/leave3.json | 20 ++++++++-------- script/leave/leave4.json | 16 ++++++------- script/leave/leave5.json | 20 ++++++++-------- script/leave/leave6.json | 23 +++++++++++-------- 7 files changed, 59 insertions(+), 56 deletions(-) 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 a1ac84595..9ecd867ac 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 @@ -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; diff --git a/script/leave/leave1.json b/script/leave/leave1.json index 0cf67bc46..36fc32602 100644 --- a/script/leave/leave1.json +++ b/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" : "[]" } ] } \ No newline at end of file diff --git a/script/leave/leave2.json b/script/leave/leave2.json index 9fce8ffd2..bb196a314 100644 --- a/script/leave/leave2.json +++ b/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" } ] } ] -} +} \ No newline at end of file diff --git a/script/leave/leave3.json b/script/leave/leave3.json index 08daae4bf..d289c787a 100644 --- a/script/leave/leave3.json +++ b/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", diff --git a/script/leave/leave4.json b/script/leave/leave4.json index f8f440812..c085de2e5 100644 --- a/script/leave/leave4.json +++ b/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" : "[]" } ] } \ No newline at end of file diff --git a/script/leave/leave5.json b/script/leave/leave5.json index dc99494a5..76d10f180 100644 --- a/script/leave/leave5.json +++ b/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", diff --git a/script/leave/leave6.json b/script/leave/leave6.json index c0fb172ec..d21d9d2c8 100644 --- a/script/leave/leave6.json +++ b/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" : "[]" } ] -} \ No newline at end of file +} From 1f1564fad9e0c36fc02bde6daa9ace856ae9157e 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, 17 Mar 2025 09:32:32 +0800 Subject: [PATCH 060/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9oss=E6=9E=9A=E4=B8=BE=E5=8C=85=E5=90=8D=E4=B8=8E?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=A8=A1=E5=9D=97=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/common/oss/core/OssClient.java | 2 +- .../dromara/common/oss/{enumd => enums}/AccessPolicyType.java | 2 +- .../java/org/dromara/system/service/impl/SysOssServiceImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/{enumd => enums}/AccessPolicyType.java (96%) diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java index 7ac044c8e..de5119e91 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java +++ b/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; diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java similarity index 96% rename from ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java rename to ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enums/AccessPolicyType.java index a257bbae0..45b13beda 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/enumd/AccessPolicyType.java +++ b/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; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java index c2eb08c79..1f2bf80db 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java +++ b/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; From 97c36674e45d60ca1a9c2ff27724129b1c870856 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: Tue, 18 Mar 2025 13:44:35 +0800 Subject: [PATCH 061/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=89=93?= =?UTF-8?q?=E5=8C=85=E9=BB=98=E8=AE=A4=E8=B7=B3=E8=BF=87=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20=E5=87=8F=E5=B0=91=E5=BF=83=E6=99=BA=E9=9A=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 21d163bae..9d2ec8d1a 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,8 @@ 3.11.0 3.1.2 1.3.0 + + true From be5d69d5a50069adb91d103a453147db7a41093e 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: Tue, 18 Mar 2025 17:18:50 +0800 Subject: [PATCH 062/155] update snailjob 1.3.0 => 1.4.0-beta2 --- pom.xml | 2 +- .../src/main/resources/application-dev.yml | 11 - .../src/main/resources/application-prod.yml | 11 - script/sql/oracle/oracle_ry_job.sql | 257 ++++++------ script/sql/postgres/postgres_ry_job.sql | 246 ++++++------ script/sql/ry_job.sql | 125 +++--- script/sql/sqlserver/sqlserver_ry_job.sql | 377 +++++++++--------- 7 files changed, 515 insertions(+), 514 deletions(-) diff --git a/pom.xml b/pom.xml index 9d2ec8d1a..e887efd5c 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 3.44.0 2.2.7 4.3.1 - 1.3.0 + 1.4.0-beta2 1.4.6 0.2.0 1.18.36 diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml index 32a2cc4e3..caf5dba55 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml +++ b/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 --- # 监控中心配置 diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml index 32a2cc4e3..caf5dba55 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml +++ b/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 --- # 监控中心配置 diff --git a/script/sql/oracle/oracle_ry_job.sql b/script/sql/oracle/oracle_ry_job.sql index c2dbbfa52..104aabbaa 100644 --- a/script/sql/oracle/oracle_ry_job.sql +++ b/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); +ALTER TABLE sj_retry_dead_letter + ADD CONSTRAINT pk_sj_retry_dead_letter 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_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); -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.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 '死信队列表'; -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 +-- 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); +ALTER TABLE sj_retry + ADD CONSTRAINT pk_sj_retry PRIMARY KEY (id); -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); -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); +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_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 '任务表'; +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_log -CREATE TABLE sj_retry_task_log +-- 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); +ALTER TABLE sj_retry_task + ADD CONSTRAINT pk_sj_retry_task 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); +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_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 '任务日志基础信息表'; +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 '执行成功-日志数量'; diff --git a/script/sql/postgres/postgres_ry_job.sql b/script/sql/postgres/postgres_ry_job.sql index 1a08a9990..8b682dfe5 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: 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_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); -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.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 '死信队列表'; -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 +-- 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 UNIQUE INDEX uk_sj_retry_01 ON sj_retry (namespace_id, group_name, task_type, idempotent_id, deleted); -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); +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_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 '任务表'; +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_log -CREATE TABLE sj_retry_task_log +-- 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); +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_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 '任务日志基础信息表'; +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 '执行成功-日志数量'; diff --git a/script/sql/ry_job.sql b/script/sql/ry_job.sql index c6ec01b45..3577d6614 100644 --- a/script/sql/ry_job.sql +++ b/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 '描述', diff --git a/script/sql/sqlserver/sqlserver_ry_job.sql b/script/sql/sqlserver/sqlserver_ry_job.sql index 97addc3aa..5a0bbb39b 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: 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) +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_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name) +CREATE INDEX idx_sj_retry_dead_letter_02 ON sj_retry_dead_letter (idempotent_id) 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_03 ON sj_retry_dead_letter (biz_no) GO -CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (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) +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_02 ON sj_retry_task_log (retry_status) +CREATE INDEX idx_sj_retry_task_02 ON sj_retry_task (task_status) GO -CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id) +CREATE INDEX idx_sj_retry_task_03 ON sj_retry_task (create_dt) GO -CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id) -GO -CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no) -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' -GO - -EXEC sp_addextendedproperty - 'MS_Description', N'执行器名称', - 'SCHEMA', N'dbo', - 'TABLE', N'sj_retry_task_log', - 'COLUMN', N'executor_name' -GO - -EXEC sp_addextendedproperty - 'MS_Description', N'执行方法参数', - 'SCHEMA', N'dbo', - 'TABLE', N'sj_retry_task_log', - 'COLUMN', N'args_str' + 'TABLE', N'sj_retry_task', + 'COLUMN', N'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'ext_attrs' 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'task_status' GO EXEC sp_addextendedproperty 'MS_Description', N'任务类型 1、重试数据 2、回调数据', 'SCHEMA', N'dbo', - 'TABLE', N'sj_retry_task_log', + 'TABLE', N'sj_retry_task', 'COLUMN', N'task_type' GO +EXEC sp_addextendedproperty + 'MS_Description', N'操作原因', + 'SCHEMA', N'dbo', + 'TABLE', N'sj_retry_task', + 'COLUMN', N'operation_reason' +GO + +EXEC sp_addextendedproperty + 'MS_Description', N'客户端地址 clientId#ip:port', + 'SCHEMA', N'dbo', + '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' From d14ee599128ae4e2911d8b37676600f624960a24 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: Tue, 18 Mar 2025 17:25:01 +0800 Subject: [PATCH 063/155] update springboot-admin 3.4.2 => 3.4.5 update redisson 3.44.0 => 3.45.1 update sms4j 3.3.3 => 3.3.4 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e887efd5c..048f44e3f 100644 --- a/pom.xml +++ b/pom.xml @@ -27,8 +27,8 @@ 3.5.10.1 3.9.1 5.8.35 - 3.4.2 - 3.44.0 + 3.4.5 + 3.45.1 2.2.7 4.3.1 1.4.0-beta2 @@ -43,7 +43,7 @@ 2.28.22 - 3.3.3 + 3.3.4 1.2.83 From d4f792810e008fceddab871b14db1cb4b316c706 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, 19 Mar 2025 10:09:32 +0800 Subject: [PATCH 064/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=AE=80?= =?UTF-8?q?=E5=8C=96=20SysTaskAssigneeServiceImpl=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/domain/bo/SysDeptBo.java | 5 + .../system/service/ISysDeptService.java | 12 ++ .../service/impl/SysDeptServiceImpl.java | 26 ++++ .../impl/SysTaskAssigneeServiceImpl.java | 139 +++++++----------- 4 files changed, 93 insertions(+), 89 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index 5f64d6f30..0d8ac84b9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/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; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index bf16642fe..1397443cb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/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 selectPageDeptList(SysDeptBo dept, PageQuery pageQuery); + /** * 查询部门管理数据 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index ecd309f4e..98aad216b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/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 selectPageDeptList(SysDeptBo dept, PageQuery pageQuery) { + Page 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 deptList = baseMapper.selectListByParentId(parentId); + List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); + deptIds.add(parentId); + x.in(SysDept::getDeptId, deptIds); + }); + } return lqw; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java index 2fbf2408b..0a5f4b1d4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -1,32 +1,27 @@ 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 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 +32,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 +47,15 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { @Override public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - QueryWrapper 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 page = roleMapper.selectPageRoleList(pageQuery.build(), wrapper); + SysRoleBo bo = new SysRoleBo(); + bo.setRoleName(taskQuery.getHandlerCode()); + bo.setRoleKey(taskQuery.getHandlerName()); + Map params = bo.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + TableDataInfo page = roleService.selectPageRoleList(bo, pageQuery); // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), SysRoleVo::getRoleId, SysRoleVo::getRoleKey, SysRoleVo::getRoleName, null, SysRoleVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } @@ -75,24 +69,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { @Override public TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - LambdaQueryWrapper wrapper = Wrappers.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 deptList = deptMapper.selectListByParentId(belongDeptId); - List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); - deptIds.add(belongDeptId); - x.in(SysPost::getDeptId, deptIds); - }); - } - Page page = postMapper.selectPagePostList(pageQuery.build(), wrapper); + SysPostBo bo = new SysPostBo(); + bo.setPostCategory(taskQuery.getHandlerCode()); + bo.setPostName(taskQuery.getHandlerName()); + Map params = bo.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + bo.setBelongDeptId(Long.valueOf(taskQuery.getGroupId())); + TableDataInfo page = postService.selectPagePostList(bo, pageQuery); // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), SysPostVo::getPostId, SysPostVo::getPostCategory, SysPostVo::getPostName, SysPostVo::getDeptId, SysPostVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } @@ -106,30 +92,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { @Override public TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - LambdaQueryWrapper wrapper = Wrappers.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 deptList = deptMapper.selectListByParentId(parentId); - List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); - deptIds.add(parentId); - x.in(SysDept::getDeptId, deptIds); - }); - } - Page page = deptMapper.selectPageDeptList(pageQuery.build(), wrapper); + SysDeptBo bo = new SysDeptBo(); + bo.setDeptCategory(taskQuery.getHandlerCode()); + bo.setDeptName(taskQuery.getHandlerName()); + Map params = bo.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + bo.setBelongDeptId(Long.valueOf(taskQuery.getGroupId())); + TableDataInfo page = deptService.selectPageDeptList(bo, pageQuery); // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), SysDeptVo::getDeptId, SysDeptVo::getDeptCategory, SysDeptVo::getDeptName, SysDeptVo::getParentId, SysDeptVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } @@ -144,27 +116,16 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { @Override public TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); - QueryWrapper 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 deptList = deptMapper.selectListByParentId(parentId); - List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); - deptIds.add(parentId); - x.in("u.dept_id", deptIds); - }); - } - Page page = userMapper.selectPageUserList(pageQuery.build(), wrapper); + SysUserBo bo = new SysUserBo(); + bo.setUserName(taskQuery.getHandlerCode()); + bo.setNickName(taskQuery.getHandlerName()); + Map params = bo.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + bo.setDeptId(Long.valueOf(taskQuery.getGroupId())); + TableDataInfo page = userService.selectPageUserList(bo, pageQuery); // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRecords(), + List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), SysUserVo::getUserId, SysUserVo::getUserName, SysUserVo::getNickName, SysUserVo::getDeptId, SysUserVo::getCreateTime); return new TaskAssigneeDTO(page.getTotal(), handlers); } From bba163f7b487601ccd246953e5c35bdead410ed4 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, 19 Mar 2025 11:34:53 +0800 Subject: [PATCH 065/155] update warm-flow 1.6.7 => 1.6.8 --- pom.xml | 2 +- script/sql/oracle/oracle_ry_workflow.sql | 1 + script/sql/postgres/postgres_ry_workflow.sql | 2 ++ script/sql/ry_workflow.sql | 3 ++- script/sql/sqlserver/sqlserver_ry_workflow.sql | 2 ++ script/sql/update/oracle/update_5.3.0-5.3.1.sql | 1 + script/sql/update/postgres/update_5.3.0-5.3.1.sql | 1 + script/sql/update/sqlserver/update_5.3.0-5.3.1.sql | 3 +++ script/sql/update/update_5.3.0-5.3.1.sql | 1 + 9 files changed, 14 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 048f44e3f..281035978 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 8.7.2-20250101 - 1.6.7 + 1.6.8 3.2.2 diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index baecd91fa..d982f03ed 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/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); -- ---------------------------- -- 流程分类表 diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index 3fbd70f05..df3d41313 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/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'; diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 652f4c084..acc297ec5 100644 --- a/script/sql/ry_workflow.sql +++ b/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 ='流程用户表'; -- ---------------------------- diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql index f376e8485..96ea62ad3 100644 --- a/script/sql/sqlserver/sqlserver_ry_workflow.sql +++ b/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', diff --git a/script/sql/update/oracle/update_5.3.0-5.3.1.sql b/script/sql/update/oracle/update_5.3.0-5.3.1.sql index 143c909d3..09000fe2d 100644 --- a/script/sql/update/oracle/update_5.3.0-5.3.1.sql +++ b/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 '扩展属性'; diff --git a/script/sql/update/postgres/update_5.3.0-5.3.1.sql b/script/sql/update/postgres/update_5.3.0-5.3.1.sql index 31bf7465e..de5dd5681 100644 --- a/script/sql/update/postgres/update_5.3.0-5.3.1.sql +++ b/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 '扩展属性'; diff --git a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql b/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql index 8a22c00bb..50859deec 100644 --- a/script/sql/update/sqlserver/update_5.3.0-5.3.1.sql +++ b/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 diff --git a/script/sql/update/update_5.3.0-5.3.1.sql b/script/sql/update/update_5.3.0-5.3.1.sql index f1a0efd7b..f45cc4019 100644 --- a/script/sql/update/update_5.3.0-5.3.1.sql +++ b/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`; From 778096d1002da92788d964b79cc0c2b2221f061b Mon Sep 17 00:00:00 2001 From: guo83551218 <83551218@qq.com> Date: Wed, 19 Mar 2025 05:23:34 +0000 Subject: [PATCH 066/155] =?UTF-8?q?!658=20fix=20=E4=BF=AE=E5=A4=8Dpg?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=20=E5=BC=BA=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=8A=A5=E9=94=99=20*=20fix=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dpg=E6=95=B0=E6=8D=AE=E5=BA=93=20=E5=BC=BA=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=BD=AC=E6=8D=A2=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java | 2 +- .../org/dromara/workflow/service/impl/FlwTaskServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java index 385eb892b..12f0653ef 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java +++ b/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; /** * 流程变量 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 209073bdb..d93ba00ab 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 @@ -575,7 +575,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { */ @Override public List getNextNodeList(FlowNextNodeBo bo) { - String taskId = bo.getTaskId(); + Long taskId = bo.getTaskId(); Map variables = bo.getVariables(); Task task = taskService.getById(taskId); Instance instance = insService.getById(task.getInstanceId()); From 5e5d478cf24811f10870c8deb7880f660dfeda05 Mon Sep 17 00:00:00 2001 From: guo83551218 <83551218@qq.com> Date: Wed, 19 Mar 2025 06:50:24 +0000 Subject: [PATCH 067/155] =?UTF-8?q?!660=20fix=20=E4=BF=AE=E5=A4=8D=20pg?= =?UTF-8?q?=E5=BC=BA=E7=B1=BB=E5=9E=8B=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20*=20fix=20=E4=BF=AE=E5=A4=8D=20pg=E5=BC=BA=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwInstanceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index b5c943e90..3c0b59541 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/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 businessIds) { - List flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper().in(FlowInstance::getBusinessId, businessIds)); + List flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds,Convert::toStr))); if (CollUtil.isEmpty(flowInstances)) { log.warn("未找到对应的流程实例信息,无法执行删除操作。"); return false; From 33698ee448fa2e6caccec96953ffc907d2f7e034 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: Thu, 20 Mar 2025 16:53:15 +0800 Subject: [PATCH 068/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2id=20=E5=8F=82=E6=95=B0=E4=B8=BAnull=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/service/impl/SysTaskAssigneeServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java index 0a5f4b1d4..d4f2c0d4e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.convert.Convert; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; @@ -75,7 +76,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); - bo.setBelongDeptId(Long.valueOf(taskQuery.getGroupId())); + bo.setBelongDeptId(Convert.toLong(taskQuery.getGroupId())); TableDataInfo page = postService.selectPagePostList(bo, pageQuery); // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), @@ -98,7 +99,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); - bo.setBelongDeptId(Long.valueOf(taskQuery.getGroupId())); + bo.setBelongDeptId(Convert.toLong(taskQuery.getGroupId())); TableDataInfo page = deptService.selectPageDeptList(bo, pageQuery); // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), @@ -122,7 +123,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); - bo.setDeptId(Long.valueOf(taskQuery.getGroupId())); + bo.setDeptId(Convert.toLong(taskQuery.getGroupId())); TableDataInfo page = userService.selectPageUserList(bo, pageQuery); // 使用封装的字段映射方法进行转换 List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), From 5de1ffff9008fa949e175c8bbaf716268e58ef25 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: Fri, 21 Mar 2025 13:53:23 +0800 Subject: [PATCH 069/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20excel?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E4=B8=8B=E6=8B=89=E6=A1=86=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/excel/core/ExcelDownHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 32fee7a6c..e8752653f 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 @@ -16,6 +16,7 @@ import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.ss.util.WorkbookUtil; import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.dromara.common.core.domain.dto.DictDataDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.SpringUtils; @@ -102,9 +103,9 @@ public class ExcelDownHandler implements SheetWriteHandler { String converterExp = format.readConverterExp(); if (StringUtils.isNotBlank(dictType)) { // 如果传递了字典名,则依据字典建立下拉 - Collection values = Optional.ofNullable(dictService.getAllDictByDictType(dictType)) + Collection values = Optional.ofNullable(dictService.getDictData(dictType)) .orElseThrow(() -> new ServiceException(String.format("字典 %s 不存在", dictType))) - .values(); + .stream().map(DictDataDTO::getDictLabel).toList(); options = new ArrayList<>(values); } else if (StringUtils.isNotBlank(converterExp)) { // 如果指定了确切的值,则直接解析确切的值 From 0f95e9393d7ff3be1d5ea3960dfda5ac3feb59ed 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: Fri, 21 Mar 2025 13:55:38 +0800 Subject: [PATCH 070/155] update springboot 3.4.3 => 3.4.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 281035978..2c6e4f134 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ 5.3.1-BETA - 3.4.3 + 3.4.4 UTF-8 UTF-8 17 From 5626b97a19cd7c0415d3be560e8661c6e3ce14f5 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: Fri, 21 Mar 2025 14:42:58 +0800 Subject: [PATCH 071/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E8=80=81=E7=89=88=E6=9C=AC=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=94=A8=E6=88=B7=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/PlusDataPermissionHandler.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index a3547075b..6dee1214a 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/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)) { From c0eeafb5cdeb6026a74542641b1d9b0c2fc14a3d 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: Fri, 21 Mar 2025 15:14:54 +0800 Subject: [PATCH 072/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20excel?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=20=E4=B8=8B=E6=8B=89=E6=A1=86=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/excel/core/ExcelDownHandler.java | 5 ++--- .../system/service/impl/SysDictTypeServiceImpl.java | 12 +++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) 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 e8752653f..32fee7a6c 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 @@ -16,7 +16,6 @@ import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.ss.util.WorkbookUtil; import org.apache.poi.xssf.usermodel.XSSFDataValidation; -import org.dromara.common.core.domain.dto.DictDataDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.SpringUtils; @@ -103,9 +102,9 @@ public class ExcelDownHandler implements SheetWriteHandler { String converterExp = format.readConverterExp(); if (StringUtils.isNotBlank(dictType)) { // 如果传递了字典名,则依据字典建立下拉 - Collection values = Optional.ofNullable(dictService.getDictData(dictType)) + Collection values = Optional.ofNullable(dictService.getAllDictByDictType(dictType)) .orElseThrow(() -> new ServiceException(String.format("字典 %s 不存在", dictType))) - .stream().map(DictDataDTO::getDictLabel).toList(); + .values(); options = new ArrayList<>(values); } else if (StringUtils.isNotBlank(converterExp)) { // 如果指定了确切的值,则直接解析确切的值 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 1e5188c38..c417b42ca 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 @@ -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 getAllDictByDictType(String dictType) { List list = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); - return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + // 保证顺序 + LinkedHashMap map = new LinkedHashMap<>(); + for (SysDictDataVo vo : list) { + map.put(vo.getDictValue(), vo.getDictLabel()); + } + return map; } /** From fe40d7db32a8147c6d0dc2338675a4e779432df2 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: Fri, 21 Mar 2025 15:17:31 +0800 Subject: [PATCH 073/155] =?UTF-8?q?=E5=8F=91=E5=B8=83=205.3.1-BETA2=20?= =?UTF-8?q?=E5=85=AC=E6=B5=8B=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/ruoyi-monitor-admin.run.xml | 2 +- .run/ruoyi-server.run.xml | 2 +- .run/ruoyi-snailjob-server.run.xml | 2 +- README.md | 2 +- pom.xml | 2 +- ruoyi-common/ruoyi-common-bom/pom.xml | 2 +- script/docker/docker-compose.yml | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml index 4e0c21057..3b5b97b4d 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 bf72a8bae..dddc04057 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 885007b07..e48c539d2 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 08832377e..ca67c874a 100644 --- a/README.md +++ b/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)
-[![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)]() diff --git a/pom.xml b/pom.xml index 2c6e4f134..c99cbb252 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ Dromara RuoYi-Vue-Plus多租户管理系统 - 5.3.1-BETA + 5.3.1-BETA2 3.4.4 UTF-8 UTF-8 diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index e82179891..c8ea1ffa4 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 5.3.1-BETA + 5.3.1-BETA2 diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index 35979cb3a..cd5b567a3 100644 --- a/script/docker/docker-compose.yml +++ b/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: # 时区上海 From 4e62054bd1191e127a706f0e056698e645191410 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, 26 Mar 2025 14:30:25 +0800 Subject: [PATCH 074/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=B7=A8?= =?UTF-8?q?=E5=9F=9F=E6=9C=AA=E8=AE=BE=E7=BD=AE=E8=AF=B7=E6=B1=82=E5=A4=B4?= =?UTF-8?q?=E9=97=AE=E9=A2=98(cloud=E7=89=88=E6=9C=AC=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=20vue=E7=89=88=E6=9C=AC=E9=9C=80=E8=A6=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/encrypt/filter/EncryptResponseBodyWrapper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java index 7bbca49d0..78e06ff73 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/filter/EncryptResponseBodyWrapper.java @@ -76,9 +76,14 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey); // 设置响应头 + // vue版本需要设置 + servletResponse.addHeader("Access-Control-Expose-Headers", headerFlag); + servletResponse.setHeader("Access-Control-Allow-Origin", "*"); + servletResponse.setHeader("Access-Control-Allow-Methods", "*"); servletResponse.setHeader(headerFlag, encryptPassword); servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString()); + // 获取原始内容 String originalBody = this.getContent(); // 对内容进行加密 From 4d925a4d6229d2a52f7a517b8481b4fdfa9d9306 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, 26 Mar 2025 15:18:39 +0800 Subject: [PATCH 075/155] =?UTF-8?q?update=20mybatis-plus=203.5.10.1=20=3D>?= =?UTF-8?q?=203.5.11=20update=20snailjob=201.4.0-beta2=20=3D>=201.4.0=20?= =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- .../src/main/resources/application-dev.yml | 4 +--- .../src/main/resources/application-prod.yml | 4 +--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index c99cbb252..51e36eb12 100644 --- a/pom.xml +++ b/pom.xml @@ -24,14 +24,14 @@ 4.0.3 2.3 1.40.0 - 3.5.10.1 + 3.5.11 3.9.1 5.8.35 3.4.5 3.45.1 2.2.7 4.3.1 - 1.4.0-beta2 + 1.4.0 1.4.6 0.2.0 1.18.36 diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml index caf5dba55..aaf474895 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml @@ -22,10 +22,8 @@ snail-job: job-pull-page-size: 1000 # 服务器端口 server-port: 17888 - # 号段模式下步长配置 - step: 100 # 日志保存时间(单位: day) - log-storage: 90 + log-storage: 7 rpc-type: grpc --- # 监控中心配置 diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml index caf5dba55..aaf474895 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml @@ -22,10 +22,8 @@ snail-job: job-pull-page-size: 1000 # 服务器端口 server-port: 17888 - # 号段模式下步长配置 - step: 100 # 日志保存时间(单位: day) - log-storage: 90 + log-storage: 7 rpc-type: grpc --- # 监控中心配置 From c2f67b4a7795ab60db5f2b9d9f01bb898d7b8889 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: Thu, 27 Mar 2025 09:32:16 +0800 Subject: [PATCH 076/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E7=94=A8=E6=88=B7=E5=AF=86=E7=A0=81=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/domain/model/PasswordLoginBody.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java index 87d0e8e73..36e33b24b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/PasswordLoginBody.java @@ -18,14 +18,14 @@ public class PasswordLoginBody extends LoginBody { * 用户名 */ @NotBlank(message = "{user.username.not.blank}") - @Length(min = 2, max = 20, message = "{user.username.length.valid}") + @Length(min = 2, max = 30, message = "{user.username.length.valid}") private String username; /** * 用户密码 */ @NotBlank(message = "{user.password.not.blank}") - @Length(min = 5, max = 20, message = "{user.password.length.valid}") + @Length(min = 5, max = 30, message = "{user.password.length.valid}") private String password; } From 26abb987471340504ee0a7ea4cef9b3f2098b802 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: Thu, 27 Mar 2025 10:03:16 +0800 Subject: [PATCH 077/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20excel?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=87=BA=E6=95=B0=E6=8D=AE=E8=A2=AB?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/common/excel/utils/ExcelUtil.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index b22e6f987..0e9569677 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -245,9 +245,10 @@ public class ExcelUtil { .registerWriteHandler(new DataWriteHandler(data.get(0).getClass())) .build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 单表多数据导出 模板格式为 {.属性} for (T d : data) { - excelWriter.fill(d, writeSheet); + excelWriter.fill(d, fillConfig, writeSheet); } excelWriter.finish(); } @@ -320,7 +321,7 @@ public class ExcelUtil { // 多表导出必须使用 FillWrapper excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); } else { - excelWriter.fill(map.getValue(), writeSheet); + excelWriter.fill(map.getValue(), fillConfig, writeSheet); } } excelWriter.finish(); From 34031cae8decce479053f390431826e3f76359bc 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: Thu, 27 Mar 2025 10:38:48 +0800 Subject: [PATCH 078/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E7=94=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-extend/ruoyi-monitor-admin/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 77c9eb71a..538ffbd9f 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -59,9 +59,6 @@ org.springframework.boot spring-boot-maven-plugin ${spring-boot.version} - - - From 3761473967772f4accbd74756cbd990f2d945a9d 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: Thu, 27 Mar 2025 10:45:00 +0800 Subject: [PATCH 079/155] =?UTF-8?q?=F0=9F=90=B3=E5=8F=91=E5=B8=83=205.3.1?= =?UTF-8?q?=20=E6=AD=A3=E5=BC=8F=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/ruoyi-monitor-admin.run.xml | 2 +- .run/ruoyi-server.run.xml | 2 +- .run/ruoyi-snailjob-server.run.xml | 2 +- README.md | 2 +- pom.xml | 2 +- ruoyi-common/ruoyi-common-bom/pom.xml | 2 +- script/docker/docker-compose.yml | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml index 3b5b97b4d..065ff01a7 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 dddc04057..6c5031edb 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 e48c539d2..859902ac1 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 ca67c874a..fc3131a24 100644 --- a/README.md +++ b/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)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0--BETA2-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0-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)]() diff --git a/pom.xml b/pom.xml index 51e36eb12..f1362f2e3 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ Dromara RuoYi-Vue-Plus多租户管理系统 - 5.3.1-BETA2 + 5.3.1 3.4.4 UTF-8 UTF-8 diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index c8ea1ffa4..62967c30d 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 5.3.1-BETA2 + 5.3.1 diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index cd5b567a3..fb35cae6f 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -98,7 +98,7 @@ services: network_mode: "host" ruoyi-server1: - image: ruoyi/ruoyi-server:5.3.1-BETA2 + image: ruoyi/ruoyi-server:5.3.1 container_name: ruoyi-server1 environment: # 时区上海 @@ -113,7 +113,7 @@ services: network_mode: "host" ruoyi-server2: - image: ruoyi/ruoyi-server:5.3.1-BETA2 + image: ruoyi/ruoyi-server:5.3.1 container_name: ruoyi-server2 environment: # 时区上海 @@ -128,7 +128,7 @@ services: network_mode: "host" ruoyi-monitor-admin: - image: ruoyi/ruoyi-monitor-admin:5.3.1-BETA2 + image: ruoyi/ruoyi-monitor-admin:5.3.1 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-BETA2 + image: ruoyi/ruoyi-snailjob-server:5.3.1 container_name: ruoyi-snailjob-server environment: # 时区上海 From 16923cc86a036d3a53b152024275e6d1b498e1ba 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: Fri, 28 Mar 2025 22:51:32 +0800 Subject: [PATCH 080/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81excel=E6=96=B9=E6=B3=95=E6=8A=9B=E5=87=BAjson=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/excel/utils/ExcelUtil.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 0e9569677..5c5e5ccca 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -23,7 +23,6 @@ import org.dromara.common.excel.handler.DataWriteHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -84,7 +83,6 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { try { - resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, false, os, null); } catch (IOException e) { @@ -103,7 +101,6 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response, List options) { try { - resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, false, os, options); } catch (IOException e) { @@ -122,7 +119,6 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response) { try { - resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, merge, os, null); } catch (IOException e) { @@ -142,7 +138,6 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response, List options) { try { - resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, merge, os, options); } catch (IOException e) { @@ -186,6 +181,12 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, OutputStream os, List options) { + if (CollUtil.isEmpty(list)) { + throw new IllegalArgumentException("数据为空"); + } + if (os instanceof HttpServletResponse response) { + resetResponse(sheetName, response); + } ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) .autoCloseStream(false) // 自动适配 @@ -215,9 +216,8 @@ public class ExcelUtil { */ public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { try { - resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); - exportTemplate(data, templatePath, os); + exportTemplate(data, filename, templatePath, os); } catch (IOException e) { throw new RuntimeException("导出Excel异常"); } @@ -232,10 +232,13 @@ public class ExcelUtil { * @param data 模板需要的数据 * @param os 输出流 */ - public static void exportTemplate(List data, String templatePath, OutputStream os) { + public static void exportTemplate(List data, String filename, String templatePath, OutputStream os) { if (CollUtil.isEmpty(data)) { throw new IllegalArgumentException("数据为空"); } + if (os instanceof HttpServletResponse response) { + resetResponse(filename, response); + } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -267,7 +270,7 @@ public class ExcelUtil { try { resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); - exportTemplateMultiList(data, templatePath, os); + exportTemplateMultiList(data, filename, templatePath, os); } catch (IOException e) { throw new RuntimeException("导出Excel异常"); } @@ -285,9 +288,8 @@ public class ExcelUtil { */ public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { try { - resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); - exportTemplateMultiSheet(data, templatePath, os); + exportTemplateMultiSheet(data, filename, templatePath, os); } catch (IOException e) { throw new RuntimeException("导出Excel异常"); } @@ -302,10 +304,13 @@ public class ExcelUtil { * @param data 模板需要的数据 * @param os 输出流 */ - public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { + public static void exportTemplateMultiList(Map data, String filename, String templatePath, OutputStream os) { if (CollUtil.isEmpty(data)) { throw new IllegalArgumentException("数据为空"); } + if (os instanceof HttpServletResponse response) { + resetResponse(filename, response); + } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -336,10 +341,13 @@ public class ExcelUtil { * @param data 模板需要的数据 * @param os 输出流 */ - public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { + public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, OutputStream os) { if (CollUtil.isEmpty(data)) { throw new IllegalArgumentException("数据为空"); } + if (os instanceof HttpServletResponse response) { + resetResponse(filename, response); + } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -366,7 +374,7 @@ public class ExcelUtil { /** * 重置响应体 */ - private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { + private static void resetResponse(String sheetName, HttpServletResponse response) { String filename = encodingFilename(sheetName); FileUtils.setAttachmentResponseHeader(response, filename); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); From 7129ad4fac42e43980524f2942c6326b403481f5 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: Fri, 28 Mar 2025 23:11:11 +0800 Subject: [PATCH 081/155] =?UTF-8?q?Revert=20"update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20=E6=94=AF=E6=8C=81excel=E6=96=B9=E6=B3=95=E6=8A=9B=E5=87=BAj?= =?UTF-8?q?son=E5=BC=82=E5=B8=B8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 16923cc86a036d3a53b152024275e6d1b498e1ba. --- .../dromara/common/excel/utils/ExcelUtil.java | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 5c5e5ccca..0e9569677 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -23,6 +23,7 @@ import org.dromara.common.excel.handler.DataWriteHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -83,6 +84,7 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response) { try { + resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, false, os, null); } catch (IOException e) { @@ -101,6 +103,7 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, HttpServletResponse response, List options) { try { + resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, false, os, options); } catch (IOException e) { @@ -119,6 +122,7 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response) { try { + resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, merge, os, null); } catch (IOException e) { @@ -138,6 +142,7 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, HttpServletResponse response, List options) { try { + resetResponse(sheetName, response); ServletOutputStream os = response.getOutputStream(); exportExcel(list, sheetName, clazz, merge, os, options); } catch (IOException e) { @@ -181,12 +186,6 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, OutputStream os, List options) { - if (CollUtil.isEmpty(list)) { - throw new IllegalArgumentException("数据为空"); - } - if (os instanceof HttpServletResponse response) { - resetResponse(sheetName, response); - } ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) .autoCloseStream(false) // 自动适配 @@ -216,8 +215,9 @@ public class ExcelUtil { */ public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { try { + resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); - exportTemplate(data, filename, templatePath, os); + exportTemplate(data, templatePath, os); } catch (IOException e) { throw new RuntimeException("导出Excel异常"); } @@ -232,13 +232,10 @@ public class ExcelUtil { * @param data 模板需要的数据 * @param os 输出流 */ - public static void exportTemplate(List data, String filename, String templatePath, OutputStream os) { + public static void exportTemplate(List data, String templatePath, OutputStream os) { if (CollUtil.isEmpty(data)) { throw new IllegalArgumentException("数据为空"); } - if (os instanceof HttpServletResponse response) { - resetResponse(filename, response); - } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -270,7 +267,7 @@ public class ExcelUtil { try { resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); - exportTemplateMultiList(data, filename, templatePath, os); + exportTemplateMultiList(data, templatePath, os); } catch (IOException e) { throw new RuntimeException("导出Excel异常"); } @@ -288,8 +285,9 @@ public class ExcelUtil { */ public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { try { + resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); - exportTemplateMultiSheet(data, filename, templatePath, os); + exportTemplateMultiSheet(data, templatePath, os); } catch (IOException e) { throw new RuntimeException("导出Excel异常"); } @@ -304,13 +302,10 @@ public class ExcelUtil { * @param data 模板需要的数据 * @param os 输出流 */ - public static void exportTemplateMultiList(Map data, String filename, String templatePath, OutputStream os) { + public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { if (CollUtil.isEmpty(data)) { throw new IllegalArgumentException("数据为空"); } - if (os instanceof HttpServletResponse response) { - resetResponse(filename, response); - } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -341,13 +336,10 @@ public class ExcelUtil { * @param data 模板需要的数据 * @param os 输出流 */ - public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, OutputStream os) { + public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { if (CollUtil.isEmpty(data)) { throw new IllegalArgumentException("数据为空"); } - if (os instanceof HttpServletResponse response) { - resetResponse(filename, response); - } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -374,7 +366,7 @@ public class ExcelUtil { /** * 重置响应体 */ - private static void resetResponse(String sheetName, HttpServletResponse response) { + private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { String filename = encodingFilename(sheetName); FileUtils.setAttachmentResponseHeader(response, filename); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); From e71d6fa9837f74539ea6d943685668f75233d91b 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: Fri, 28 Mar 2025 23:12:40 +0800 Subject: [PATCH 082/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81excel=E6=96=B9=E6=B3=95=E6=8A=9B=E5=87=BAjson=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/excel/utils/ExcelUtil.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 0e9569677..70ab31d9c 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -215,6 +215,9 @@ public class ExcelUtil { */ public static void exportTemplate(List data, String filename, String templatePath, HttpServletResponse response) { try { + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); exportTemplate(data, templatePath, os); @@ -233,9 +236,6 @@ public class ExcelUtil { * @param os 输出流 */ public static void exportTemplate(List data, String templatePath, OutputStream os) { - if (CollUtil.isEmpty(data)) { - throw new IllegalArgumentException("数据为空"); - } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -265,6 +265,9 @@ public class ExcelUtil { */ public static void exportTemplateMultiList(Map data, String filename, String templatePath, HttpServletResponse response) { try { + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); exportTemplateMultiList(data, templatePath, os); @@ -285,6 +288,9 @@ public class ExcelUtil { */ public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { try { + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } resetResponse(filename, response); ServletOutputStream os = response.getOutputStream(); exportTemplateMultiSheet(data, templatePath, os); @@ -303,9 +309,6 @@ public class ExcelUtil { * @param os 输出流 */ public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { - if (CollUtil.isEmpty(data)) { - throw new IllegalArgumentException("数据为空"); - } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) @@ -337,9 +340,6 @@ public class ExcelUtil { * @param os 输出流 */ public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { - if (CollUtil.isEmpty(data)) { - throw new IllegalArgumentException("数据为空"); - } ClassPathResource templateResource = new ClassPathResource(templatePath); ExcelWriter excelWriter = EasyExcel.write(os) .withTemplate(templateResource.getStream()) From 124bcc4bba585d92007615309b95195f96566ca0 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, 31 Mar 2025 09:41:46 +0800 Subject: [PATCH 083/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B9=8B=E5=90=8E=20=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E5=AE=8C=E6=88=90=20=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/sse/core/SseEmitterManager.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 64dfcff37..ccf358ae3 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -39,14 +39,27 @@ public class SseEmitterManager { Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 - SseEmitter emitter = new SseEmitter(0L); - - emitters.put(token, emitter); + SseEmitter emitter = emitters.computeIfAbsent(token, k -> new SseEmitter(0L)); // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token - emitter.onCompletion(() -> emitters.remove(token)); - emitter.onTimeout(() -> emitters.remove(token)); - emitter.onError((e) -> emitters.remove(token)); + emitter.onCompletion(() -> { + SseEmitter remove = emitters.remove(token); + if (remove != null) { + remove.complete(); + } + }); + emitter.onTimeout(() -> { + SseEmitter remove = emitters.remove(token); + if (remove != null) { + remove.complete(); + } + }); + emitter.onError((e) -> { + SseEmitter remove = emitters.remove(token); + if (remove != null) { + remove.complete(); + } + }); try { // 向客户端发送一条连接成功的事件 @@ -106,7 +119,10 @@ public class SseEmitterManager { .name("message") .data(message)); } catch (Exception e) { - emitters.remove(entry.getKey()); + SseEmitter remove = emitters.remove(entry.getKey()); + if (remove != null) { + remove.complete(); + } } } } else { From 5868fadbf5de2142e895953a47c30ffdcf425bac 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, 31 Mar 2025 09:42:30 +0800 Subject: [PATCH 084/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B9=8B=E5=90=8E=20=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E5=AE=8C=E6=88=90=20=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index ccf358ae3..cb9442850 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -39,7 +39,9 @@ public class SseEmitterManager { Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 - SseEmitter emitter = emitters.computeIfAbsent(token, k -> new SseEmitter(0L)); + SseEmitter emitter = new SseEmitter(0L); + + emitters.put(token, emitter); // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token emitter.onCompletion(() -> { From 40eac0778959fa33da4dfa80cd930eb2af4ba35f 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, 31 Mar 2025 10:56:03 +0800 Subject: [PATCH 085/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20FlwNodeEx?= =?UTF-8?q?tServiceImpl=20=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwNodeExtServiceImpl.java | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index 231487d04..a6af73988 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -26,34 +26,16 @@ import java.util.*; @Service public class FlwNodeExtServiceImpl implements NodeExtService { - /** - * 权限页code - */ - private static final String PERMISSION_TAB = "wf_button_tab"; - - /** - * 权限页名称 - */ - private static final String PERMISSION_TAB_NAME = "权限"; - - /** - * 基础设置 - */ - private static final int TYPE_BASE_SETTING = 1; - - /** - * 新页签 - */ - private static final int TYPE_NEW_TAB = 2; - /** * 存储不同 dictType 对应的配置信息 */ - private static final Map> CHILD_NODE_MAP = new HashMap<>(); + private static final Map CHILD_NODE_MAP = new HashMap<>(); + + record ButtonPermission(String label, Integer type, Boolean must, Boolean multiple) {} static { CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getSimpleName(), - Map.of("label", "权限按钮", "type", 4, "must", false, "multiple", true)); + new ButtonPermission("权限按钮", 4, false, true)); } private final DictService dictService; @@ -67,8 +49,10 @@ public class FlwNodeExtServiceImpl implements NodeExtService { public List getNodeExt() { List nodeExtList = new ArrayList<>(); // 构建按钮权限页面 - nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB, + nodeExtList.add(buildNodeExt("wf_button_tab", "权限", 2, List.of(ButtonPermissionEnum.class))); + // 自定义构建 规则参考 NodeExt 与 warm-flow文档说明 + // nodeExtList.add(buildNodeExt("xxx_xxx", "xxx", 1, List); return nodeExtList; } @@ -160,15 +144,21 @@ public class FlwNodeExtServiceImpl implements NodeExtService { */ private NodeExt.ChildNode buildChildNodeMap(String key) { NodeExt.ChildNode childNode = new NodeExt.ChildNode(); - Map map = CHILD_NODE_MAP.get(key); + ButtonPermission bp = CHILD_NODE_MAP.get(key); + if (bp == null) { + childNode.setType(1); + childNode.setMust(false); + childNode.setMultiple(true); + return childNode; + } // label名称 - childNode.setLabel((String) map.get("label")); + childNode.setLabel(bp.label()); // 1:输入框 2:输入框 3:下拉框 4:选择框 - childNode.setType(Convert.toInt(map.get("type"), 1)); + childNode.setType(bp.type()); // 是否必填 - childNode.setMust(Convert.toBool(map.get("must"), false)); + childNode.setMust(bp.must()); // 是否多选 - childNode.setMultiple(Convert.toBool(map.get("multiple"), true)); + childNode.setMultiple(bp.multiple()); return childNode; } From 7c3f3523ea0d8f46c25e5879b0d5ba96c3a128a2 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, 31 Mar 2025 11:31:05 +0800 Subject: [PATCH 086/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20record=20=E7=AE=80=E5=8C=96vo=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/monitor/CacheController.java | 13 ++++----- .../controller/system/SysMenuController.java | 16 +++++----- .../system/SysProfileController.java | 18 ++++++------ .../controller/system/SysRoleController.java | 11 ++++--- .../dromara/system/domain/vo/AvatarVo.java | 18 ------------ .../system/domain/vo/CacheListInfoVo.java | 23 --------------- .../system/domain/vo/DeptTreeSelectVo.java | 26 ----------------- .../system/domain/vo/MenuTreeSelectVo.java | 26 ----------------- .../dromara/system/domain/vo/ProfileVo.java | 29 ------------------- 9 files changed, 31 insertions(+), 149 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java index 6b7499ace..1e9c6558b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -1,10 +1,9 @@ package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; -import org.dromara.system.domain.vo.CacheListInfoVo; -import lombok.RequiredArgsConstructor; import org.redisson.spring.data.connection.RedissonConnectionFactory; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.web.bind.annotation.GetMapping; @@ -45,11 +44,11 @@ public class CacheController { }); } - CacheListInfoVo infoVo = new CacheListInfoVo(); - infoVo.setInfo(connection.commands().info()); - infoVo.setDbSize(connection.commands().dbSize()); - infoVo.setCommandStats(pieList); - return R.ok(infoVo); + return R.ok(new CacheListInfoVo( + connection.commands().info(), + connection.commands().dbSize(), pieList)); } + public record CacheListInfoVo(Properties info, Long dbSize, List> commandStats) {} + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index d8cd335ce..a6c3e115e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -15,7 +15,6 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.SysMenu; import org.dromara.system.domain.bo.SysMenuBo; -import org.dromara.system.domain.vo.MenuTreeSelectVo; import org.dromara.system.domain.vo.RouterVo; import org.dromara.system.domain.vo.SysMenuVo; import org.dromara.system.service.ISysMenuService; @@ -96,9 +95,9 @@ public class SysMenuController extends BaseController { @GetMapping(value = "/roleMenuTreeselect/{roleId}") public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { List menus = menuService.selectMenuList(LoginHelper.getUserId()); - MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); - selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); - selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo( + menuService.selectMenuListByRoleId(roleId), + menuService.buildMenuTreeSelect(menus)); return R.ok(selectVo); } @@ -112,9 +111,9 @@ public class SysMenuController extends BaseController { @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { List menus = menuService.selectMenuList(LoginHelper.getUserId()); - MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); - selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); - selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo( + menuService.selectMenuListByPackageId(packageId), + menuService.buildMenuTreeSelect(menus)); return R.ok(selectVo); } @@ -171,4 +170,7 @@ public class SysMenuController extends BaseController { return toAjax(menuService.deleteMenuById(menuId)); } + public record MenuTreeSelectVo(List checkedKeys, List> menus) { + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 5f187cb91..7a6bc2c1d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -17,8 +17,6 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.bo.SysUserPasswordBo; import org.dromara.system.domain.bo.SysUserProfileBo; -import org.dromara.system.domain.vo.AvatarVo; -import org.dromara.system.domain.vo.ProfileVo; import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysOssService; @@ -50,10 +48,9 @@ public class SysProfileController extends BaseController { @GetMapping public R profile() { SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); - ProfileVo profileVo = new ProfileVo(); - profileVo.setUser(user); - profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserId())); - profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserId())); + String roleGroup = userService.selectUserRoleGroup(user.getUserId()); + String postGroup = userService.selectUserPostGroup(user.getUserId()); + ProfileVo profileVo = new ProfileVo(user, roleGroup, postGroup); return R.ok(profileVo); } @@ -123,11 +120,14 @@ public class SysProfileController extends BaseController { String avatar = oss.getUrl(); boolean updateSuccess = DataPermissionHelper.ignore(() -> userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())); if (updateSuccess) { - AvatarVo avatarVo = new AvatarVo(); - avatarVo.setImgUrl(avatar); - return R.ok(avatarVo); + return R.ok(new AvatarVo(avatar)); } } return R.fail("上传图片异常,请联系管理员"); } + + public record AvatarVo(String imgUrl) {} + + public record ProfileVo(SysUserVo user, String roleGroup, String postGroup) {} + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index d4a9dc8a4..e6afa3c07 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -1,6 +1,7 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.lang.tree.Tree; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; @@ -14,7 +15,6 @@ import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.bo.SysRoleBo; import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.DeptTreeSelectVo; import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysDeptService; @@ -221,9 +221,12 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:list") @GetMapping(value = "/deptTree/{roleId}") public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { - DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); - selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); - selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); + DeptTreeSelectVo selectVo = new DeptTreeSelectVo( + deptService.selectDeptListByRoleId(roleId), + deptService.selectDeptTreeList(new SysDeptBo())); return R.ok(selectVo); } + + public record DeptTreeSelectVo(List checkedKeys, List> depts) {} + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java deleted file mode 100644 index 46c020b7c..000000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -/** - * 用户头像信息 - * - * @author Michelle.Chung - */ -@Data -public class AvatarVo { - - /** - * 头像地址 - */ - private String imgUrl; - -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java deleted file mode 100644 index f827cba04..000000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * 缓存监控列表信息 - * - * @author Michelle.Chung - */ -@Data -public class CacheListInfoVo { - - private Properties info; - - private Long dbSize; - - private List> commandStats; - -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java deleted file mode 100644 index 6f7db2869..000000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.dromara.system.domain.vo; - -import cn.hutool.core.lang.tree.Tree; -import lombok.Data; - -import java.util.List; - -/** - * 角色部门列表树信息 - * - * @author Michelle.Chung - */ -@Data -public class DeptTreeSelectVo { - - /** - * 选中部门列表 - */ - private List checkedKeys; - - /** - * 下拉树结构列表 - */ - private List> depts; - -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java deleted file mode 100644 index 072453853..000000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.dromara.system.domain.vo; - -import cn.hutool.core.lang.tree.Tree; -import lombok.Data; - -import java.util.List; - -/** - * 角色菜单列表树信息 - * - * @author Michelle.Chung - */ -@Data -public class MenuTreeSelectVo { - - /** - * 选中菜单列表 - */ - private List checkedKeys; - - /** - * 菜单下拉树结构列表 - */ - private List> menus; - -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java deleted file mode 100644 index c0476519d..000000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dromara.system.domain.vo; - -import lombok.Data; - -/** - * 用户个人信息 - * - * @author Michelle.Chung - */ -@Data -public class ProfileVo { - - /** - * 用户信息 - */ - private SysUserVo user; - - /** - * 用户所属角色组 - */ - private String roleGroup; - - /** - * 用户所属岗位组 - */ - private String postGroup; - - -} From 9e551a0b2ab566363363c6c9ee9c76d596b5f5a6 Mon Sep 17 00:00:00 2001 From: Binary Date: Tue, 1 Apr 2025 06:29:08 +0000 Subject: [PATCH 087/155] =?UTF-8?q?!665=20admin=20Dockerfile=20=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=96=87=E4=BB=B6=E6=96=B0=E5=A2=9E=E6=9A=B4=E9=9C=B2?= =?UTF-8?q?=20snail=20job=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=20=E7=94=A8=E4=BA=8E=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83=E9=80=9A=E4=BF=A1=20*=20ad?= =?UTF-8?q?min=20Dockerfile=20=E6=9E=84=E5=BB=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9A=B4=E9=9C=B2=20snail=20job=20=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=AB=AF=E5=8F=A3=20=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile index b489ab57c..a3a66756f 100644 --- a/ruoyi-admin/Dockerfile +++ b/ruoyi-admin/Dockerfile @@ -11,9 +11,11 @@ RUN mkdir -p /ruoyi/server/logs \ WORKDIR /ruoyi/server -ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" +ENV SERVER_PORT=8080 SNAIL_PORT=28080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE ${SERVER_PORT} +# 暴露 snail job 客户端端口 用于定时任务调度中心通信 +EXPOSE ${SNAIL_PORT} ADD ./target/ruoyi-admin.jar ./app.jar # 工作流字体文件 @@ -22,6 +24,7 @@ ADD ./zhFonts/ /usr/share/fonts/zhFonts/ SHELL ["/bin/bash", "-c"] ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ + -Dsnail-job.port=${SNAIL_PORT} \ # 应用名称 如果想区分集群节点监控 改成不同的名称即可 #-Dskywalking.agent.service_name=ruoyi-server \ #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \ From 023ceaaf91447ca5b853392b91c131e7a21f28af Mon Sep 17 00:00:00 2001 From: velenooo <8834950+velenooo@user.noreply.gitee.com> Date: Wed, 2 Apr 2025 05:20:53 +0000 Subject: [PATCH 088/155] =?UTF-8?q?!666=20fix:=20=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=A4=9A=E4=B8=AA=E5=AD=97=E6=AE=B5=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E5=80=BC=E8=B6=85=E8=BF=87100=E4=B8=AA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=EF=BC=8C=E9=87=87=E7=94=A8=E5=A4=9A=E4=B8=AAsheet?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=A1=88=E8=A7=A3=E5=86=B3=E3=80=82=20*=20fi?= =?UTF-8?q?x:=20=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=87=BA=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8B=E6=8B=89=E5=80=BC=E8=B6=85=E8=BF=87?= =?UTF-8?q?100=E4=B8=AA=E5=BC=82=E5=B8=B8=EF=BC=8C=E9=87=87=E7=94=A8?= =?UTF-8?q?=E5=A4=9A=E4=B8=AAsheet=E7=9A=84=E6=96=B9=E6=A1=88=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/excel/core/ExcelDownHandler.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) 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 32fee7a6c..d10ec70e6 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 @@ -291,9 +291,11 @@ public class ExcelDownHandler implements SheetWriteHandler { * @param value 下拉选可选值 */ private void dropDownWithSheet(DataValidationHelper helper, Workbook workbook, Sheet sheet, Integer celIndex, List value) { + //由于poi的写出相关问题,超过100个会被临时写进硬盘,导致后续内存合并会出Attempting to write a row[] in the range [] that is already written to disk + String tmpOptionsSheetName = OPTIONS_SHEET_NAME + "_" + currentOptionsColumnIndex; // 创建下拉数据表 - Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))) - .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(OPTIONS_SHEET_NAME))); + Sheet simpleDataSheet = Optional.ofNullable(workbook.getSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName))) + .orElseGet(() -> workbook.createSheet(WorkbookUtil.createSafeSheetName(tmpOptionsSheetName))); // 将下拉表隐藏 workbook.setSheetHidden(workbook.getSheetIndex(simpleDataSheet), true); // 完善纵向的一级选项数据表 @@ -302,9 +304,9 @@ public class ExcelDownHandler implements SheetWriteHandler { // 获取每一选项行,如果没有则创建 Row row = Optional.ofNullable(simpleDataSheet.getRow(i)) .orElseGet(() -> simpleDataSheet.createRow(finalI)); - // 获取本级选项对应的选项列,如果没有则创建 - Cell cell = Optional.ofNullable(row.getCell(currentOptionsColumnIndex)) - .orElseGet(() -> row.createCell(currentOptionsColumnIndex)); + // 获取本级选项对应的选项列,如果没有则创建。上述采用多个sheet,默认索引为1列 + Cell cell = Optional.ofNullable(row.getCell(0)) + .orElseGet(() -> row.createCell(0)); // 设置值 cell.setCellValue(value.get(i)); } @@ -312,13 +314,13 @@ public class ExcelDownHandler implements SheetWriteHandler { // 创建名称管理器 Name name = workbook.createName(); // 设置名称管理器的别名 - String nameName = String.format("%s_%d", OPTIONS_SHEET_NAME, celIndex); + String nameName = String.format("%s_%d", tmpOptionsSheetName, celIndex); name.setNameName(nameName); // 以纵向第一列创建一级下拉拼接引用位置 String function = String.format("%s!$%s$1:$%s$%d", - OPTIONS_SHEET_NAME, - getExcelColumnName(currentOptionsColumnIndex), - getExcelColumnName(currentOptionsColumnIndex), + tmpOptionsSheetName, + getExcelColumnName(0), + getExcelColumnName(0), value.size()); // 设置名称管理器的引用位置 name.setRefersToFormula(function); From 07fdc240d78cebe5360404b65b6e4c3997cfecb4 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, 2 Apr 2025 14:04:41 +0800 Subject: [PATCH 089/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=9C=A8?= =?UTF-8?q?=E7=BA=BF=E7=94=A8=E6=88=B7=E8=AE=BE=E7=BD=AE=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8E=E5=AE=A2=E6=88=B7=E7=AB=AF=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/web/listener/UserActionListener.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 07595e092..86d26edf7 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 @@ -1,6 +1,5 @@ package org.dromara.web.listener; -import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; @@ -35,7 +34,6 @@ import java.time.Duration; @Slf4j public class UserActionListener implements SaTokenListener { - private final SaTokenConfig tokenConfig; private final SysLoginService loginService; /** @@ -59,10 +57,10 @@ public class UserActionListener implements SaTokenListener { dto.setDeviceType(loginModel.getDevice()); dto.setDeptName((String) loginModel.getExtra(LoginHelper.DEPT_NAME_KEY)); TenantHelper.dynamic(tenantId, () -> { - if(tokenConfig.getTimeout() == -1) { + if(loginModel.getTimeout() == -1) { RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); } else { - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout())); + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginModel.getTimeout())); } }); // 记录登录日志 From 8e99dd306a3635d5410897de5138231b535fcc68 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Wed, 2 Apr 2025 21:03:58 +0800 Subject: [PATCH 090/155] =?UTF-8?q?https://gitee.com/dromara/RuoYi-Vue-Plu?= =?UTF-8?q?s/issues/IBYCY7=20fix=20=E4=BF=AE=E5=A4=8D=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E4=BC=9A=E7=AD=BE=E4=BA=BA=E5=91=98=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E4=BC=9A=E7=AD=BE=E5=AE=A1=E6=89=B9=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E4=BB=BB=E5=8A=A1=E7=9A=84=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E4=BA=BA=E9=83=BD=E6=98=AF=E9=80=89=E6=8B=A9=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwTaskServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 d93ba00ab..990c32383 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 @@ -183,7 +183,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 消息通知 flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); //设置下一环节处理人 - setNextHandler(ins.getId()); + setNextHandler(ins.getId(), completeTaskBo.getAssigneeMap()); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -194,9 +194,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { /** * 设置下一环节处理人 * - * @param instanceId 实例ID + * @param instanceId 实例ID + * @param assigneeMap 办理人 */ - private void setNextHandler(Long instanceId) { + private void setNextHandler(Long instanceId, Map assigneeMap) { + if (CollUtil.isEmpty(assigneeMap)) { + return; + } Instance inst = insService.getById(instanceId); List flowTaskList = selectByInstId(instanceId); Map variableMap = inst.getVariableMap(); From 5bf901cdcd05e02d5cb513fa31575f0f7b4fc59d 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: Thu, 3 Apr 2025 13:34:41 +0800 Subject: [PATCH 091/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0api=E5=AE=A1=E6=89=B9=E7=AE=80=E5=8C=96=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/WorkflowService.java | 11 ++++++++++- .../service/impl/WorkflowServiceImpl.java | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java index abbcbff19..9d1a90195 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/WorkflowService.java @@ -78,9 +78,18 @@ public interface WorkflowService { /** * 办理任务 + * 系统后台发起审批 无用户信息 需要忽略权限 + * completeTask.getVariables().put("ignore", true); * * @param completeTask 参数 - * @return 结果 */ boolean completeTask(CompleteTaskDTO completeTask); + + /** + * 办理任务 + * + * @param taskId 任务ID + * @param message 办理意见 + */ + boolean completeTask(Long taskId, String message); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java index f8a20b5b4..0c0224000 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowServiceImpl.java @@ -122,6 +122,8 @@ public class WorkflowServiceImpl implements WorkflowService { /** * 办理任务 + * 系统后台发起审批 无用户信息 需要忽略权限 + * completeTask.getVariables().put("ignore", true); * * @param completeTask 参数 */ @@ -129,4 +131,21 @@ public class WorkflowServiceImpl implements WorkflowService { public boolean completeTask(CompleteTaskDTO completeTask) { return flwTaskService.completeTask(BeanUtil.toBean(completeTask, CompleteTaskBo.class)); } + + /** + * 办理任务 + * + * @param taskId 任务ID + * @param message 办理意见 + */ + @Override + public boolean completeTask(Long taskId, String message) { + CompleteTaskBo completeTask = new CompleteTaskBo(); + completeTask.setTaskId(taskId); + completeTask.setMessage(message); + // 忽略权限(系统后台发起审批 无用户信息 需要忽略权限) + completeTask.getVariables().put("ignore", true); + return flwTaskService.completeTask(completeTask); + } + } From 48d3ef9818eafc150d818aa0e6957fe0aa0238cc 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: Tue, 8 Apr 2025 10:16:20 +0800 Subject: [PATCH 092/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=A0=A1=E9=AA=8C=E6=B3=A8=E8=A7=A3=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/domain/model/RegisterBody.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java index 6ea8a764a..cced26b2b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java @@ -18,14 +18,14 @@ public class RegisterBody extends LoginBody { * 用户名 */ @NotBlank(message = "{user.username.not.blank}") - @Length(min = 2, max = 20, message = "{user.username.length.valid}") + @Length(min = 2, max = 30, message = "{user.username.length.valid}") private String username; /** * 用户密码 */ @NotBlank(message = "{user.password.not.blank}") - @Length(min = 5, max = 20, message = "{user.password.length.valid}") + @Length(min = 5, max = 30, message = "{user.password.length.valid}") private String password; private String userType; From ef39ad710713139c63e945f459f04012e2faf7c3 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: Tue, 8 Apr 2025 10:16:31 +0800 Subject: [PATCH 093/155] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0=E8=B5=9E?= =?UTF-8?q?=E5=8A=A9=E5=95=86?= 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 fc3131a24..a37615025 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
数舵科技 软件定制开发APP小程序等 - http://www.shuduokeji.com/
引迈信息 软件开发平台 - https://www.jnpfsoft.com/index.html?from=plus-doc
**启山商城系统 多租户商城源码可免费商用可二次开发 - https://www.73app.cn/**
+Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11
[如何成为赞助商 加群联系作者详谈](https://plus-doc.dromara.org/#/common/add_group) # 本框架与RuoYi的功能差异 From c37b92978a54e03899970fd8c045dceefb43727f 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, 9 Apr 2025 10:23:59 +0800 Subject: [PATCH 094/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=20=E5=88=A0=E9=99=A4=E4=B8=8D=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF=E7=9A=84=E4=B8=9C=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 3 --- .../java/org/dromara/common/doc/config/SpringDocConfig.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index c15d89c02..ee059dc3c 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -177,9 +177,6 @@ springdoc: api-docs: # 是否开启接口文档 enabled: true -# swagger-ui: -# # 持久化认证数据 -# persistAuthorization: true info: # 标题 title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档' diff --git a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java index 069ef9ac8..c199015c0 100644 --- a/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java +++ b/ruoyi-common/ruoyi-common-doc/src/main/java/org/dromara/common/doc/config/SpringDocConfig.java @@ -30,7 +30,7 @@ import java.util.Optional; import java.util.Set; /** - * Swagger 文档配置 + * 接口文档配置 * * @author Lion Li */ From 70aa14ecf846e442b43ed2d01a8144816ba863d2 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 9 Apr 2025 10:35:08 +0800 Subject: [PATCH 095/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=8A=9E=E7=90=86=E4=BA=BA=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/WorkflowPermissionHandler.java | 33 ++----------------- 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index c18e4ed52..53dbd20ed 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -1,22 +1,16 @@ package org.dromara.workflow.handler; -import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskAssigneeEnum; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.handler.PermissionHandler; import org.dromara.warm.flow.core.service.impl.TaskServiceImpl; +import org.dromara.workflow.common.ConditionalOnEnable; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Collection; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * 办理人权限处理器 @@ -36,28 +30,7 @@ public class WorkflowPermissionHandler implements PermissionHandler { */ @Override public List permissions() { - LoginUser loginUser = LoginHelper.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - return new ArrayList<>(); - } - // 使用一个流来构建权限列表 - return Stream.of( - // 角色权限前缀 - loginUser.getRoles().stream() - .map(role -> TaskAssigneeEnum.ROLE.getCode() + role.getRoleId()), - - // 岗位权限前缀 - Stream.ofNullable(loginUser.getPosts()) - .flatMap(Collection::stream) - .map(post -> TaskAssigneeEnum.POST.getCode() + post.getPostId()), - - // 用户和部门权限 - Stream.of(String.valueOf(loginUser.getUserId()), - TaskAssigneeEnum.DEPT.getCode() + loginUser.getDeptId() - ) - ) - .flatMap(stream -> stream) - .collect(Collectors.toList()); + return Collections.singletonList(LoginHelper.getUserIdStr()); } /** From b50904c6ff79efdf052504edc93a7abab6b5d09a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 9 Apr 2025 10:57:29 +0800 Subject: [PATCH 096/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E6=B5=81=E7=A8=8B=E7=9B=91=E5=90=AC=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=8A=82=E7=82=B9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/event/ProcessCreateTaskEvent.java | 12 +++++++- .../core/domain/event/ProcessEvent.java | 17 ++++++++++- .../handler/FlowProcessEventHandler.java | 28 +++++++++++++++---- .../listener/WorkflowGlobalListener.java | 18 ++++++------ .../service/impl/FlwTaskServiceImpl.java | 3 +- 5 files changed, 60 insertions(+), 18 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 05047ab84..d603884d1 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 @@ -27,10 +27,20 @@ public class ProcessCreateTaskEvent implements Serializable { private String flowCode; /** - * 审批节点编码 + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程节点编码 */ private String nodeCode; + /** + * 流程节点名称 + */ + private String nodeName; + /** * 任务id */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index 6329b9c01..bc7b78065 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -33,7 +33,22 @@ public class ProcessEvent implements Serializable { private String businessId; /** - * 状态 + * 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + */ + private Integer nodeType; + + /** + * 流程节点编码 + */ + private String nodeCode; + + /** + * 流程节点名称 + */ + private String nodeName; + + /** + * 流程状态 */ 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 3efc52da8..eec27369d 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 @@ -27,16 +27,27 @@ public class FlowProcessEventHandler { * * @param flowCode 流程定义编码 * @param businessId 业务id - * @param status 状态 + * @param nodeType 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + * @param nodeCode 流程节点编码 + * @param nodeName 流程节点名称 + * @param status 流程状态 + * @param params 办理参数 * @param submit 当为true时为申请人节点办理 */ - public void processHandler(String flowCode, String businessId, String status, Map params, boolean submit) { + public void processHandler(String flowCode, String businessId, Integer nodeType, String nodeCode, String nodeName, + String status, Map params, boolean submit) { + String tenantId = TenantHelper.getTenantId(); - log.info("发布流程事件,租户ID: {}, 流程状态: {}, 流程编码: {}, 业务ID: {}, 是否申请人节点办理: {}", tenantId, status, flowCode, businessId, submit); + log.info("【流程事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}", + tenantId, flowCode, businessId, status, nodeType, nodeCode, nodeName, submit, params); + ProcessEvent processEvent = new ProcessEvent(); processEvent.setTenantId(tenantId); processEvent.setFlowCode(flowCode); processEvent.setBusinessId(businessId); + processEvent.setNodeType(nodeType); + processEvent.setNodeCode(nodeCode); + processEvent.setNodeName(nodeName); processEvent.setStatus(status); processEvent.setParams(params); processEvent.setSubmit(submit); @@ -47,17 +58,22 @@ public class FlowProcessEventHandler { * 执行创建任务监听 * * @param flowCode 流程定义编码 - * @param nodeCode 审批节点编码 + * @param nodeType 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + * @param nodeCode 流程节点编码 + * @param nodeName 流程节点名称 * @param taskId 任务id * @param businessId 业务id */ - public void processCreateTaskHandler(String flowCode, String nodeCode, Long taskId, String businessId) { + public void processCreateTaskHandler(String flowCode, Integer nodeType, String nodeCode, String nodeName, Long taskId, String businessId) { String tenantId = TenantHelper.getTenantId(); - log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点编码: {}, 任务ID: {}, 业务ID: {}", tenantId, flowCode, nodeCode, taskId, businessId); + log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}, 业务ID: {}", + tenantId, flowCode, nodeType, nodeCode, nodeName, taskId, businessId); ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent(); processCreateTaskEvent.setTenantId(tenantId); processCreateTaskEvent.setFlowCode(flowCode); + processCreateTaskEvent.setNodeType(nodeType); processCreateTaskEvent.setNodeCode(nodeCode); + processCreateTaskEvent.setNodeName(nodeName); processCreateTaskEvent.setTaskId(taskId); processCreateTaskEvent.setBusinessId(businessId); 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 272f9de92..6f435693e 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,8 @@ public class WorkflowGlobalListener implements GlobalListener { Task task = listenerVariable.getTask(); if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) { // 判断流程状态(发布审批中事件) - flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeCode(), task.getId(), businessId); + flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeType(), + task.getNodeCode(), task.getNodeName(), task.getId(), businessId); } } @@ -83,8 +84,6 @@ public class WorkflowGlobalListener implements GlobalListener { public void finish(ListenerVariable listenerVariable) { Instance instance = listenerVariable.getInstance(); Definition definition = listenerVariable.getDefinition(); - String businessId = instance.getBusinessId(); - String flowStatus = instance.getFlowStatus(); Map params = new HashMap<>(); FlowParams flowParams = listenerVariable.getFlowParams(); if (ObjectUtil.isNotNull(flowParams)) { @@ -96,20 +95,21 @@ public class WorkflowGlobalListener implements GlobalListener { params.put("message", flowParams.getMessage()); } // 判断流程状态(发布:撤销,退回,作废,终止,已完成事件) - String status = determineFlowStatus(instance, flowStatus); + String status = determineFlowStatus(instance); if (StringUtils.isNotBlank(status)) { - flowProcessEventHandler.processHandler(definition.getFlowCode(), businessId, status, params, false); + flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), instance.getNodeType(), + instance.getNodeCode(), instance.getNodeName(), status, params, false); } } /** - * 根据流程实例和当前流程状态确定最终状态 + * 根据流程实例确定最终状态 * - * @param instance 流程实例 - * @param flowStatus 流程实例当前状态 + * @param instance 流程实例 * @return 流程最终状态 */ - private String determineFlowStatus(Instance instance, String flowStatus) { + private String determineFlowStatus(Instance instance) { + String flowStatus = instance.getFlowStatus(); if (StringUtils.isNotBlank(flowStatus) && BusinessStatusEnum.initialState(flowStatus)) { log.info("流程实例当前状态: {}", flowStatus); return flowStatus; 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 990c32383..356af6600 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 @@ -162,7 +162,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Definition definition = defService.getById(flowTask.getDefinitionId()); // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { - flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), null, true); + flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getNodeType(), + ins.getNodeCode(), ins.getNodeName(), ins.getFlowStatus(), null, true); } // 设置弹窗处理人 Map assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap()); From a690ece164db87557b2363f6f74a3be420170dad 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, 9 Apr 2025 11:53:40 +0800 Subject: [PATCH 097/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=9B=91=E5=90=AC=E5=99=A8=E4=BA=8B=E4=BB=B6=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/FlowProcessEventHandler.java | 37 ++++++++----------- .../listener/WorkflowGlobalListener.java | 10 ++--- .../service/impl/FlwTaskServiceImpl.java | 3 +- 3 files changed, 20 insertions(+), 30 deletions(-) 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 eec27369d..84a322061 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 @@ -6,6 +6,7 @@ import org.dromara.common.core.domain.event.ProcessDeleteEvent; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.warm.flow.core.entity.Instance; import org.dromara.workflow.common.ConditionalOnEnable; import org.springframework.stereotype.Component; @@ -26,28 +27,25 @@ public class FlowProcessEventHandler { * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) * * @param flowCode 流程定义编码 - * @param businessId 业务id - * @param nodeType 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - * @param nodeCode 流程节点编码 - * @param nodeName 流程节点名称 + * @param instance 实例数据 * @param status 流程状态 * @param params 办理参数 * @param submit 当为true时为申请人节点办理 */ - public void processHandler(String flowCode, String businessId, Integer nodeType, String nodeCode, String nodeName, + public void processHandler(String flowCode, Instance instance, String status, Map params, boolean submit) { String tenantId = TenantHelper.getTenantId(); log.info("【流程事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}", - tenantId, flowCode, businessId, status, nodeType, nodeCode, nodeName, submit, params); + tenantId, flowCode, instance.getBusinessId(), status, instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), submit, params); ProcessEvent processEvent = new ProcessEvent(); processEvent.setTenantId(tenantId); processEvent.setFlowCode(flowCode); - processEvent.setBusinessId(businessId); - processEvent.setNodeType(nodeType); - processEvent.setNodeCode(nodeCode); - processEvent.setNodeName(nodeName); + processEvent.setBusinessId(instance.getBusinessId()); + processEvent.setNodeType(instance.getNodeType()); + processEvent.setNodeCode(instance.getNodeCode()); + processEvent.setNodeName(instance.getNodeName()); processEvent.setStatus(status); processEvent.setParams(params); processEvent.setSubmit(submit); @@ -58,24 +56,21 @@ public class FlowProcessEventHandler { * 执行创建任务监听 * * @param flowCode 流程定义编码 - * @param nodeType 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - * @param nodeCode 流程节点编码 - * @param nodeName 流程节点名称 + * @param instance 实例数据 * @param taskId 任务id - * @param businessId 业务id */ - public void processCreateTaskHandler(String flowCode, Integer nodeType, String nodeCode, String nodeName, Long taskId, String businessId) { + public void processCreateTaskHandler(String flowCode, Instance instance, Long taskId) { String tenantId = TenantHelper.getTenantId(); - log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}, 业务ID: {}", - tenantId, flowCode, nodeType, nodeCode, nodeName, taskId, businessId); + log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 业务ID: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}", + tenantId, flowCode, instance.getBusinessId(), instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), taskId); ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent(); processCreateTaskEvent.setTenantId(tenantId); processCreateTaskEvent.setFlowCode(flowCode); - processCreateTaskEvent.setNodeType(nodeType); - processCreateTaskEvent.setNodeCode(nodeCode); - processCreateTaskEvent.setNodeName(nodeName); + processCreateTaskEvent.setBusinessId(instance.getBusinessId()); + processCreateTaskEvent.setNodeType(instance.getNodeType()); + processCreateTaskEvent.setNodeCode(instance.getNodeCode()); + processCreateTaskEvent.setNodeName(instance.getNodeName()); processCreateTaskEvent.setTaskId(taskId); - processCreateTaskEvent.setBusinessId(businessId); 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 6f435693e..b6bdfa268 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 @@ -47,13 +47,10 @@ public class WorkflowGlobalListener implements GlobalListener { public void create(ListenerVariable listenerVariable) { Instance instance = listenerVariable.getInstance(); Definition definition = listenerVariable.getDefinition(); - String businessId = instance.getBusinessId(); - String flowStatus = instance.getFlowStatus(); Task task = listenerVariable.getTask(); - if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(flowStatus)) { + if (task != null && BusinessStatusEnum.WAITING.getStatus().equals(instance.getFlowStatus())) { // 判断流程状态(发布审批中事件) - flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), task.getNodeType(), - task.getNodeCode(), task.getNodeName(), task.getId(), businessId); + flowProcessEventHandler.processCreateTaskHandler(definition.getFlowCode(), instance, task.getId()); } } @@ -97,8 +94,7 @@ public class WorkflowGlobalListener implements GlobalListener { // 判断流程状态(发布:撤销,退回,作废,终止,已完成事件) String status = determineFlowStatus(instance); if (StringUtils.isNotBlank(status)) { - flowProcessEventHandler.processHandler(definition.getFlowCode(), instance.getBusinessId(), instance.getNodeType(), - instance.getNodeCode(), instance.getNodeName(), status, params, false); + flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, status, params, false); } } 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 356af6600..f34c15a77 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 @@ -162,8 +162,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Definition definition = defService.getById(flowTask.getDefinitionId()); // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { - flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getNodeType(), - ins.getNodeCode(), ins.getNodeName(), ins.getFlowStatus(), null, true); + flowProcessEventHandler.processHandler(definition.getFlowCode(), ins, ins.getFlowStatus(), null, true); } // 设置弹窗处理人 Map assigneeMap = setPopAssigneeMap(completeTaskBo.getAssigneeMap(), ins.getVariableMap()); From 564ab331d7ce0a6eb70e550b542eb392fd0d8129 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 10 Apr 2025 16:01:29 +0800 Subject: [PATCH 098/155] =?UTF-8?q?update=20=E7=BB=9F=E4=B8=80=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81FlowParams=E6=9E=84=E9=80=A0=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E4=B8=BA=E5=BB=BA=E9=80=A0=E8=80=85=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?,=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/FlowProcessEventHandler.java | 11 ++-- .../service/impl/FlwCommonServiceImpl.java | 12 ++--- .../service/impl/FlwInstanceServiceImpl.java | 10 ++-- .../service/impl/FlwTaskServiceImpl.java | 54 +++++++++---------- 4 files changed, 42 insertions(+), 45 deletions(-) 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 84a322061..c9e7a9237 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 @@ -32,13 +32,10 @@ public class FlowProcessEventHandler { * @param params 办理参数 * @param submit 当为true时为申请人节点办理 */ - public void processHandler(String flowCode, Instance instance, - String status, Map params, boolean submit) { - + public void processHandler(String flowCode, Instance instance, String status, Map params, boolean submit) { String tenantId = TenantHelper.getTenantId(); - log.info("【流程事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}", + log.info("【流程事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 流程状态: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 是否申请人节点: {}, 参数: {}", tenantId, flowCode, instance.getBusinessId(), status, instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), submit, params); - ProcessEvent processEvent = new ProcessEvent(); processEvent.setTenantId(tenantId); processEvent.setFlowCode(flowCode); @@ -61,7 +58,7 @@ public class FlowProcessEventHandler { */ public void processCreateTaskHandler(String flowCode, Instance instance, Long taskId) { String tenantId = TenantHelper.getTenantId(); - log.info("发布流程任务事件, 租户ID: {}, 流程编码: {}, 业务ID: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}", + log.info("【流程任务事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}, 节点类型: {}, 节点编码: {}, 节点名称: {}, 任务ID: {}", tenantId, flowCode, instance.getBusinessId(), instance.getNodeType(), instance.getNodeCode(), instance.getNodeName(), taskId); ProcessCreateTaskEvent processCreateTaskEvent = new ProcessCreateTaskEvent(); processCreateTaskEvent.setTenantId(tenantId); @@ -82,7 +79,7 @@ public class FlowProcessEventHandler { */ public void processDeleteHandler(String flowCode, String businessId) { String tenantId = TenantHelper.getTenantId(); - log.info("发布删除流程事件, 租户ID: {}, 流程编码: {}, 业务ID: {}", tenantId, flowCode, businessId); + log.info("【流程删除事件发布】租户ID: {}, 流程编码: {}, 业务ID: {}", tenantId, flowCode, businessId); ProcessDeleteEvent processDeleteEvent = new ProcessDeleteEvent(); processDeleteEvent.setTenantId(tenantId); processDeleteEvent.setFlowCode(flowCode); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index bbc5734c9..9f92a154c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -198,12 +198,12 @@ public class FlwCommonServiceImpl implements IFlwCommonService { } for (FlowTask task : list) { List userList = flwTaskService.currentTaskAllUser(task.getId()); - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(targetNodeCode); - flowParams.message(message); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.flowStatus(flowStatus).hisStatus(flowHisStatus); - flowParams.ignore(true); + FlowParams flowParams = FlowParams.build() + .nodeCode(targetNodeCode) + .message(message) + .skipType(SkipType.PASS.getKey()) + .flowStatus(flowStatus).hisStatus(flowHisStatus) + .ignore(true); //解决会签没权限问题 if (CollUtil.isNotEmpty(userList)) { flowParams.handler(userList.get(0).getUserId().toString()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 3c0b59541..5518cd4ba 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -437,11 +437,11 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } List flowTaskList = flwTaskService.selectByInstId(bo.getId()); for (FlowTask flowTask : flowTaskList) { - FlowParams flowParams = new FlowParams(); - flowParams.message(bo.getComment()); - flowParams.flowStatus(BusinessStatusEnum.INVALID.getStatus()) - .hisStatus(TaskStatusEnum.INVALID.getStatus()); - flowParams.ignore(true); + FlowParams flowParams = FlowParams.build() + .message(bo.getComment()) + .flowStatus(BusinessStatusEnum.INVALID.getStatus()) + .hisStatus(TaskStatusEnum.INVALID.getStatus()) + .ignore(true); taskService.termination(flowTask.getId(), flowParams); } return true; 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 f34c15a77..71f2a53f2 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 @@ -117,10 +117,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { dto.setTaskId(taskList.get(0).getId()); return dto; } - FlowParams flowParams = new FlowParams(); - flowParams.flowCode(startProcessBo.getFlowCode()); - flowParams.variable(startProcessBo.getVariables()); - flowParams.flowStatus(BusinessStatusEnum.DRAFT.getStatus()); + FlowParams flowParams = FlowParams.build() + .flowCode(startProcessBo.getFlowCode()) + .variable(startProcessBo.getVariables()) + .flowStatus(BusinessStatusEnum.DRAFT.getStatus()); Instance instance; try { instance = insService.start(businessId, flowParams); @@ -170,13 +170,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { completeTaskBo.getVariables().putAll(assigneeMap); } // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 - FlowParams flowParams = new FlowParams(); - flowParams.variable(completeTaskBo.getVariables()); - flowParams.skipType(SkipType.PASS.getKey()); - flowParams.message(completeTaskBo.getMessage()); - flowParams.flowStatus(BusinessStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.PASS.getStatus()); - - flowParams.hisTaskExt(completeTaskBo.getFileId()); + FlowParams flowParams = FlowParams.build() + .variable(completeTaskBo.getVariables()) + .skipType(SkipType.PASS.getKey()) + .message(completeTaskBo.getMessage()) + .flowStatus(BusinessStatusEnum.WAITING.getStatus()) + .hisStatus(TaskStatusEnum.PASS.getStatus()) + .hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 Instance instance = taskService.skip(taskId, flowParams); this.setHandler(instance, flowTask, flowCopyList); @@ -310,10 +310,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { task.setId(taskId); task.setNodeName("【抄送】" + task.getNodeName()); Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() - 1000); - FlowParams flowParams = FlowParams.build(); - flowParams.skipType(SkipType.NONE.getKey()); - flowParams.hisStatus(TaskStatusEnum.COPY.getStatus()); - flowParams.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getUserName)); + FlowParams flowParams = FlowParams.build() + .skipType(SkipType.NONE.getKey()) + .hisStatus(TaskStatusEnum.COPY.getStatus()) + .message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getUserName)); HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams); hisTask.setCreateTime(updateTime); hisTask.setUpdateTime(updateTime); @@ -456,13 +456,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Long definitionId = task.getDefinitionId(); Definition definition = defService.getById(definitionId); String applyNodeCode = flwCommonService.applyNodeCode(definitionId); - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(bo.getNodeCode()); - flowParams.message(message); - flowParams.skipType(SkipType.REJECT.getKey()); - flowParams.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus()) - .hisStatus(TaskStatusEnum.BACK.getStatus()); - flowParams.hisTaskExt(bo.getFileId()); + FlowParams flowParams = FlowParams.build() + .nodeCode(bo.getNodeCode()) + .message(message) + .skipType(SkipType.REJECT.getKey()) + .flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus()) + .hisStatus(TaskStatusEnum.BACK.getStatus()) + .hisTaskExt(bo.getFileId()); taskService.skip(task.getId(), flowParams); Instance instance = insService.getById(inst.getId()); @@ -519,9 +519,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNotNull(instance)) { BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus()); } - FlowParams flowParams = new FlowParams(); - flowParams.message(bo.getComment()); - flowParams.flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) + FlowParams flowParams = FlowParams.build() + .message(bo.getComment()) + .flowStatus(BusinessStatusEnum.TERMINATION.getStatus()) .hisStatus(TaskStatusEnum.TERMINATION.getStatus()); taskService.termination(taskId, flowParams); return true; @@ -662,8 +662,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override @Transactional(rollbackFor = Exception.class) public boolean taskOperation(TaskOperationBo bo, String taskOperation) { - FlowParams flowParams = new FlowParams(); - flowParams.message(bo.getMessage()); + FlowParams flowParams = FlowParams.build() + .message(bo.getMessage()); if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { flowParams.ignore(true); } From 53cf1b20137dd33d9779c97ae9190ad130673bde Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 10 Apr 2025 16:44:51 +0800 Subject: [PATCH 099/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E8=8E=B7=E5=8F=96=E6=B5=81=E7=A8=8B=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/domain/vo/FlowVariableVo.java | 28 ------------------- .../service/impl/FlwInstanceServiceImpl.java | 20 ++++--------- 2 files changed, 5 insertions(+), 43 deletions(-) delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java deleted file mode 100644 index b4de76e93..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowVariableVo.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.dromara.workflow.domain.vo; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 流程变量 - * - * @author may - */ -@Data -public class FlowVariableVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 变量key - */ - private String key; - - /** - * 变量值 - */ - private String value; -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 5518cd4ba..2aa95484f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -42,7 +42,6 @@ import org.dromara.workflow.domain.bo.FlowInstanceBo; import org.dromara.workflow.domain.bo.FlowInvalidBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowInstanceVo; -import org.dromara.workflow.domain.vo.FlowVariableVo; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwInstanceMapper; @@ -346,21 +345,12 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { */ @Override public Map instanceVariable(Long instanceId) { - Map map = new HashMap<>(); FlowInstance flowInstance = flowInstanceMapper.selectById(instanceId); - Map variableMap = flowInstance.getVariableMap(); - List list = new ArrayList<>(); - if (CollUtil.isNotEmpty(variableMap)) { - for (Map.Entry entry : variableMap.entrySet()) { - FlowVariableVo flowVariableVo = new FlowVariableVo(); - flowVariableVo.setKey(entry.getKey()); - flowVariableVo.setValue(entry.getValue().toString()); - list.add(flowVariableVo); - } - } - map.put("variableList", list); - map.put("variable", flowInstance.getVariable()); - return map; + Map variableMap = Optional.ofNullable(flowInstance.getVariableMap()).orElse(Collections.emptyMap()); + List> variableList = variableMap.entrySet().stream() + .map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue())) + .toList(); + return Map.of("variableList", variableList, "variable", flowInstance.getVariable()); } /** From d89f147c54ff02d6956cb609042127dbc14b48f1 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: Thu, 10 Apr 2025 17:22:34 +0800 Subject: [PATCH 100/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E8=A7=A3=E5=86=B3sa-token=E4=BD=BF=E7=94=A8=E7=A7=92?= =?UTF-8?q?=20redis=E6=98=AF=E6=AF=AB=E7=A7=92=E5=AF=BC=E8=87=B41=E7=A7=92?= =?UTF-8?q?=E7=9A=84=E7=B2=BE=E5=BA=A6=E9=97=AE=E9=A2=98=20=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E8=A1=A5=E5=81=BF(=E7=AD=89satoken=E5=AE=98=E6=96=B9?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/satoken/core/dao/PlusSaTokenDao.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java index a2a152003..3a5430327 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java @@ -85,7 +85,8 @@ public class PlusSaTokenDao implements SaTokenDao { @Override public long getTimeout(String key) { long timeout = RedisUtils.getTimeToLive(key); - return timeout < 0 ? timeout : timeout / 1000; + // 加1的目的 解决sa-token使用秒 redis是毫秒导致1秒的精度问题 手动补偿 + return timeout < 0 ? timeout : timeout / 1000 + 1; } /** @@ -152,7 +153,8 @@ public class PlusSaTokenDao implements SaTokenDao { @Override public long getObjectTimeout(String key) { long timeout = RedisUtils.getTimeToLive(key); - return timeout < 0 ? timeout : timeout / 1000; + // 加1的目的 解决sa-token使用秒 redis是毫秒导致1秒的精度问题 手动补偿 + return timeout < 0 ? timeout : timeout / 1000 + 1; } /** From a2c238d466c37bc9906a4d36fa2ee2a1e5bbc1d8 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: Thu, 10 Apr 2025 17:29:44 +0800 Subject: [PATCH 101/155] update bouncycastle 1.76 => 1.80 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f1362f2e3..28dbfe61c 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 1.4.6 0.2.0 1.18.36 - 1.76 + 1.80 1.16.7 2.7.0 From 00003b2c57cd8fce8b0cf7c08f48e9d134fefb76 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: Fri, 11 Apr 2025 10:18:05 +0800 Subject: [PATCH 102/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20sqlserver=20?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=86=85=E7=9A=84=E5=A4=9A=E4=BD=99=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 10 +++++----- script/sql/update/sqlserver/update_5.0-5.1.sql | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index 0567f31d9..c5df3e8d2 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -1265,15 +1265,15 @@ INSERT sys_dict_data VALUES (32, N'000000', 0, N'邮件认证', N'email', N'sys_ GO INSERT sys_dict_data VALUES (33, N'000000', 0, N'小程序认证', N'xcx', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'小程序认证') GO -INSERT sys_dict_data VALUES (34, N'000000', 0, N'三方登录认证', N'`social`', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'三方登录认证') +INSERT sys_dict_data VALUES (34, N'000000', 0, N'三方登录认证', N'social', N'sys_grant_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'三方登录认证') GO -INSERT sys_dict_data VALUES (35, N'000000', 0, N'PC', N'`pc`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'PC') +INSERT sys_dict_data VALUES (35, N'000000', 0, N'PC', N'pc', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'PC') GO -INSERT sys_dict_data VALUES (36, N'000000', 0, N'安卓', N'`android`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'安卓') +INSERT sys_dict_data VALUES (36, N'000000', 0, N'安卓', N'android', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'安卓') GO -INSERT sys_dict_data VALUES (37, N'000000', 0, N'iOS', N'`ios`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'iOS') +INSERT sys_dict_data VALUES (37, N'000000', 0, N'iOS', N'ios', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'iOS') GO -INSERT sys_dict_data VALUES (38, N'000000', 0, N'小程序', N'`xcx`', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'小程序') +INSERT sys_dict_data VALUES (38, N'000000', 0, N'小程序', N'xcx', N'sys_device_type', N'', N'default', N'N', 103, 1, getdate(), NULL, NULL, N'小程序') GO CREATE TABLE sys_dict_type diff --git a/script/sql/update/sqlserver/update_5.0-5.1.sql b/script/sql/update/sqlserver/update_5.0-5.1.sql index bde3813ac..6ea54a55a 100644 --- a/script/sql/update/sqlserver/update_5.0-5.1.sql +++ b/script/sql/update/sqlserver/update_5.0-5.1.sql @@ -363,7 +363,7 @@ INSERT sys_dict_data VALUES (32, N'000000', 0, N'邮件认证', N'email', N'sys_ GO INSERT sys_dict_data VALUES (33, N'000000', 0, N'小程序认证', N'xcx', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'小程序认证') GO -INSERT sys_dict_data VALUES (34, N'000000', 0, N'三方登录认证', N'`social`', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'三方登录认证') +INSERT sys_dict_data VALUES (34, N'000000', 0, N'三方登录认证', N'social', N'sys_grant_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'三方登录认证') GO INSERT sys_dict_data VALUES (35, N'000000', 0, N'PC', N'`pc`', N'sys_device_type', N'', N'default', N'N', N'0', 103, 1, getdate(), NULL, NULL, N'PC') GO From 538aa8d90875400c44d5a3e4e4b3acf0c6181b9e 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: Fri, 11 Apr 2025 15:07:18 +0800 Subject: [PATCH 103/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=B5=81=E7=A8=8Bdemo=20=E6=9D=83=E9=99=90=E4=BA=BA?= =?UTF-8?q?=E5=88=86=E9=9A=94=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/leave/leave1.json | 4 ++-- script/leave/leave2.json | 4 ++-- script/leave/leave3.json | 4 ++-- script/leave/leave4.json | 4 ++-- script/leave/leave5.json | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/script/leave/leave1.json b/script/leave/leave1.json index 36fc32602..0ffdeeb89 100644 --- a/script/leave/leave1.json +++ b/script/leave/leave1.json @@ -52,7 +52,7 @@ "nodeType" : 1, "nodeCode" : "a8abf15f-b83e-428a-86cc-033555ea9bbe", "nodeName" : "部门主管", - "permissionFlag" : "role:3,role:4", + "permissionFlag" : "role:3@@role:4", "nodeRatio" : 0.000, "coordinate" : "720,200|720,200", "formCustom" : "N", @@ -72,4 +72,4 @@ "formCustom" : "N", "ext" : "[]" } ] -} \ No newline at end of file +} diff --git a/script/leave/leave2.json b/script/leave/leave2.json index bb196a314..7bbdbaab2 100644 --- a/script/leave/leave2.json +++ b/script/leave/leave2.json @@ -58,7 +58,7 @@ "nodeType" : 1, "nodeCode" : "b3528155-dcb7-4445-bbdf-3d00e3499e86", "nodeName" : "组长", - "permissionFlag" : "3,4", + "permissionFlag" : "3@@4", "nodeRatio" : 0.000, "coordinate" : "720,320|720,320", "formCustom" : "N", @@ -108,4 +108,4 @@ "coordinate" : "770,160;860,160;860,200" } ] } ] -} \ No newline at end of file +} diff --git a/script/leave/leave3.json b/script/leave/leave3.json index d289c787a..bb22d42c9 100644 --- a/script/leave/leave3.json +++ b/script/leave/leave3.json @@ -106,7 +106,7 @@ "nodeType" : 1, "nodeCode" : "762cb975-37d8-4276-b6db-79a4c3606394", "nodeName" : "综合部", - "permissionFlag" : "role:3,role:4", + "permissionFlag" : "role:3@@role:4", "nodeRatio" : 0.000, "coordinate" : "800,300|800,300", "formCustom" : "N", @@ -118,4 +118,4 @@ "coordinate" : "850,300;920,300;920,245" } ] } ] -} \ No newline at end of file +} diff --git a/script/leave/leave4.json b/script/leave/leave4.json index c085de2e5..50968f8dd 100644 --- a/script/leave/leave4.json +++ b/script/leave/leave4.json @@ -52,7 +52,7 @@ "nodeType" : 1, "nodeCode" : "2f9f2e21-9bcf-42a3-a07c-13037aad22d1", "nodeName" : "全部审批通过", - "permissionFlag" : "role:1,role:3", + "permissionFlag" : "role:1@@role:3", "nodeRatio" : 100.000, "coordinate" : "820,240|820,240", "formCustom" : "N", @@ -87,4 +87,4 @@ "formCustom" : "N", "ext" : "[]" } ] -} \ No newline at end of file +} diff --git a/script/leave/leave5.json b/script/leave/leave5.json index 76d10f180..a27b1de4e 100644 --- a/script/leave/leave5.json +++ b/script/leave/leave5.json @@ -55,7 +55,7 @@ "nodeType" : 1, "nodeCode" : "c80f273e-1f17-4bd8-9ad1-04a4a94ea862", "nodeName" : "会签", - "permissionFlag" : "role:1,role:3", + "permissionFlag" : "role:1@@role:3", "nodeRatio" : 100.000, "coordinate" : "700,320|700,320", "formCustom" : "N", @@ -118,4 +118,4 @@ "coordinate" : "750,120;860,120;860,195" } ] } ] -} \ No newline at end of file +} From 31502dccc7bc160fe36d012ceee93d31b02800a4 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: Fri, 11 Apr 2025 15:36:38 +0800 Subject: [PATCH 104/155] =?UTF-8?q?update=20satoken=201.40.0=20=3D>=201.42?= =?UTF-8?q?.0=20=E9=80=82=E9=85=8D=E6=89=80=E6=9C=89=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E9=A1=B9(=E6=94=B9=E5=8A=A8=E8=BE=83=E5=A4=9A)=20SaLoginModel?= =?UTF-8?q?=20->=20SaLoginParameter=20device=20->=20deviceType=20satoken?= =?UTF-8?q?=20BCrypt=20->=20hutool=20BCrypt(satoken=E4=B8=8D=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E4=BA=86)=20SaTokenDao=20->=20SaTokenDaoBySessionFoll?= =?UTF-8?q?owObject(satoken=E5=81=9A=E4=BA=86=E9=87=8D=E6=9E=84=E5=B0=81?= =?UTF-8?q?=E8=A3=85)=20sse=20=E9=80=82=E9=85=8D=E6=96=B0satoken=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8B=A6=E6=88=AA=E5=99=A8=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../web/listener/UserActionListener.java | 20 +++++++++---------- .../web/service/SysRegisterService.java | 2 +- .../web/service/impl/EmailAuthStrategy.java | 6 +++--- .../service/impl/PasswordAuthStrategy.java | 8 ++++---- .../web/service/impl/SmsAuthStrategy.java | 6 +++--- .../web/service/impl/SocialAuthStrategy.java | 6 +++--- .../web/service/impl/XcxAuthStrategy.java | 6 +++--- .../satoken/core/dao/PlusSaTokenDao.java | 20 ++++++++++++++++--- .../common/satoken/utils/LoginHelper.java | 6 +++--- .../security/config/SecurityConfig.java | 17 ++++++---------- .../common/sse/controller/SseController.java | 1 + .../common/tenant/core/TenantSaTokenDao.java | 12 ++++++++++- .../system/SysProfileController.java | 2 +- .../controller/system/SysUserController.java | 2 +- .../service/impl/SysTenantServiceImpl.java | 2 +- 16 files changed, 69 insertions(+), 49 deletions(-) diff --git a/pom.xml b/pom.xml index 28dbfe61c..884d73092 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 0.15.0 4.0.3 2.3 - 1.40.0 + 1.42.0 3.5.11 3.9.1 5.8.35 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 86d26edf7..554c64b32 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 @@ -1,8 +1,8 @@ package org.dromara.web.listener; import cn.dev33.satoken.listener.SaTokenListener; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.convert.Convert; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; @@ -40,7 +40,7 @@ public class UserActionListener implements SaTokenListener { * 每次登录时触发 */ @Override - public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) { UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); String ip = ServletUtils.getClientIP(); UserOnlineDTO dto = new UserOnlineDTO(); @@ -50,17 +50,17 @@ public class UserActionListener implements SaTokenListener { dto.setOs(userAgent.getOs().getName()); dto.setLoginTime(System.currentTimeMillis()); dto.setTokenId(tokenValue); - String username = (String) loginModel.getExtra(LoginHelper.USER_NAME_KEY); - String tenantId = (String) loginModel.getExtra(LoginHelper.TENANT_KEY); + String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY); + String tenantId = (String) loginParameter.getExtra(LoginHelper.TENANT_KEY); dto.setUserName(username); - dto.setClientKey((String) loginModel.getExtra(LoginHelper.CLIENT_KEY)); - dto.setDeviceType(loginModel.getDevice()); - dto.setDeptName((String) loginModel.getExtra(LoginHelper.DEPT_NAME_KEY)); + dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY)); + dto.setDeviceType(loginParameter.getDeviceType()); + dto.setDeptName((String) loginParameter.getExtra(LoginHelper.DEPT_NAME_KEY)); TenantHelper.dynamic(tenantId, () -> { - if(loginModel.getTimeout() == -1) { + if(loginParameter.getTimeout() == -1) { RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); } else { - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginModel.getTimeout())); + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginParameter.getTimeout())); } }); // 记录登录日志 @@ -72,7 +72,7 @@ public class UserActionListener implements SaTokenListener { logininforEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(logininforEvent); // 更新登录信息 - loginService.recordLoginInfo((Long) loginModel.getExtra(LoginHelper.USER_KEY), ip); + loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip); log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java index 9ec08132e..567906e42 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysRegisterService.java @@ -1,6 +1,6 @@ package org.dromara.web.service; -import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.crypto.digest.BCrypt; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.Constants; diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index 1bed4f3e5..e4315dc59 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -1,7 +1,7 @@ package org.dromara.web.service.impl; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; @@ -58,8 +58,8 @@ public class EmailAuthStrategy implements IAuthStrategy { }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 // 例如: 后台用户30分钟过期 app用户1天过期 model.setTimeout(client.getTimeout()); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index e8e60e1c4..e579f9969 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -1,9 +1,9 @@ package org.dromara.web.service.impl; -import cn.dev33.satoken.secure.BCrypt; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -70,8 +70,8 @@ public class PasswordAuthStrategy implements IAuthStrategy { }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 // 例如: 后台用户30分钟过期 app用户1天过期 model.setTimeout(client.getTimeout()); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index 2ffda353e..597a6013b 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -1,7 +1,7 @@ package org.dromara.web.service.impl; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; @@ -58,8 +58,8 @@ public class SmsAuthStrategy implements IAuthStrategy { }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 // 例如: 后台用户30分钟过期 app用户1天过期 model.setTimeout(client.getTimeout()); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index 419dbd6ba..ffe95e0b6 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -1,7 +1,7 @@ package org.dromara.web.service.impl; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; @@ -99,8 +99,8 @@ public class SocialAuthStrategy implements IAuthStrategy { }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 // 例如: 后台用户30分钟过期 app用户1天过期 model.setTimeout(client.getTimeout()); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java index fa9b61819..f223dd88f 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java @@ -1,7 +1,7 @@ package org.dromara.web.service.impl; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -76,8 +76,8 @@ public class XcxAuthStrategy implements IAuthStrategy { loginUser.setDeviceType(client.getDeviceType()); loginUser.setOpenid(openid); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 // 例如: 后台用户30分钟过期 app用户1天过期 model.setTimeout(client.getTimeout()); diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java index 3a5430327..46c61c4c8 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/dao/PlusSaTokenDao.java @@ -1,6 +1,6 @@ package org.dromara.common.satoken.core.dao; -import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.dao.auto.SaTokenDaoBySessionFollowObject; import cn.dev33.satoken.util.SaFoxUtil; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; @@ -16,10 +16,12 @@ import java.util.concurrent.TimeUnit; * Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一) *

* 采用 caffeine + redis 多级缓存 优化并发查询效率 + *

+ * SaTokenDaoBySessionFollowObject 是 SaTokenDao 子集简化了session方法处理 * * @author Lion Li */ -public class PlusSaTokenDao implements SaTokenDao { +public class PlusSaTokenDao implements SaTokenDaoBySessionFollowObject { private static final Cache CAFFEINE = Caffeine.newBuilder() // 设置最后一次写入或访问后经过固定时间过期 @@ -107,6 +109,19 @@ public class PlusSaTokenDao implements SaTokenDao { return o; } + /** + * 获取 Object (指定反序列化类型),如无返空 + * + * @param key 键名称 + * @return object + */ + @SuppressWarnings("unchecked cast") + @Override + public T getObject(String key, Class classType) { + Object o = CAFFEINE.get(key, k -> RedisUtils.getCacheObject(key)); + return (T) o; + } + /** * 写入Object,并设定存活时间 (单位: 秒) */ @@ -165,7 +180,6 @@ public class PlusSaTokenDao implements SaTokenDao { RedisUtils.expire(key, Duration.ofSeconds(timeout)); } - /** * 搜索数据 */ diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index a5729387d..7a2b9fcf6 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -1,8 +1,8 @@ package org.dromara.common.satoken.utils; import cn.dev33.satoken.session.SaSession; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; @@ -47,8 +47,8 @@ public class LoginHelper { * @param loginUser 登录用户信息 * @param model 配置参数 */ - public static void login(LoginUser loginUser, SaLoginModel model) { - model = ObjectUtil.defaultIfNull(model, new SaLoginModel()); + public static void login(LoginUser loginUser, SaLoginParameter model) { + model = ObjectUtil.defaultIfNull(model, new SaLoginParameter()); StpUtil.login(loginUser.getLoginId(), model.setExtra(TENANT_KEY, loginUser.getTenantId()) .setExtra(USER_KEY, loginUser.getUserId()) diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java index a4e921f23..21f2c113c 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java @@ -11,13 +11,13 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.HttpStatus; -import org.dromara.common.core.exception.SseException; 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.satoken.utils.LoginHelper; import org.dromara.common.security.config.properties.SecurityProperties; import org.dromara.common.security.handler.AllUrlHandler; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -37,6 +37,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class SecurityConfig implements WebMvcConfigurer { private final SecurityProperties securityProperties; + @Value("${sse.path}") + private String ssePath; /** * 注册sa-token的拦截器 @@ -54,15 +56,7 @@ public class SecurityConfig implements WebMvcConfigurer { .check(() -> { HttpServletRequest request = ServletUtils.getRequest(); // 检查是否登录 是否有token - try { - StpUtil.checkLogin(); - } catch (NotLoginException e) { - if (request.getRequestURI().contains("sse")) { - throw new SseException(e.getMessage(), e.getCode()); - } else { - throw e; - } - } + StpUtil.checkLogin(); // 检查 header 与 param 里的 clientid 与 token 里的是否一致 String headerCid = request.getHeader(LoginHelper.CLIENT_KEY); @@ -84,7 +78,8 @@ public class SecurityConfig implements WebMvcConfigurer { }); })).addPathPatterns("/**") // 排除不需要拦截的路径 - .excludePathPatterns(securityProperties.getExcludes()); + .excludePathPatterns(securityProperties.getExcludes()) + .excludePathPatterns(ssePath); } /** diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java index e5331e419..412834cfb 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/controller/SseController.java @@ -33,6 +33,7 @@ public class SseController implements DisposableBean { */ @GetMapping(value = "${sse.path}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter connect() { + StpUtil.checkLogin(); String tokenValue = StpUtil.getTokenValue(); Long userId = LoginHelper.getUserId(); return sseEmitterManager.connect(userId, tokenValue); diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java index b8da28ef1..9aaa753ec 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/core/TenantSaTokenDao.java @@ -81,6 +81,17 @@ public class TenantSaTokenDao extends PlusSaTokenDao { return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key); } + /** + * 获取 Object (指定反序列化类型),如无返空 + * + * @param key 键名称 + * @return object + */ + @Override + public T getObject(String key, Class classType) { + return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key, classType); + } + /** * 写入Object,并设定存活时间 (单位: 秒) */ @@ -137,7 +148,6 @@ public class TenantSaTokenDao extends PlusSaTokenDao { RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout)); } - /** * 搜索数据 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 7a6bc2c1d..8903a7406 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -1,8 +1,8 @@ package org.dromara.system.controller.system; -import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.crypto.digest.BCrypt; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index e1e868a6e..774f26a3e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -1,10 +1,10 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index a73415c64..ca088607b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -1,11 +1,11 @@ package org.dromara.system.service.impl; -import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.digest.BCrypt; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; From 5c9721cfac181b669ce184917d03f512efa31780 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 11 Apr 2025 16:01:03 +0800 Subject: [PATCH 105/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E6=9D=83=E9=99=90=E6=8C=89=E9=92=AE=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=EF=BC=8C=E8=8B=A5=E9=9C=80=E8=A6=81=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E6=8C=89=E9=92=AE=E6=9D=83=E9=99=90=EF=BC=8C?= =?UTF-8?q?=E5=8F=AA=E9=9C=80=E5=9C=A8=20sources=20=E4=B8=AD=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=AF=B9=E5=BA=94=E7=9A=84=E6=9E=9A=E4=B8=BE=E7=B1=BB?= =?UTF-8?q?=E6=88=96=E5=AD=97=E5=85=B8=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ermission.java => ButtonPermissionVo.java} | 15 +++- .../workflow/domain/vo/FlowTaskVo.java | 34 +------- .../workflow/service/IFlwNodeExtService.java | 22 +++++ .../impl/FlwDefinitionServiceImpl.java | 2 +- .../service/impl/FlwNodeExtServiceImpl.java | 82 ++++++++++++++++++- .../service/impl/FlwTaskServiceImpl.java | 8 +- 6 files changed, 123 insertions(+), 40 deletions(-) rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/{ButtonPermission.java => ButtonPermissionVo.java} (61%) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java similarity index 61% rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java index 51f320d2d..eb26a4502 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermission.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java @@ -12,18 +12,18 @@ import java.io.Serializable; * @date 2025-02-28 */ @Data -public class ButtonPermission implements Serializable { +public class ButtonPermissionVo implements Serializable { @Serial private static final long serialVersionUID = 1L; /** - * 枚举路径 + * 唯一编码 */ private String code; /** - * 按钮编码 + * 选项值 */ private String value; @@ -31,4 +31,13 @@ public class ButtonPermission implements Serializable { * 是否显示 */ private boolean show; + + public ButtonPermissionVo() { + } + + public ButtonPermissionVo(String code, boolean show) { + this.code = code; + this.show = show; + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 785e866c8..e3b37ed86 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -1,20 +1,16 @@ package org.dromara.workflow.domain.vo; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.json.JSONUtil; import lombok.Data; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.warm.flow.core.entity.User; import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.common.enums.ButtonPermissionEnum; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; +import java.util.Date; +import java.util.List; /** * 任务视图 @@ -186,30 +182,6 @@ public class FlowTaskVo implements Serializable { /** * 按钮权限 */ - private List buttonList; + private List buttonList; - public List getButtonList(String ext) { - List buttonPermissions = Arrays.stream(ButtonPermissionEnum.values()) - .map(value -> { - ButtonPermission buttonPermission = new ButtonPermission(); - buttonPermission.setCode(value.getValue()); - buttonPermission.setShow(false); - return buttonPermission; - }) - .collect(Collectors.toList()); - if (StringUtils.isNotBlank(ext)) { - List buttonCodeList = JSONUtil.toList(JSONUtil.parseArray(ext), ButtonPermission.class); - if (CollUtil.isNotEmpty(buttonCodeList)) { - Optional firstPermission = buttonCodeList.stream().findFirst(); - firstPermission.ifPresent(permission -> { - Set codeSet = Arrays.stream(permission.getValue().split(",")) - .map(String::trim) - .filter(code -> !code.isEmpty()) - .collect(Collectors.toSet()); - buttonPermissions.forEach(bp -> bp.setShow(codeSet.contains(bp.getCode()))); - }); - } - } - return buttonPermissions; - } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java new file mode 100644 index 000000000..959516535 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwNodeExtService.java @@ -0,0 +1,22 @@ +package org.dromara.workflow.service; + +import org.dromara.workflow.domain.vo.ButtonPermissionVo; + +import java.util.List; + +/** + * 流程节点扩展属性 服务层 + * + * @author AprilWind + */ +public interface IFlwNodeExtService { + + /** + * 从扩展属性构建按钮权限列表:根据 ext 中记录的权限值,标记每个按钮是否勾选 + * + * @param ext 扩展属性 JSON 字符串 + * @return 按钮权限 VO 列表 + */ + List buildButtonPermissionsFromExt(String ext); + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java index 7f0f67ec6..7936210d0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java @@ -191,7 +191,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { List flowDefinitions = flowDefinitionMapper.selectByIds(StreamUtils.toList(flowHisTasks, FlowHisTask::getDefinitionId)); if (CollUtil.isNotEmpty(flowDefinitions)) { String join = StreamUtils.join(flowDefinitions, FlowDefinition::getFlowCode); - log.error("流程定义【{}】已被使用不可被删除!", join); + log.info("流程定义【{}】已被使用不可被删除!", join); throw new ServiceException("流程定义【" + join + "】已被使用不可被删除!"); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index a6af73988..fca21a367 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -2,18 +2,25 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; 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.common.json.utils.JsonUtils; import org.dromara.warm.flow.ui.service.NodeExtService; import org.dromara.warm.flow.ui.vo.NodeExt; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.ButtonPermissionEnum; import org.dromara.workflow.common.enums.NodeExtEnum; +import org.dromara.workflow.domain.vo.ButtonPermissionVo; +import org.dromara.workflow.service.IFlwNodeExtService; import org.springframework.stereotype.Service; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 流程设计器-节点扩展属性 @@ -24,14 +31,15 @@ import java.util.*; @Slf4j @RequiredArgsConstructor @Service -public class FlwNodeExtServiceImpl implements NodeExtService { +public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService { /** * 存储不同 dictType 对应的配置信息 */ private static final Map CHILD_NODE_MAP = new HashMap<>(); - record ButtonPermission(String label, Integer type, Boolean must, Boolean multiple) {} + record ButtonPermission(String label, Integer type, Boolean must, Boolean multiple) { + } static { CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getSimpleName(), @@ -162,4 +170,74 @@ public class FlwNodeExtServiceImpl implements NodeExtService { return childNode; } + /** + * 从扩展属性构建按钮权限列表:根据 ext 中记录的权限值,标记每个按钮是否勾选 + * + * @param ext 扩展属性 JSON 字符串 + * @return 按钮权限 VO 列表 + */ + @Override + public List buildButtonPermissionsFromExt(String ext) { + // 解析 ext 为 Map>,用于标记权限 + Map> permissionMap = JsonUtils.parseArray(ext, ButtonPermissionVo.class) + .stream() + .collect(Collectors.toMap( + ButtonPermissionVo::getCode, + item -> StringUtils.splitList(item.getValue()).stream() + .map(String::trim) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()), + (a, b) -> b, + HashMap::new + )); + + // 构建按钮权限列表,标记哪些按钮在 permissionMap 中出现(表示已勾选) + return buildPermissionsFromSources(permissionMap, List.of(ButtonPermissionEnum.class)); + } + + /** + * 将权限映射与按钮权限来源(枚举类或字典类型)进行匹配,生成权限视图列表 + *

+ * 使用说明: + * - sources 支持传入多个来源类型,支持 NodeExtEnum 枚举类 或 字典类型字符串(dictType) + * - 若需要扩展更多按钮权限,只需在 sources 中新增对应的枚举类或字典类型 + *

+ * 示例: + * buildPermissionsFromSources(permissionMap, List.of(ButtonPermissionEnum.class, "custom_button_dict")); + * + * @param permissionMap 权限映射 + * @param sources 枚举类或字典类型列表 + * @return 按钮权限视图对象列表 + */ + @SuppressWarnings("unchecked cast") + private List buildPermissionsFromSources(Map> permissionMap, List sources) { + return sources.stream() + .flatMap(source -> { + if (source instanceof Class clazz && NodeExtEnum.class.isAssignableFrom(clazz)) { + Set selectedSet = permissionMap.getOrDefault(clazz.getSimpleName(), Collections.emptySet()); + return extractDictItems(this.buildChildNode((Class) clazz), selectedSet).stream(); + } else if (source instanceof String dictType) { + Set selectedSet = permissionMap.getOrDefault(dictType, Collections.emptySet()); + return extractDictItems(this.buildChildNode(dictType), selectedSet).stream(); + } + return Stream.empty(); + }).toList(); + } + + /** + * 从节点子项中提取字典项,并构建按钮权限视图对象列表 + * + * @param childNode 子节点 + * @param selectedSet 已选中的值集 + * @return 按钮权限视图对象列表 + */ + private List extractDictItems(NodeExt.ChildNode childNode, Set selectedSet) { + return Optional.ofNullable(childNode) + .map(NodeExt.ChildNode::getDict) + .orElse(List.of()) + .stream() + .map(dict -> new ButtonPermissionVo(dict.getValue(), selectedSet.contains(dict.getValue()))) + .toList(); + } + } 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 71f2a53f2..90c96a4f4 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 @@ -48,6 +48,7 @@ import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwCategoryMapper; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwCommonService; +import org.dromara.workflow.service.IFlwNodeExtService; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; @@ -86,6 +87,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final FlowNodeMapper flowNodeMapper; private final IFlwTaskAssigneeService flwTaskAssigneeService; private final IFlwCommonService flwCommonService; + private final IFlwNodeExtService flwNodeExtService; /** * 启动任务 @@ -561,12 +563,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService { flowTaskVo.setFlowCode(definition.getFlowCode()); flowTaskVo.setFlowName(definition.getFlowName()); flowTaskVo.setBusinessId(instance.getBusinessId()); - //设置按钮权限 - FlowNode flowNode = getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId()); + FlowNode flowNode = this.getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId()); if (ObjectUtil.isNull(flowNode)) { throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在"); } - flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt())); + //设置按钮权限 + flowTaskVo.setButtonList(flwNodeExtService.buildButtonPermissionsFromExt(flowNode.getExt())); flowTaskVo.setNodeRatio(flowNode.getNodeRatio()); flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId()))); return flowTaskVo; From 878cd7e9f03e1268e198942849c436efbf042d99 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 12 Apr 2025 17:22:44 +0800 Subject: [PATCH 106/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=94=A8=E6=88=B7=E6=9F=A5=E8=AF=A2=E6=9E=84?= =?UTF-8?q?=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwCommonServiceImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 9f92a154c..df4893d9b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -36,10 +36,7 @@ import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @@ -83,16 +80,19 @@ public class FlwCommonServiceImpl implements IFlwCommonService { Set list = new HashSet<>(); Set processedBySet = new HashSet<>(); IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); - for (User user : userList) { + Map> userListMap = StreamUtils.groupByKey(userList, User::getType); + for (Map.Entry> entry : userListMap.entrySet()) { + List entryValue = entry.getValue(); + String processedBys = StreamUtils.join(entryValue, User::getProcessedBy); // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); + List users = taskAssigneeService.fetchUsersByStorageId(processedBys); // 转换为 FlowUser 并添加到结果集合 if (CollUtil.isNotEmpty(users)) { users.forEach(dto -> { String processedBy = String.valueOf(dto.getUserId()); if (!processedBySet.contains(processedBy)) { FlowUser flowUser = new FlowUser(); - flowUser.setType(user.getType()); + flowUser.setType(entry.getKey()); flowUser.setProcessedBy(processedBy); flowUser.setAssociated(taskId); list.add(flowUser); From 9e78fcccf7a685b420a737fe040a3ba4452aef25 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 13 Apr 2025 12:46:24 +0800 Subject: [PATCH 107/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=BF=94?= =?UTF-8?q?=E5=9B=9Evo=E7=9A=84boolean=E7=B1=BB=E5=9E=8B=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8C=85=E8=A3=85=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/domain/event/ProcessEvent.java | 2 +- .../src/main/java/org/dromara/system/domain/vo/MetaVo.java | 6 +++--- .../main/java/org/dromara/system/domain/vo/RouterVo.java | 2 +- .../main/java/org/dromara/system/domain/vo/SysRoleVo.java | 4 ++-- .../org/dromara/workflow/domain/vo/ButtonPermissionVo.java | 4 ++-- .../java/org/dromara/workflow/domain/vo/FlowTaskVo.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index bc7b78065..7b15b85ae 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -60,6 +60,6 @@ public class ProcessEvent implements Serializable { /** * 当为true时为申请人节点办理 */ - private boolean submit; + private Boolean submit; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java index f720cd74f..b2c11485c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -25,7 +25,7 @@ public class MetaVo { /** * 设置为true,则不会被 缓存 */ - private boolean noCache; + private Boolean noCache; /** * 内链地址(http(s)://开头) @@ -37,7 +37,7 @@ public class MetaVo { this.icon = icon; } - public MetaVo(String title, String icon, boolean noCache) { + public MetaVo(String title, String icon, Boolean noCache) { this.title = title; this.icon = icon; this.noCache = noCache; @@ -49,7 +49,7 @@ public class MetaVo { this.link = link; } - public MetaVo(String title, String icon, boolean noCache, String link) { + public MetaVo(String title, String icon, Boolean noCache, String link) { this.title = title; this.icon = icon; this.noCache = noCache; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java index 0d576ef15..d56e09da3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -27,7 +27,7 @@ public class RouterVo { /** * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 */ - private boolean hidden; + private Boolean hidden; /** * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index 1913170ed..74f5ac721 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -91,9 +91,9 @@ public class SysRoleVo implements Serializable { /** * 用户是否存在此角色标识 默认不存在 */ - private boolean flag = false; + private Boolean flag = false; - public boolean isSuperAdmin() { + public Boolean isSuperAdmin() { return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java index eb26a4502..7175e5e09 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java @@ -30,12 +30,12 @@ public class ButtonPermissionVo implements Serializable { /** * 是否显示 */ - private boolean show; + private Boolean show; public ButtonPermissionVo() { } - public ButtonPermissionVo(String code, boolean show) { + public ButtonPermissionVo(String code, Boolean show) { this.code = code; this.show = show; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index e3b37ed86..07a22c4f3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -177,7 +177,7 @@ public class FlowTaskVo implements Serializable { /** * 是否为申请人节点 */ - private boolean applyNode; + private Boolean applyNode; /** * 按钮权限 From d456ff64f11204ca7db7e43f4acfb4467f96ea5c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 13 Apr 2025 12:49:03 +0800 Subject: [PATCH 108/155] =?UTF-8?q?Revert=20"update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=BF=94=E5=9B=9Evo=E7=9A=84boolean=E7=B1=BB=E5=9E=8B=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=BD=BF=E7=94=A8=E5=8C=85=E8=A3=85=E7=B1=BB"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 9e78fcccf7a685b420a737fe040a3ba4452aef25. --- .../org/dromara/common/core/domain/event/ProcessEvent.java | 2 +- .../src/main/java/org/dromara/system/domain/vo/MetaVo.java | 6 +++--- .../main/java/org/dromara/system/domain/vo/RouterVo.java | 2 +- .../main/java/org/dromara/system/domain/vo/SysRoleVo.java | 4 ++-- .../org/dromara/workflow/domain/vo/ButtonPermissionVo.java | 4 ++-- .../java/org/dromara/workflow/domain/vo/FlowTaskVo.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index 7b15b85ae..bc7b78065 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -60,6 +60,6 @@ public class ProcessEvent implements Serializable { /** * 当为true时为申请人节点办理 */ - private Boolean submit; + private boolean submit; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java index b2c11485c..f720cd74f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -25,7 +25,7 @@ public class MetaVo { /** * 设置为true,则不会被 缓存 */ - private Boolean noCache; + private boolean noCache; /** * 内链地址(http(s)://开头) @@ -37,7 +37,7 @@ public class MetaVo { this.icon = icon; } - public MetaVo(String title, String icon, Boolean noCache) { + public MetaVo(String title, String icon, boolean noCache) { this.title = title; this.icon = icon; this.noCache = noCache; @@ -49,7 +49,7 @@ public class MetaVo { this.link = link; } - public MetaVo(String title, String icon, Boolean noCache, String link) { + public MetaVo(String title, String icon, boolean noCache, String link) { this.title = title; this.icon = icon; this.noCache = noCache; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java index d56e09da3..0d576ef15 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -27,7 +27,7 @@ public class RouterVo { /** * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 */ - private Boolean hidden; + private boolean hidden; /** * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index 74f5ac721..1913170ed 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -91,9 +91,9 @@ public class SysRoleVo implements Serializable { /** * 用户是否存在此角色标识 默认不存在 */ - private Boolean flag = false; + private boolean flag = false; - public Boolean isSuperAdmin() { + public boolean isSuperAdmin() { return SystemConstants.SUPER_ADMIN_ID.equals(this.roleId); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java index 7175e5e09..eb26a4502 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java @@ -30,12 +30,12 @@ public class ButtonPermissionVo implements Serializable { /** * 是否显示 */ - private Boolean show; + private boolean show; public ButtonPermissionVo() { } - public ButtonPermissionVo(String code, Boolean show) { + public ButtonPermissionVo(String code, boolean show) { this.code = code; this.show = show; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index 07a22c4f3..e3b37ed86 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -177,7 +177,7 @@ public class FlowTaskVo implements Serializable { /** * 是否为申请人节点 */ - private Boolean applyNode; + private boolean applyNode; /** * 按钮权限 From 71dddee1460a98986560b5c05f5a3ba36d21bf2d Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 13 Apr 2025 13:28:40 +0800 Subject: [PATCH 109/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96Mybatis?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/handler/MybatisExceptionHandler.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java index 518d52d23..9a572b56b 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java @@ -1,5 +1,6 @@ package org.dromara.common.mybatis.handler; +import cn.hutool.http.HttpStatus; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; @@ -25,7 +26,7 @@ public class MybatisExceptionHandler { public R handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',数据库中已存在记录'{}'", requestURI, e.getMessage()); - return R.fail("数据库中已存在该记录,请联系管理员确认"); + return R.fail(HttpStatus.HTTP_CONFLICT, "数据库中已存在该记录,请联系管理员确认"); } /** @@ -35,12 +36,12 @@ public class MybatisExceptionHandler { public R handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); String message = e.getMessage(); - if (StringUtils.contains("CannotFindDataSourceException", message)) { + if (StringUtils.contains(message, "CannotFindDataSourceException")) { log.error("请求地址'{}', 未找到数据源", requestURI); - return R.fail("未找到数据源,请联系管理员确认"); + return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "未找到数据源,请联系管理员确认"); } log.error("请求地址'{}', Mybatis系统异常", requestURI, e); - return R.fail(message); + return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, message); } } From c171817d6aa70d9f40e0b2b1dbfe4f4ffc560e16 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: Sun, 13 Apr 2025 19:16:57 +0800 Subject: [PATCH 110/155] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E4=B8=80?= =?UTF-8?q?=E5=A4=A7=E5=A0=86snailjob=E7=9A=84demo=E6=A1=88=E4=BE=8B(?= =?UTF-8?q?=E6=84=9F=E8=B0=A2=20=E8=80=81=E9=A9=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/job/entity/BillDto.java | 30 ++++++++++ .../dromara/job/snailjob/AlipayBillTask.java | 42 +++++++++++++ .../dromara/job/snailjob/SummaryBillTask.java | 45 ++++++++++++++ .../job/snailjob/TestAnnoJobExecutor.java | 6 +- .../job/snailjob/TestBroadcastJob.java | 37 ++++++++++++ .../job/snailjob/TestMapJobAnnotation.java | 53 ++++++++++++++++ .../snailjob/TestMapReduceAnnotation1.java | 60 +++++++++++++++++++ .../job/snailjob/TestStaticShardingJob.java | 36 +++++++++++ .../dromara/job/snailjob/WechatBillTask.java | 43 +++++++++++++ 9 files changed, 350 insertions(+), 2 deletions(-) create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/entity/BillDto.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/entity/BillDto.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/entity/BillDto.java new file mode 100644 index 000000000..2661e3465 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/entity/BillDto.java @@ -0,0 +1,30 @@ +package org.dromara.job.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class BillDto { + + /** + * 账单ID + */ + private Long billId; + + /** + * 账单渠道 + */ + private String billChannel; + + /** + * 账单日期 + */ + private String billDate; + + /** + * 账单金额 + */ + private BigDecimal billAmount; + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java new file mode 100644 index 000000000..b8ad8cc39 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java @@ -0,0 +1,42 @@ +package org.dromara.job.snailjob; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.job.entity.BillDto; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; + +/** + * DAG工作流任务-模拟支付宝账单任务 + * + * + * @author 老马 + */ +@Component +@JobExecutor(name = "alipayBillTask") +public class AlipayBillTask { + + public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException { + BillDto billDto = new BillDto(); + billDto.setBillId(23456789L); + billDto.setBillChannel("alipay"); + // 设置清算日期 + String settlementDate = (String) jobArgs.getWfContext().get("settlementDate"); + if (StrUtil.equals(settlementDate, "sysdate")) { + settlementDate = DateUtil.today(); + } + billDto.setBillDate(settlementDate); + billDto.setBillAmount(new BigDecimal("2345.67")); + // 把billDto对象放入上下文进行传递 + jobArgs.appendContext("alipay", JsonUtils.toJsonString(billDto)); + SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext()); + return ExecuteResult.success(billDto); + } + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java new file mode 100644 index 000000000..bff15f97e --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java @@ -0,0 +1,45 @@ +package org.dromara.job.snailjob; + +import cn.hutool.core.util.StrUtil; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.job.entity.BillDto; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; + +/** + * DAG工作流任务-模拟汇总账单任务 + * + * + * @author 老马 + */ +@Component +@JobExecutor(name = "summaryBillTask") +public class SummaryBillTask { + + public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException { + // 获得微信账单 + BigDecimal wechatAmount = BigDecimal.valueOf(0); + String wechat = (String) jobArgs.getWfContext("wechat"); + if (StrUtil.isNotBlank(wechat)) { + BillDto wechatBillDto = JsonUtils.parseObject(wechat, BillDto.class); + wechatAmount = wechatBillDto.getBillAmount(); + } + // 获得支付宝账单 + BigDecimal alipayAmount = BigDecimal.valueOf(0); + String alipay = (String) jobArgs.getWfContext("alipay"); + if (StrUtil.isNotBlank(alipay)) { + BillDto alipayBillDto = JsonUtils.parseObject(alipay, BillDto.class); + alipayAmount = alipayBillDto.getBillAmount(); + } + // 汇总账单 + BigDecimal totalAmount = wechatAmount.add(alipayAmount); + SnailJobLog.REMOTE.info("总金额: {}", totalAmount); + return ExecuteResult.success(totalAmount); + } + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java index 5bea9daf3..e5339f5b4 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java @@ -8,8 +8,10 @@ import com.aizuda.snailjob.common.log.SnailJobLog; import org.springframework.stereotype.Component; /** - * @author opensnail - * @date 2024-05-17 + * 正常任务 + * + * + * @author 老马 */ @Component @JobExecutor(name = "testJobExecutor") diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java new file mode 100644 index 000000000..d77e72e6c --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java @@ -0,0 +1,37 @@ +package org.dromara.job.snailjob; + +import cn.hutool.core.util.RandomUtil; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 广播任务 + * + * + * @author 老马 + */ +@Slf4j +@Component +@JobExecutor(name = "testBroadcastJob") +public class TestBroadcastJob { + + @Value("${snail-job.port}") + private int clientPort; + + public ExecuteResult jobExecute(JobArgs jobArgs) { + int randomInt = RandomUtil.randomInt(100); + log.info("随机数: {}", randomInt); + SnailJobLog.REMOTE.info("随机数: {},客户端端口:{}", randomInt, clientPort); + if (randomInt < 50) { + throw new RuntimeException("随机数小于50,收集日志任务执行失败"); + } + // 获得jobArgs 中传入的相加的两个数 + return ExecuteResult.success("随机数大于50,收集日志任务执行成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java new file mode 100644 index 000000000..6589ed1c5 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java @@ -0,0 +1,53 @@ +package org.dromara.job.snailjob; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aizuda.snailjob.client.job.core.MapHandler; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.annotation.MapExecutor; +import com.aizuda.snailjob.client.job.core.dto.MapArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * Map任务 动态分配 只分片不关注结果 + * + * + * @author 老马 + */ +@Component +@JobExecutor(name = "testMapJobAnnotation") +public class TestMapJobAnnotation { + + @MapExecutor + public ExecuteResult doJobMapExecute(MapArgs mapArgs, MapHandler mapHandler) { + // 生成1~200数值并分片 + int partitionSize = 50; + List> partition = IntStream.rangeClosed(1, 200) + .boxed() + .collect(Collectors.groupingBy(i -> (i - 1) / partitionSize)) + .values() + .stream() + .toList(); + SnailJobLog.REMOTE.info("端口:{}完成分配任务", SpringUtil.getProperty("server.port")); + return mapHandler.doMap(partition, "doCalc"); + } + + @MapExecutor(taskName = "doCalc") + public ExecuteResult doCalc(MapArgs mapArgs) { + List sourceList = (List) mapArgs.getMapResult(); + // 遍历sourceList的每一个元素,计算出一个累加值partitionTotal + int partitionTotal = sourceList.stream().mapToInt(i -> i).sum(); + // 打印日志到服务器 + ThreadUtil.sleep(3, TimeUnit.SECONDS); + SnailJobLog.REMOTE.info("端口:{},partitionTotal:{}", SpringUtil.getProperty("server.port"), partitionTotal); + return ExecuteResult.success(partitionTotal); + } + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java new file mode 100644 index 000000000..4ae2fa80a --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java @@ -0,0 +1,60 @@ +package org.dromara.job.snailjob; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aizuda.snailjob.client.job.core.MapHandler; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.annotation.MapExecutor; +import com.aizuda.snailjob.client.job.core.annotation.ReduceExecutor; +import com.aizuda.snailjob.client.job.core.dto.MapArgs; +import com.aizuda.snailjob.client.job.core.dto.ReduceArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * MapReduce任务 动态分配 分片后合并结果 + * + * + * @author 老马 + */ +@Component +@JobExecutor(name = "testMapReduceAnnotation1") +public class TestMapReduceAnnotation1 { + + @MapExecutor + public ExecuteResult rootMapExecute(MapArgs mapArgs, MapHandler mapHandler) { + int partitionSize = 50; + List> partition = IntStream.rangeClosed(1, 200) + .boxed() + .collect(Collectors.groupingBy(i -> (i - 1) / partitionSize)) + .values() + .stream() + .toList(); + SnailJobLog.REMOTE.info("端口:{}完成分配任务", SpringUtil.getProperty("server.port")); + return mapHandler.doMap(partition, "doCalc"); + } + + @MapExecutor(taskName = "doCalc") + public ExecuteResult doCalc(MapArgs mapArgs) { + List sourceList = (List) mapArgs.getMapResult(); + // 遍历sourceList的每一个元素,计算出一个累加值partitionTotal + int partitionTotal = sourceList.stream().mapToInt(i -> i).sum(); + // 打印日志到服务器 + ThreadUtil.sleep(3, TimeUnit.SECONDS); + SnailJobLog.REMOTE.info("端口:{},partitionTotal:{}", SpringUtil.getProperty("server.port"), partitionTotal); + return ExecuteResult.success(partitionTotal); + } + + @ReduceExecutor + public ExecuteResult reduceExecute(ReduceArgs reduceArgs) { + int reduceTotal = reduceArgs.getMapResult().stream().mapToInt(i -> Integer.parseInt((String) i)).sum(); + SnailJobLog.REMOTE.info("端口:{},reduceTotal:{}", SpringUtil.getProperty("server.port"), reduceTotal); + return ExecuteResult.success(reduceTotal); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java new file mode 100644 index 000000000..07a1bc566 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java @@ -0,0 +1,36 @@ +package org.dromara.job.snailjob; + +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.springframework.stereotype.Component; + +/** + * 静态分片 根据服务端任务参数分片 + * + * + * @author 老马 + */ +@Component +@JobExecutor(name = "testStaticShardingJob") +public class TestStaticShardingJob { + + public ExecuteResult jobExecute(JobArgs jobArgs) { + String jobParams = String.valueOf(jobArgs.getJobParams()); + SnailJobLog.LOCAL.info("开始执行分片任务,参数:{}", jobParams); + // 获得jobArgs 中传入的开始id和结束id + String[] split = jobParams.split(","); + Long fromId = Long.parseLong(split[0]); + Long toId = Long.parseLong(split[1]); + // 模拟数据库操作,对范围id,进行加密处理 + try { + SnailJobLog.REMOTE.info("开始对id范围:{}进行加密处理", fromId + "-" + toId); + Thread.sleep(3000); + SnailJobLog.REMOTE.info("对id范围:{}进行加密处理完成", fromId + "-" + toId); + } catch (InterruptedException e) { + return ExecuteResult.failure("任务执行失败"); + } + return ExecuteResult.success("执行分片任务完成"); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java new file mode 100644 index 000000000..d8caf1af0 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java @@ -0,0 +1,43 @@ +package org.dromara.job.snailjob; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.log.SnailJobLog; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.job.entity.BillDto; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; + +/** + * DAG工作流任务-模拟微信账单任务 + * + * + * @author 老马 + */ +@Component +@JobExecutor(name = "wechatBillTask") +public class WechatBillTask { + + public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException { + BillDto billDto = new BillDto(); + billDto.setBillId(123456789L); + billDto.setBillChannel("wechat"); + // 从上下文中获得清算日期并设置,如果上下文中清算日期 + // 是sysdate设置为当前日期;否则取管理页面设置的值 + String settlementDate = (String) jobArgs.getWfContext().get("settlementDate"); + if (StrUtil.equals(settlementDate, "sysdate")) { + settlementDate = DateUtil.today(); + } + billDto.setBillDate(settlementDate); + billDto.setBillAmount(new BigDecimal("1234.56")); + // 把billDto对象放入上下文进行传递 + jobArgs.appendContext("wechat", JsonUtils.toJsonString(billDto)); + SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext()); + return ExecuteResult.success(billDto); + } + +} From ee6c0388dafce13a67a76fcbb89cace61707fd0d Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 14 Apr 2025 09:05:15 +0800 Subject: [PATCH 111/155] update warm-flow 1.6.8 => 1.6.10 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 884d73092..a474f8b66 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 8.7.2-20250101 - 1.6.8 + 1.6.10 3.2.2 From 142fb33d81cf329209b957896895de40a646c687 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, 14 Apr 2025 09:33:36 +0800 Subject: [PATCH 112/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8=E5=8C=85?= =?UTF-8?q?=E8=A3=85=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/domain/event/ProcessEvent.java | 2 +- .../src/main/java/org/dromara/system/domain/vo/MetaVo.java | 6 +++--- .../main/java/org/dromara/system/domain/vo/RouterVo.java | 2 +- .../org/dromara/workflow/domain/vo/ButtonPermissionVo.java | 4 ++-- .../java/org/dromara/workflow/domain/vo/FlowTaskVo.java | 2 +- .../dromara/workflow/service/impl/TestLeaveServiceImpl.java | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java index bc7b78065..7b15b85ae 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java @@ -60,6 +60,6 @@ public class ProcessEvent implements Serializable { /** * 当为true时为申请人节点办理 */ - private boolean submit; + private Boolean submit; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java index f720cd74f..b2c11485c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -25,7 +25,7 @@ public class MetaVo { /** * 设置为true,则不会被 缓存 */ - private boolean noCache; + private Boolean noCache; /** * 内链地址(http(s)://开头) @@ -37,7 +37,7 @@ public class MetaVo { this.icon = icon; } - public MetaVo(String title, String icon, boolean noCache) { + public MetaVo(String title, String icon, Boolean noCache) { this.title = title; this.icon = icon; this.noCache = noCache; @@ -49,7 +49,7 @@ public class MetaVo { this.link = link; } - public MetaVo(String title, String icon, boolean noCache, String link) { + public MetaVo(String title, String icon, Boolean noCache, String link) { this.title = title; this.icon = icon; this.noCache = noCache; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java index 0d576ef15..d56e09da3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -27,7 +27,7 @@ public class RouterVo { /** * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 */ - private boolean hidden; + private Boolean hidden; /** * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java index eb26a4502..7175e5e09 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ButtonPermissionVo.java @@ -30,12 +30,12 @@ public class ButtonPermissionVo implements Serializable { /** * 是否显示 */ - private boolean show; + private Boolean show; public ButtonPermissionVo() { } - public ButtonPermissionVo(String code, boolean show) { + public ButtonPermissionVo(String code, Boolean show) { this.code = code; this.show = show; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java index e3b37ed86..07a22c4f3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java @@ -177,7 +177,7 @@ public class FlowTaskVo implements Serializable { /** * 是否为申请人节点 */ - private boolean applyNode; + private Boolean applyNode; /** * 按钮权限 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 9ecd867ac..4ed393e58 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 @@ -157,7 +157,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { // 办理意见 String message = Convert.toStr(params.get("message")); } - if (processEvent.isSubmit()) { + if (processEvent.getSubmit()) { testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus()); } baseMapper.updateById(testLeave); From 33e1d34ce50a1c8f4a6b04a70c0f05e92c6a42aa 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, 14 Apr 2025 10:09:03 +0800 Subject: [PATCH 113/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=B3=A8=E8=A7=A3=E6=94=AF=E6=8C=81=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/CacheNames.java | 5 ++-- .../redis/manager/PlusSpringCacheManager.java | 26 +++++++++++++------ .../demo/controller/RedisCacheController.java | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index 519034cf2..c38f39b47 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -3,13 +3,14 @@ package org.dromara.common.core.constant; /** * 缓存组名称常量 *

- * key 格式为 cacheNames#ttl#maxIdleTime#maxSize + * key 格式为 cacheNames#ttl#maxIdleTime#maxSize#local *

* ttl 过期时间 如果设置为0则不过期 默认为0 * maxIdleTime 最大空闲时间 根据LRU算法清理空闲数据 如果设置为0则不检测 默认为0 * maxSize 组最大长度 根据LRU算法清理溢出数据 如果设置为0则无限长 默认为0 + * local 默认开启本地缓存为1 关闭本地缓存为0 *

- * 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500 + * 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500、test#1h#0#500#0 * * @author Lion Li */ diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index 740e2a13b..8428ef725 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -145,18 +145,25 @@ public class PlusSpringCacheManager implements CacheManager { if (array.length > 3) { config.setMaxSize(Integer.parseInt(array[3])); } - - if (config.getMaxIdleTime() == 0 && config.getTTL() == 0 && config.getMaxSize() == 0) { - return createMap(name, config); + int local = 1; + if (array.length > 4) { + local = Integer.parseInt(array[4]); } - return createMapCache(name, config); + if (config.getMaxIdleTime() == 0 && config.getTTL() == 0 && config.getMaxSize() == 0) { + return createMap(name, config, local); + } + + return createMapCache(name, config, local); } - private Cache createMap(String name, CacheConfig config) { + private Cache createMap(String name, CacheConfig config, int local) { RMap map = RedisUtils.getClient().getMap(name); - Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, allowNullValues)); + Cache cache = new RedissonCache(map, allowNullValues); + if (local == 1) { + cache = new CaffeineCacheDecorator(name, cache); + } if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } @@ -167,10 +174,13 @@ public class PlusSpringCacheManager implements CacheManager { return cache; } - private Cache createMapCache(String name, CacheConfig config) { + private Cache createMapCache(String name, CacheConfig config, int local) { RMapCache map = RedisUtils.getClient().getMapCache(name); - Cache cache = new CaffeineCacheDecorator(name, new RedissonCache(map, config, allowNullValues)); + Cache cache = new RedissonCache(map, config, allowNullValues); + if (local == 1) { + cache = new CaffeineCacheDecorator(name, cache); + } if (transactionAware) { cache = new TransactionAwareCacheDecorator(cache); } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java index 303cf885d..2335da4cd 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/RedisCacheController.java @@ -40,7 +40,7 @@ public class RedisCacheController { *

* cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数 */ - @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null") + @Cacheable(cacheNames = "demo:cache#60s#10m#20#1", key = "#key", condition = "#key != null") @GetMapping("/test1") public R test1(String key, String value) { return R.ok("操作成功", value); From ea254745290429c032902e7edd149f9e3ca9a955 Mon Sep 17 00:00:00 2001 From: Q&Q <13153393+qlth@user.noreply.gitee.com> Date: Wed, 16 Apr 2025 06:22:07 +0000 Subject: [PATCH 114/155] =?UTF-8?q?!670=20fix=20=E4=BF=AE=E5=A4=8D=20sqlse?= =?UTF-8?q?rver=20=E8=84=9A=E6=9C=AC=E5=86=85=E7=9A=84=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7=20*=20fix=20=E4=BF=AE=E5=A4=8D=20sqlserver?= =?UTF-8?q?=20=E8=84=9A=E6=9C=AC=E5=86=85=E7=9A=84=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index c5df3e8d2..f64d8f804 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -1239,7 +1239,7 @@ INSERT sys_dict_data VALUES (18, N'000000', 1, N'新增', N'1', N'sys_oper_type' GO INSERT sys_dict_data VALUES (19, N'000000', 2, N'修改', N'2', N'sys_oper_type', N'', N'info', N'N', 103, 1, getdate(), NULL, NULL, N'修改操作') GO -INSERT sys_dict_data VALUES (20, N'000000', 3, N'删除', N3, N'sys_oper_type', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'删除操作') +INSERT sys_dict_data VALUES (20, N'000000', 3, N'删除', N'3', N'sys_oper_type', N'', N'danger', N'N', 103, 1, getdate(), NULL, NULL, N'删除操作') GO INSERT sys_dict_data VALUES (21, N'000000', 4, N'授权', N'4', N'sys_oper_type', N'', N'primary', N'N', 103, 1, getdate(), NULL, NULL, N'授权操作') GO @@ -3180,7 +3180,7 @@ INSERT INTO sys_oss_config VALUES (N'1', N'000000', N'minio', N'ruoyi', GO INSERT INTO sys_oss_config VALUES (N'2', N'000000', N'qiniu', N'XXXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi', N'', N's3-cn-north-1.qiniucs.com', N'',N'N', N'', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL) GO -INSERT INTO sys_oss_config VALUES (N3, N'000000', N'aliyun', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi', N'', N'oss-cn-beijing.aliyuncs.com', N'',N'N', N'', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL) +INSERT INTO sys_oss_config VALUES (N'3', N'000000', N'aliyun', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi', N'', N'oss-cn-beijing.aliyuncs.com', N'',N'N', N'', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL) GO INSERT INTO sys_oss_config VALUES (N'4', N'000000', N'qcloud', N'XXXXXXXXXXXXXXX', N'XXXXXXXXXXXXXXX', N'ruoyi-1250000000', N'', N'cos.ap-beijing.myqcloud.com', N'',N'N', N'ap-beijing', N'1', N'1', N'', 103, 1, getdate(), 1, getdate(), NULL) GO From 7c2efb1aefdd004ae45672896138e3fdb97886c0 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: Thu, 17 Apr 2025 14:00:13 +0800 Subject: [PATCH 115/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20getNextNo?= =?UTF-8?q?deList=20=E5=8F=AA=E8=8E=B7=E5=8F=96=E4=B8=AD=E9=97=B4=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=94=A8=E4=BA=8E=E5=AE=A1=E6=89=B9=20=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=85=B6=E4=BB=96=E6=97=A0=E7=94=A8=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/workflow/service/impl/FlwTaskServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 90c96a4f4..5685ac3dc 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 @@ -587,13 +587,15 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = insService.getById(task.getInstanceId()); Definition definition = defService.getById(task.getDefinitionId()); Map mergeVariable = MapUtil.mergeAll(instance.getVariableMap(), variables); - //获取下一节点列表 + // 获取下一节点列表 List nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), mergeVariable); List nextFlowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class); + // 只获取中间节点 + nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType())); if (CollUtil.isNotEmpty(nextNodeList)) { - //构建以下节点数据 + // 构建以下节点数据 List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null)); - //办理人变量替换 + // 办理人变量替换 ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable); for (FlowNode flowNode : nextFlowNodes) { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { From 3b46f8c8cf4ef4e6b4a6f28c4f9ca408882bd384 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 18 Apr 2025 11:48:31 +0800 Subject: [PATCH 116/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=BB=BB=E5=8A=A1=E6=8C=87=E6=B4=BE=E7=9A=84=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0=E6=97=B6=E9=97=B4=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/service/impl/SysDeptServiceImpl.java | 4 ++++ .../org/dromara/system/service/impl/SysPostServiceImpl.java | 4 ++++ .../system/service/impl/SysTaskAssigneeServiceImpl.java | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 98aad216b..5e4904d05 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * 部门管理 服务实现 @@ -92,6 +93,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { } private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { + Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(SysDept::getDelFlag, SystemConstants.NORMAL); lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); @@ -99,6 +101,8 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysDept::getCreateTime, params.get("beginTime"), params.get("endTime")); lqw.orderByAsc(SysDept::getAncestors); lqw.orderByAsc(SysDept::getParentId); lqw.orderByAsc(SysDept::getOrderNum); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 894f6acc8..122492e0c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * 岗位信息 服务层处理 @@ -76,11 +77,14 @@ public class SysPostServiceImpl implements ISysPostService, PostService { * @return 构建好的查询包装器 */ private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { + Map params = bo.getParams(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()) .like(StringUtils.isNotBlank(bo.getPostCategory()), SysPost::getPostCategory, bo.getPostCategory()) .like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()) .eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysPost::getCreateTime, params.get("beginTime"), params.get("endTime")) .orderByAsc(SysPost::getPostSort); if (ObjectUtil.isNotNull(bo.getDeptId())) { //优先单部门搜索 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java index d4f2c0d4e..31e9be902 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaskAssigneeServiceImpl.java @@ -49,8 +49,8 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { public TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery) { PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum()); SysRoleBo bo = new SysRoleBo(); - bo.setRoleName(taskQuery.getHandlerCode()); - bo.setRoleKey(taskQuery.getHandlerName()); + bo.setRoleKey(taskQuery.getHandlerCode()); + bo.setRoleName(taskQuery.getHandlerName()); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); From 2a34c3ebb283dff31f53533457e02c2339ba4952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E9=93=83=E8=96=AF=E5=A4=B4?= <5601833+xlsea@user.noreply.gitee.com> Date: Fri, 18 Apr 2025 05:30:12 +0000 Subject: [PATCH 117/155] =?UTF-8?q?!672=20fix:=20=E4=BF=AE=E5=A4=8D=20exce?= =?UTF-8?q?l=20=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83=E6=A0=BC=E5=9C=A8?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=9C=A8=E6=9C=80=E5=90=8E=E4=B8=80=E8=A1=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=90=88=E5=B9=B6=E6=97=B6=EF=BC=8C=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E7=9A=84=E6=95=B0=E6=8D=AE=E5=90=88=E5=B9=B6=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98=20*=20fix:=20=E4=BF=AE=E5=A4=8D=20e?= =?UTF-8?q?xcel=20=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83=E6=A0=BC=E5=9C=A8?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=9C=A8=E6=9C=80=E5=90=8E=E4=B8=80=E8=A1=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=90=88=E5=B9=B6=E6=97=B6=EF=BC=8C=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E7=9A=84=E6=95=B0=E6=8D=AE=E5=90=88=E5=B9=B6=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/excel/core/CellMergeStrategy.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java index 7c7721c60..1c7d97fc4 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java @@ -112,7 +112,13 @@ public class CellMergeStrategy extends AbstractMergeStrategy implements Workbook } map.put(field, new RepeatCell(val, i)); } else if (i == list.size() - 1) { - if (i > repeatCell.getCurrent() && isMerge(list, i, field)) { + if (!isMerge(list, i, field)) { + // 如果最后一行不能合并,检查之前的数据是否需要合并 + if (i - repeatCell.getCurrent() > 1) { + cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex - 1, colNum, colNum)); + } + } else if (i > repeatCell.getCurrent()) { + // 如果最后一行可以合并,则直接合并到最后 cellList.add(new CellRangeAddress(repeatCell.getCurrent() + rowIndex, i + rowIndex, colNum, colNum)); } } else if (!isMerge(list, i, field)) { From ae65985fbcd1d41b3e51a3cc2dacd315e90398a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=99=E5=A4=8F=E5=A4=A9=E4=BE=9D=E7=84=B6=E5=B9=B3?= =?UTF-8?q?=E5=87=A1?= <1822213252@qq.com> Date: Fri, 18 Apr 2025 09:30:33 +0000 Subject: [PATCH 118/155] =?UTF-8?q?!668=20update=20EasyExcel=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E5=8E=9F=E4=BD=9C=E8=80=85FastExcel=20*=20remove=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B9=8B=E5=89=8D=E6=9A=82=E6=97=B6=E6=80=A7?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=BC=8F=E6=B4=9E=E4=BE=9D=E8=B5=96=20*=20up?= =?UTF-8?q?date=20EasyExcel=E5=8D=87=E7=BA=A71.2.0=E5=B9=B6=E5=8D=87?= =?UTF-8?q?=E7=BA=A7commons-io=E5=88=B0=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=AF=BC=E5=87=BA=E6=8A=A5=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=89=BE=E4=B8=8D=E5=88=B0=E5=BC=82=E5=B8=B8=20*=20update=20Ea?= =?UTF-8?q?syExcel=E5=8D=87=E7=BA=A7=E5=8E=9F=E4=BD=9C=E8=80=85FastExcel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 14 +++----- ruoyi-common/ruoyi-common-excel/pom.xml | 4 +-- .../excel/convert/ExcelBigNumberConvert.java | 12 +++---- .../excel/convert/ExcelDictConvert.java | 12 +++---- .../excel/convert/ExcelEnumConvert.java | 12 +++---- .../common/excel/core/CellMergeStrategy.java | 10 +++--- .../excel/core/DefaultExcelListener.java | 8 ++--- .../common/excel/core/ExcelDownHandler.java | 12 +++---- .../common/excel/core/ExcelListener.java | 2 +- .../excel/handler/DataWriteHandler.java | 18 +++++----- .../dromara/common/excel/utils/ExcelUtil.java | 34 +++++++++---------- .../demo/domain/bo/TestDemoImportVo.java | 2 +- .../dromara/demo/domain/vo/ExportDemoVo.java | 4 +-- .../dromara/demo/domain/vo/TestDemoVo.java | 4 +-- .../dromara/demo/domain/vo/TestTreeVo.java | 4 +-- .../demo/listener/ExportDemoListener.java | 2 +- .../src/main/resources/vm/java/vo.java.vm | 4 +-- .../dromara/system/domain/vo/SysClientVo.java | 4 +-- .../dromara/system/domain/vo/SysConfigVo.java | 4 +-- .../dromara/system/domain/vo/SysDeptVo.java | 4 +-- .../system/domain/vo/SysDictDataVo.java | 4 +-- .../system/domain/vo/SysDictTypeVo.java | 4 +-- .../system/domain/vo/SysLogininforVo.java | 4 +-- .../system/domain/vo/SysOperLogVo.java | 4 +-- .../system/domain/vo/SysOssConfigVo.java | 2 +- .../dromara/system/domain/vo/SysPostVo.java | 4 +-- .../dromara/system/domain/vo/SysRoleVo.java | 4 +-- .../system/domain/vo/SysTenantPackageVo.java | 4 +-- .../dromara/system/domain/vo/SysTenantVo.java | 4 +-- .../system/domain/vo/SysUserExportVo.java | 2 +- .../system/domain/vo/SysUserImportVo.java | 2 +- .../listener/SysUserImportListener.java | 4 +-- .../workflow/domain/vo/FlowCategoryVo.java | 4 +-- .../workflow/domain/vo/TestLeaveVo.java | 4 +-- 34 files changed, 107 insertions(+), 113 deletions(-) diff --git a/pom.xml b/pom.xml index a474f8b66..726b6727c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 3.5.16 2.8.5 0.15.0 - 4.0.3 + 1.2.0 2.3 1.42.0 3.5.11 @@ -166,9 +166,9 @@ - com.alibaba - easyexcel - ${easyexcel.version} + cn.idev.excel + fastexcel + ${fastexcel.version} @@ -321,12 +321,6 @@ ${ip2region.version} - - commons-io - commons-io - 2.15.0 - - com.alibaba fastjson diff --git a/ruoyi-common/ruoyi-common-excel/pom.xml b/ruoyi-common/ruoyi-common-excel/pom.xml index dd4a5eebe..47ba5284b 100644 --- a/ruoyi-common/ruoyi-common-excel/pom.xml +++ b/ruoyi-common/ruoyi-common-excel/pom.xml @@ -22,8 +22,8 @@ - com.alibaba - easyexcel + cn.idev.excel + fastexcel 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 07cc4c4e7..c6beb5537 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 @@ -2,12 +2,12 @@ package org.dromara.common.excel.convert; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.ReadCellData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java index 61eeabfd7..c54816f76 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelDictConvert.java @@ -3,12 +3,12 @@ package org.dromara.common.excel.convert; import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.ReadCellData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.SpringUtils; diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java index b948ea7ee..5723e61e8 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/convert/ExcelEnumConvert.java @@ -3,12 +3,12 @@ package org.dromara.common.excel.convert; import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.excel.converters.Converter; -import com.alibaba.excel.enums.CellDataTypeEnum; -import com.alibaba.excel.metadata.GlobalConfiguration; -import com.alibaba.excel.metadata.data.ReadCellData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.metadata.property.ExcelContentProperty; +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.excel.annotation.ExcelEnumFormat; import lombok.extern.slf4j.Slf4j; diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java index 1c7d97fc4..515f68e1b 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java @@ -3,11 +3,11 @@ package org.dromara.common.excel.core; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.annotation.ExcelProperty; -import com.alibaba.excel.metadata.Head; -import com.alibaba.excel.write.handler.WorkbookWriteHandler; -import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext; -import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.metadata.Head; +import cn.idev.excel.write.handler.WorkbookWriteHandler; +import cn.idev.excel.write.handler.context.WorkbookWriteHandlerContext; +import cn.idev.excel.write.merge.AbstractMergeStrategy; import lombok.AllArgsConstructor; import lombok.Data; import lombok.SneakyThrows; diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java index b6fa0b434..e715c5fc3 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/DefaultExcelListener.java @@ -1,10 +1,10 @@ package org.dromara.common.excel.core; import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.exception.ExcelAnalysisException; -import com.alibaba.excel.exception.ExcelDataConvertException; +import cn.idev.excel.context.AnalysisContext; +import cn.idev.excel.event.AnalysisEventListener; +import cn.idev.excel.exception.ExcelAnalysisException; +import cn.idev.excel.exception.ExcelDataConvertException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; 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 d10ec70e6..4cda8587f 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 @@ -5,12 +5,12 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.metadata.FieldCache; -import com.alibaba.excel.metadata.FieldWrapper; -import com.alibaba.excel.util.ClassUtils; -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import cn.idev.excel.metadata.FieldCache; +import cn.idev.excel.metadata.FieldWrapper; +import cn.idev.excel.util.ClassUtils; +import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java index 2d0340f25..957b30755 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/ExcelListener.java @@ -1,6 +1,6 @@ package org.dromara.common.excel.core; -import com.alibaba.excel.read.listener.ReadListener; +import cn.idev.excel.read.listener.ReadListener; /** * Excel 导入监听 diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java index a2aa4951b..259f8225b 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java @@ -1,15 +1,15 @@ package org.dromara.common.excel.handler; import cn.hutool.core.collection.CollUtil; -import com.alibaba.excel.metadata.data.DataFormatData; -import com.alibaba.excel.metadata.data.WriteCellData; -import com.alibaba.excel.util.StyleUtil; -import com.alibaba.excel.write.handler.CellWriteHandler; -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.style.WriteCellStyle; -import com.alibaba.excel.write.metadata.style.WriteFont; +import cn.idev.excel.metadata.data.DataFormatData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.util.StyleUtil; +import cn.idev.excel.write.handler.CellWriteHandler; +import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.handler.context.CellWriteHandlerContext; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.style.WriteCellStyle; +import cn.idev.excel.write.metadata.style.WriteFont; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFRichTextString; diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 70ab31d9c..1b35e559a 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -3,13 +3,13 @@ package org.dromara.common.excel.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.util.IdUtil; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; -import com.alibaba.excel.write.metadata.WriteSheet; -import com.alibaba.excel.write.metadata.fill.FillConfig; -import com.alibaba.excel.write.metadata.fill.FillWrapper; -import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import cn.idev.excel.FastExcel; +import cn.idev.excel.ExcelWriter; +import cn.idev.excel.write.builder.ExcelWriterSheetBuilder; +import cn.idev.excel.write.metadata.WriteSheet; +import cn.idev.excel.write.metadata.fill.FillConfig; +import cn.idev.excel.write.metadata.fill.FillWrapper; +import cn.idev.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.AccessLevel; @@ -43,7 +43,7 @@ public class ExcelUtil { * @return 转换后集合 */ public static List importExcel(InputStream is, Class clazz) { - return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); + return FastExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); } @@ -57,7 +57,7 @@ public class ExcelUtil { */ public static ExcelResult importExcel(InputStream is, Class clazz, boolean isValidate) { DefaultExcelListener listener = new DefaultExcelListener<>(isValidate); - EasyExcel.read(is, clazz, listener).sheet().doRead(); + FastExcel.read(is, clazz, listener).sheet().doRead(); return listener.getExcelResult(); } @@ -70,7 +70,7 @@ public class ExcelUtil { * @return 转换后集合 */ public static ExcelResult importExcel(InputStream is, Class clazz, ExcelListener listener) { - EasyExcel.read(is, clazz, listener).sheet().doRead(); + FastExcel.read(is, clazz, listener).sheet().doRead(); return listener.getExcelResult(); } @@ -186,7 +186,7 @@ public class ExcelUtil { */ public static void exportExcel(List list, String sheetName, Class clazz, boolean merge, OutputStream os, List options) { - ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz) + ExcelWriterSheetBuilder builder = FastExcel.write(os, clazz) .autoCloseStream(false) // 自动适配 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) @@ -237,14 +237,14 @@ public class ExcelUtil { */ public static void exportTemplate(List data, String templatePath, OutputStream os) { ClassPathResource templateResource = new ClassPathResource(templatePath); - ExcelWriter excelWriter = EasyExcel.write(os) + ExcelWriter excelWriter = FastExcel.write(os) .withTemplate(templateResource.getStream()) .autoCloseStream(false) // 大数值自动转换 防止失真 .registerConverter(new ExcelBigNumberConvert()) .registerWriteHandler(new DataWriteHandler(data.get(0).getClass())) .build(); - WriteSheet writeSheet = EasyExcel.writerSheet().build(); + WriteSheet writeSheet = FastExcel.writerSheet().build(); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 单表多数据导出 模板格式为 {.属性} for (T d : data) { @@ -310,13 +310,13 @@ public class ExcelUtil { */ public static void exportTemplateMultiList(Map data, String templatePath, OutputStream os) { ClassPathResource templateResource = new ClassPathResource(templatePath); - ExcelWriter excelWriter = EasyExcel.write(os) + ExcelWriter excelWriter = FastExcel.write(os) .withTemplate(templateResource.getStream()) .autoCloseStream(false) // 大数值自动转换 防止失真 .registerConverter(new ExcelBigNumberConvert()) .build(); - WriteSheet writeSheet = EasyExcel.writerSheet().build(); + WriteSheet writeSheet = FastExcel.writerSheet().build(); for (Map.Entry map : data.entrySet()) { // 设置列表后续还有数据 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); @@ -341,14 +341,14 @@ public class ExcelUtil { */ public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { ClassPathResource templateResource = new ClassPathResource(templatePath); - ExcelWriter excelWriter = EasyExcel.write(os) + ExcelWriter excelWriter = FastExcel.write(os) .withTemplate(templateResource.getStream()) .autoCloseStream(false) // 大数值自动转换 防止失真 .registerConverter(new ExcelBigNumberConvert()) .build(); for (int i = 0; i < data.size(); i++) { - WriteSheet writeSheet = EasyExcel.writerSheet(i).build(); + WriteSheet writeSheet = FastExcel.writerSheet(i).build(); for (Map.Entry map : data.get(i).entrySet()) { // 设置列表后续还有数据 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java index c0661185e..dc8b35f49 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoImportVo.java @@ -1,6 +1,6 @@ package org.dromara.demo.domain.bo; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelProperty; import lombok.Data; import jakarta.validation.constraints.NotBlank; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java index ef9058ed5..b42ce7679 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ExportDemoVo.java @@ -1,7 +1,7 @@ package org.dromara.demo.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index e7ea8075c..c6595b0e2 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -1,7 +1,7 @@ package org.dromara.demo.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelNotation; import org.dromara.common.excel.annotation.ExcelRequired; import org.dromara.common.translation.annotation.Translation; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java index 58b4bdbc0..ee2336ac5 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestTreeVo.java @@ -1,7 +1,7 @@ package org.dromara.demo.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.demo.domain.TestTree; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java index 7bd4e1eea..de927609f 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/listener/ExportDemoListener.java @@ -1,7 +1,7 @@ package org.dromara.demo.listener; import cn.hutool.core.util.NumberUtil; -import com.alibaba.excel.context.AnalysisContext; +import cn.idev.excel.context.AnalysisContext; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm index 5591f9778..480394c72 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo.java.vm @@ -4,8 +4,8 @@ package ${packageName}.domain.vo; import ${import}; #end import ${packageName}.domain.${ClassName}; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java index 34f24eb36..82b0f46ca 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysClientVo.java @@ -1,8 +1,8 @@ package org.dromara.system.domain.vo; import org.dromara.system.domain.SysClient; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java index f896000a3..a35e1323c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysConfig; 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 1f182a248..c9f5a1faf 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 @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java index 83ea619af..d97c00d1b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysDictData; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java index e6a184fcf..4b62226e2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysDictType; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java index de19aeabd..3086aa74a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -1,8 +1,8 @@ package org.dromara.system.domain.vo; import java.util.Date; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysLogininfor; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java index d9eb71d40..00b334432 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysOperLog; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java index e7cfde4fe..a030722d5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOssConfigVo.java @@ -1,6 +1,6 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import org.dromara.system.domain.SysOssConfig; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java index 69be547a0..50140b6f1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index 1913170ed..1a205cc74 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.core.constant.SystemConstants; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java index 070334b41..ead9229b9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -1,7 +1,7 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysTenantPackage; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java index 6a453150e..021c66488 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -1,8 +1,8 @@ package org.dromara.system.domain.vo; import java.util.Date; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.system.domain.SysTenant; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java index 37ec6b709..913ab2001 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -1,6 +1,6 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java index c34a23cd9..d4e575c14 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -1,6 +1,6 @@ package org.dromara.system.domain.vo; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import lombok.Data; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java index 25b62a9d9..66db5f578 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -4,8 +4,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.digest.BCrypt; import cn.hutool.http.HtmlUtil; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; +import cn.idev.excel.context.AnalysisContext; +import cn.idev.excel.event.AnalysisEventListener; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import org.dromara.common.core.exception.ServiceException; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java index f1c4caad5..db236c2df 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowCategoryVo.java @@ -1,7 +1,7 @@ package org.dromara.workflow.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.workflow.domain.FlowCategory; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 47886d721..741949f79 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -1,7 +1,7 @@ package org.dromara.workflow.domain.vo; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.workflow.domain.TestLeave; From 7ecf4bbf1ca85aeb1d6673870439d0052122e1fa 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: Fri, 18 Apr 2025 17:47:05 +0800 Subject: [PATCH 119/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=85=B3?= =?UTF-8?q?=E4=BA=8Eexcel=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/org/dromara/common/excel/core/ExcelDownHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a37615025..64384d3e1 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11
| 邮件 | 采用 mail-api 通用协议支持大部分邮件厂商 | 不支持 | | 接口文档 | 采用 SpringDoc、javadoc 无注解零入侵基于java注释
只需把注释写好 无需再写一大堆的文档注解了 | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成 | | 校验框架 | 采用 Validation 支持注解与工具类校验 注解支持国际化 | 仅支持注解 且注解不支持国际化 | -| Excel框架 | 采用 Alibaba EasyExcel 基于插件化
框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 | +| Excel框架 | 采用 FastExcel(原Alibaba EasyExcel) 基于插件化
框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 | | 工作流支持 | 支持各种复杂审批 转办 委派 加减签 会签 或签 票签 等功能 | 无 | | 工具类框架 | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码 | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等 | | 监控框架 | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制
实时监控服务状态 框架还为其扩展了在线日志查看监控 | 无 | 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 4cda8587f..f3b641545 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 @@ -175,7 +175,7 @@ public class ExcelDownHandler implements SheetWriteHandler { List firstOptions = options.getOptions(); Map> secoundOptionsMap = options.getNextOptions(); - // 采用按行填充数据的方式,避免EasyExcel出现数据无法写入的问题 + // 采用按行填充数据的方式,避免出现数据无法写入的问题 // Attempting to write a row in the range that is already written to disk // 使用ArrayList记载数据,防止乱序 From 3f680385a9874d19a4a78e3dc5ed389e53e80745 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: Tue, 22 Apr 2025 16:08:38 +0800 Subject: [PATCH 120/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 64384d3e1..ec44c16d9 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus) [![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/dromara/RuoYi-Vue-Plus) [![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/master/LICENSE) +[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) From d7d7dcbcf7d59afadc042e32e2e1d5ff78983e11 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 23 Apr 2025 12:30:07 +0800 Subject: [PATCH 121/155] =?UTF-8?q?docs=20=E4=BC=98=E5=8C=96=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E7=B1=BB=E5=9E=8B=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/enums/DeviceType.java | 6 ++++-- .../java/org/dromara/common/core/enums/UserType.java | 12 +++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java index dbadfc2de..1667ac7bb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java @@ -5,7 +5,6 @@ import lombok.Getter; /** * 设备类型 - * 针对一套 用户体系 * * @author Lion Li */ @@ -29,9 +28,12 @@ public enum DeviceType { XCX("xcx"), /** - * social第三方端 + * 第三方社交登录平台 */ SOCIAL("social"); + /** + * 设备标识 + */ private final String device; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java index 69e4753cf..636988f2f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/UserType.java @@ -1,12 +1,11 @@ package org.dromara.common.core.enums; -import org.dromara.common.core.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; /** - * 设备类型 - * 针对多套 用户体系 + * 用户类型 * * @author Lion Li */ @@ -15,15 +14,18 @@ import lombok.Getter; public enum UserType { /** - * pc端 + * 后台系统用户 */ SYS_USER("sys_user"), /** - * app端 + * 移动客户端用户 */ APP_USER("app_user"); + /** + * 用户类型标识(用于 token、权限识别等) + */ private final String userType; public static UserType getUserType(String str) { From 21deab4bf1689493ed3153ed5863fb2c4c49345c 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: Fri, 25 Apr 2025 09:51:55 +0800 Subject: [PATCH 122/155] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ec44c16d9..cc50af628 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,6 @@ Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11
| 系统接口 | 根据业务代码自动生成相关的api接口文档 | 支持 | 支持 | | 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等 | 支持 | 仅支持单机CPU、内存、磁盘监控 | | 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 | -| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 | | 使用案例 | 系统的一些功能案例 | 支持 | 不支持 | ## 参考文档 From e4f1da30fca3140e675d0139d5901ab585f44393 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 25 Apr 2025 13:38:41 +0800 Subject: [PATCH 123/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E4=B8=8E=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/utils/DateUtils.java | 25 ++++++++++++++----- .../common/core/utils/StringUtils.java | 23 +++++++++++++++++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java index 41d0f6c25..b52d95e16 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java @@ -175,14 +175,27 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { } /** - * 计算两个日期之间的天数差(以毫秒为单位) + * 计算两个时间之间的时间差,并以指定单位返回(绝对值) * - * @param date1 第一个日期 - * @param date2 第二个日期 - * @return 两个日期之间的天数差的绝对值 + * @param start 起始时间 + * @param end 结束时间 + * @param unit 所需返回的时间单位(DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、MICROSECONDS、NANOSECONDS) + * @return 时间差的绝对值,以指定单位表示 */ - public static int differentDaysByMillisecond(Date date1, Date date2) { - return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + public static long difference(Date start, Date end, TimeUnit unit) { + // 计算时间差,单位为毫秒,取绝对值避免负数 + long diffInMillis = Math.abs(end.getTime() - start.getTime()); + + // 根据目标单位转换时间差 + return switch (unit) { + case DAYS -> diffInMillis / TimeUnit.DAYS.toMillis(1); + case HOURS -> diffInMillis / TimeUnit.HOURS.toMillis(1); + case MINUTES -> diffInMillis / TimeUnit.MINUTES.toMillis(1); + case SECONDS -> diffInMillis / TimeUnit.SECONDS.toMillis(1); + case MILLISECONDS -> diffInMillis; + case MICROSECONDS -> TimeUnit.MILLISECONDS.toMicros(diffInMillis); + case NANOSECONDS -> TimeUnit.MILLISECONDS.toNanos(diffInMillis); + }; } /** diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java index 0363ad4b5..716573431 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -6,6 +6,7 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import org.springframework.util.AntPathMatcher; +import java.nio.charset.Charset; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -339,4 +340,26 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { return false; } + /** + * 将字符串从源字符集转换为目标字符集 + * + * @param input 原始字符串 + * @param fromCharset 源字符集 + * @param toCharset 目标字符集 + * @return 转换后的字符串 + */ + public static String convert(String input, Charset fromCharset, Charset toCharset) { + if (isBlank(input)) { + return input; + } + try { + // 从源字符集获取字节 + byte[] bytes = input.getBytes(fromCharset); + // 使用目标字符集解码 + return new String(bytes, toCharset); + } catch (Exception e) { + return input; + } + } + } From 9fbe3cf3993cc5c58093b5cec7067d76a35c3943 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: Fri, 25 Apr 2025 16:40:13 +0800 Subject: [PATCH 124/155] update springboot 3.4.4 => 3.4.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 726b6727c..ebec03645 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ 5.3.1 - 3.4.4 + 3.4.5 UTF-8 UTF-8 17 From f29e0223a7485d797c3715ffe8b17ea8c1c7e39f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Sat, 26 Apr 2025 00:11:58 +0800 Subject: [PATCH 125/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=9C=B0=E5=9D=80=E6=94=AF=E6=8C=81IPv6=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E8=80=8C=E4=B8=8D=E6=98=AF=E6=8A=9B=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/utils/NetUtils.java | 84 +++++++++++++++++++ .../common/core/utils/ip/AddressUtils.java | 13 +-- 2 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java new file mode 100644 index 000000000..72fdf4033 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/NetUtils.java @@ -0,0 +1,84 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.lang.PatternPool; +import cn.hutool.core.net.NetUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.regex.RegexUtils; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 增强网络相关工具类 + * + * @author 秋辞未寒 + */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class NetUtils extends NetUtil { + + /** + * 判断是否为IPv6地址 + * + * @param ip IP地址 + * @return 是否为IPv6地址 + */ + public static boolean isIPv6(String ip) { + try { + // 判断是否为IPv6地址 + return InetAddress.getByName(ip) instanceof Inet6Address; + } catch (UnknownHostException e) { + return false; + } + } + + /** + * 判断IPv6地址是否为内网地址 + *

+ * 以下地址将归类为本地地址,如有业务场景有需要,请根据需求自行处理: + *

+     * 通配符地址 0:0:0:0:0:0:0:0
+     * 链路本地地址 fe80::/10
+     * 唯一本地地址 fec0::/10
+     * 环回地址 ::1
+     * 
+ * + * @param ip IP地址 + * @return 是否为内网地址 + */ + public static boolean isInnerIPv6(String ip) { + try { + // 判断是否为IPv6地址 + if (InetAddress.getByName(ip) instanceof Inet6Address inet6Address) { + // isAnyLocalAddress 判断是否为通配符地址,通常不会将其视为内网地址,根据业务场景自行处理判断 + // isLinkLocalAddress 判断是否为链路本地地址,通常不算内网地址,是否划分归属于内网需要根据业务场景自行处理判断 + // isLoopbackAddress 判断是否为环回地址,与IPv4的 127.0.0.1 同理,用于表示本机 + // isSiteLocalAddress 判断是否为本地站点地址,IPv6唯一本地地址(Unique Local Addresses,简称ULA) + if (inet6Address.isAnyLocalAddress() + || inet6Address.isLinkLocalAddress() + || inet6Address.isLoopbackAddress() + || inet6Address.isSiteLocalAddress()) { + return true; + } + } + } catch (UnknownHostException e) { + // 注意,isInnerIPv6方法和isIPv6方法的适用范围不同,所以此处不能忽略其异常信息。 + throw new IllegalArgumentException("Invalid IPv6 address!", e); + } + return false; + } + + /** + * 判断是否为IPv4地址 + * + * @param ip IP地址 + * @return 是否为IPv4地址 + */ + public static boolean isIPv4(String ip) { + return RegexUtils.isMatch(PatternPool.IPV4, ip); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java index 3f7cd57a9..2878078f1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -1,11 +1,11 @@ package org.dromara.common.core.utils.ip; -import cn.hutool.core.net.NetUtil; import cn.hutool.http.HtmlUtil; -import org.dromara.common.core.utils.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.NetUtils; +import org.dromara.common.core.utils.StringUtils; /** * 获取地址类 @@ -20,14 +20,17 @@ public class AddressUtils { public static final String UNKNOWN = "XX XX"; public static String getRealAddressByIP(String ip) { - if (StringUtils.isBlank(ip)) { + // 处理空串并过滤HTML标签 + ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip,"")); + // 判断是否为IPv4或IPv6,如果不是则返回未知地址 + if (!NetUtils.isIPv4(ip) && !NetUtils.isIPv6(ip)) { return UNKNOWN; } // 内网不查询 - ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); - if (NetUtil.isInnerIP(ip)) { + if (NetUtils.isInnerIPv6(ip) || NetUtils.isInnerIP(ip)) { return "内网IP"; } return RegionUtils.getCityInfo(ip); } + } From 1c5ae2f16806d1be3e771831e5a03e27b05ba778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Sat, 26 Apr 2025 00:20:34 +0800 Subject: [PATCH 126/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=9C=B0=E5=9D=80=E6=94=AF=E6=8C=81IPv6=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/utils/ip/AddressUtils.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java index 2878078f1..104734465 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -22,14 +22,21 @@ public class AddressUtils { public static String getRealAddressByIP(String ip) { // 处理空串并过滤HTML标签 ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip,"")); + boolean isIPv6 = NetUtils.isIPv6(ip); // 判断是否为IPv4或IPv6,如果不是则返回未知地址 - if (!NetUtils.isIPv4(ip) && !NetUtils.isIPv6(ip)) { + if (!NetUtils.isIPv4(ip) && !isIPv6) { return UNKNOWN; } // 内网不查询 if (NetUtils.isInnerIPv6(ip) || NetUtils.isInnerIP(ip)) { return "内网IP"; } + // 不支持IPv6,不再进行没有必要的IP地址信息的解析,直接返回 + if (isIPv6) { + log.warn("ip2region不支持IPV6地址解析:{}", ip); + // 如有需要,可自行实现IPv6地址信息解析逻辑,并在这里返回 + return "未知"; + } return RegionUtils.getCityInfo(ip); } From 15905b702270b39b3196f9ac103fc3afc78cc1ae Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 26 Apr 2025 12:52:36 +0800 Subject: [PATCH 127/155] =?UTF-8?q?update=20=E6=94=BE=E5=BC=80=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E4=BA=BA=E9=99=84=E4=BB=B6=E4=B8=8E=E6=8A=84=E9=80=81?= =?UTF-8?q?=E9=99=90=E5=88=B6=20=E9=99=84=E4=BB=B6=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/ButtonPermissionEnum.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java index 7a224051d..598cd05ce 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java @@ -50,7 +50,12 @@ public enum ButtonPermissionEnum implements NodeExtEnum { /** * 是否能终止 */ - TERMINATION("是否能终止", "termination", true); + TERMINATION("是否能终止", "termination", true), + + /** + * 是否能上传附件 + */ + FILE("是否能上传附件", "file", true); private final String label; private final String value; From e1e3843ec0bc9c262587c5b03537986636f68b4c 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: Sun, 27 Apr 2025 22:09:14 +0800 Subject: [PATCH 128/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20snailjob=20h?= =?UTF-8?q?ttp=20basic=E9=AA=8C=E8=AF=81=E5=88=A4=E6=96=AD=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../snailjob/server/starter/filter/ActuatorAuthFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java index e3a6892fa..00f6eee13 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java +++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/java/com/aizuda/snailjob/server/starter/filter/ActuatorAuthFilter.java @@ -44,7 +44,7 @@ public class ActuatorAuthFilter implements Filter { return; } // 验证用户名和密码 - if (!username.equals(split[0]) && password.equals(split[1])) { + if (!username.equals(split[0]) || !password.equals(split[1])) { response.setHeader("WWW-Authenticate", "Basic realm=\"realm\""); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); return; From 6d44069364cf634788d11316eba7998d84d8769d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E9=93=83=E8=96=AF=E5=A4=B4?= <5601833+xlsea@user.noreply.gitee.com> Date: Tue, 29 Apr 2025 08:29:46 +0000 Subject: [PATCH 129/155] =?UTF-8?q?!675=20update=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=8F=9C=E5=8D=95=E5=88=97=E8=A1=A8=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=8F=9C=E5=8D=95=E7=B1=BB=E5=9E=8B=E4=B8=8E=E7=88=B6?= =?UTF-8?q?=E7=BA=A7ID=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=20*=20update=20?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=B3=BB=E7=BB=9F=E8=8F=9C=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=96=B0=E5=A2=9E=E8=8F=9C=E5=8D=95=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=B8=8E=E7=88=B6=E7=BA=A7ID=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/service/impl/SysMenuServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 40643e13d..19048abc4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -71,6 +71,8 @@ public class SysMenuServiceImpl implements ISysMenuService { .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) + .eq(StringUtils.isNotBlank(menu.getMenuType()), SysMenu::getMenuType, menu.getMenuType()) + .eq(ObjectUtil.isNotNull(menu.getParentId()), SysMenu::getParentId, menu.getParentId()) .orderByAsc(SysMenu::getParentId) .orderByAsc(SysMenu::getOrderNum)); } else { @@ -79,6 +81,8 @@ public class SysMenuServiceImpl implements ISysMenuService { .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .eq(StringUtils.isNotBlank(menu.getMenuType()), "m.menu_type", menu.getMenuType()) + .eq(ObjectUtil.isNotNull(menu.getParentId()), "m.parent_id", menu.getParentId()) .orderByAsc("m.parent_id") .orderByAsc("m.order_num"); List list = baseMapper.selectMenuListByUserId(wrapper); From 5e510773475b47fe4375db143583da1e6b08c1ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Tue, 29 Apr 2025 19:01:45 +0800 Subject: [PATCH 130/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E4=BB=8EClassPath=E5=8A=A0=E8=BD=BDip2region=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/ip/RegionUtils.java | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java index 6e2a44e00..c9e867899 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java @@ -1,15 +1,12 @@ package org.dromara.common.core.utils.ip; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.resource.ClassPathResource; -import cn.hutool.core.util.ObjectUtil; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.file.FileUtils; +import cn.hutool.core.io.resource.NoResourceException; +import cn.hutool.core.io.resource.ResourceUtil; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; import org.lionsoul.ip2region.xdb.Searcher; -import java.io.File; - /** * 根据ip地址定位工具类,离线方式 * 参考地址:集成 ip2region 实现离线IP地址定位库 @@ -19,31 +16,19 @@ import java.io.File; @Slf4j public class RegionUtils { + // IP地址库文件名称 + public static final String IP_XDB_FILENAME = "ip2region.xdb"; + private static final Searcher SEARCHER; static { - String fileName = "/ip2region.xdb"; - File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); - if (!FileUtils.exist(existFile)) { - ClassPathResource fileStream = new ClassPathResource(fileName); - if (ObjectUtil.isEmpty(fileStream.getStream())) { - throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!"); - } - FileUtils.writeFromStream(fileStream.getStream(), existFile); - } - - String dbPath = existFile.getPath(); - - // 1、从 dbPath 加载整个 xdb 到内存。 - byte[] cBuff; try { - cBuff = Searcher.loadContentFromFile(dbPath); - } catch (Exception e) { - throw new ServiceException("RegionUtils初始化失败,原因:从ip2region.xdb文件加载内容失败!" + e.getMessage()); - } - // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 - try { - SEARCHER = Searcher.newWithBuffer(cBuff); + // 1、将 ip2region 数据库文件 xdb 从 ClassPath 加载到内存。 + // 2、基于加载到内存的 xdb 数据创建一个 Searcher 查询对象。 + SEARCHER = Searcher.newWithBuffer(ResourceUtil.readBytes(IP_XDB_FILENAME)); + log.info("RegionUtils初始化成功,加载IP地址库数据成功!"); + } catch (NoResourceException e) { + throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!"); } catch (Exception e) { throw new ServiceException("RegionUtils初始化失败,原因:" + e.getMessage()); } @@ -54,9 +39,8 @@ public class RegionUtils { */ public static String getCityInfo(String ip) { try { - ip = ip.trim(); // 3、执行查询 - String region = SEARCHER.search(ip); + String region = SEARCHER.search(StringUtils.trim(ip)); return region.replace("0|", "").replace("|0", ""); } catch (Exception e) { log.error("IP地址离线获取城市异常 {}", ip); From 53827228679935ecc41525a494c131594d62f1c5 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: Tue, 6 May 2025 13:29:57 +0800 Subject: [PATCH 131/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A4=9A?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E5=BF=BD=E7=95=A5=E8=A1=A8=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BF=BD=E7=95=A5=E5=A4=A7=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/tenant/handle/PlusTenantLineHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java index 6c93ee581..d518becbc 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java @@ -48,7 +48,7 @@ public class PlusTenantLineHandler implements TenantLineHandler { "gen_table_column" ); tables.addAll(excludes); - return tables.contains(tableName); + return StringUtils.containsAnyIgnoreCase(tableName, tables.toArray(new String[0])); } return true; } From 053dc50c4da344df987c95dba5c0b253e0d17c8e 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: Thu, 8 May 2025 22:14:07 +0800 Subject: [PATCH 132/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc50af628..fb0a97c76 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ > 系统演示: [传送门](https://plus-doc.dromara.org/#/common/demo_system) -> 官方前端项目地址: [plus-ui](https://gitee.com/JavaLionLi/plus-ui)
+> 官方前端项目地址: [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) > 文档地址: [plus-doc](https://plus-doc.dromara.org) From a09414110e3531bd7a9e3861c6a19b1eec8bcc11 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: Thu, 8 May 2025 23:14:07 +0800 Subject: [PATCH 133/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20compose?= =?UTF-8?q?=E7=BC=96=E6=8E=92=E5=A2=9E=E5=8A=A0snailjob=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E9=9B=86=E7=BE=A4=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index fb35cae6f..3814a2d89 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -104,6 +104,7 @@ services: # 时区上海 TZ: Asia/Shanghai SERVER_PORT: 8080 + SNAIL_PORT: 28080 volumes: # 配置文件 - /docker/server1/logs/:/ruoyi/server/logs/ @@ -119,6 +120,7 @@ services: # 时区上海 TZ: Asia/Shanghai SERVER_PORT: 8081 + SNAIL_PORT: 28081 volumes: # 配置文件 - /docker/server2/logs/:/ruoyi/server/logs/ From b709bc02147f6f2c379d77416d2106369bcdfb20 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: Fri, 9 May 2025 15:00:29 +0800 Subject: [PATCH 134/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb0a97c76..2e897b59f 100644 --- a/README.md +++ b/README.md @@ -25,7 +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) -> 文档地址: [plus-doc](https://plus-doc.dromara.org) +> 文档地址: [plus-doc](https://plus-doc.dromara.org) 文档在华为云上如果打不开大概率是DNS问题 可以尝试切换网络等方式(或者科学上网) ## 赞助商 From 3749e7e7243a1245b9150c3bafac8c0169f28d2f 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: Fri, 9 May 2025 16:04:05 +0800 Subject: [PATCH 135/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e897b59f..5b132c662 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.3.1-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)]() From eac7f1b4e22125bcbd94dc2ca4bb9c886eba2c99 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sat, 10 May 2025 14:48:34 +0800 Subject: [PATCH 136/155] =?UTF-8?q?docs=20=E4=BC=98=E5=8C=96EncryptUtils?= =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E5=AF=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/encrypt/utils/EncryptUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java index 2a096eea7..ff0fbc812 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java @@ -108,7 +108,7 @@ public class EncryptUtils { } /** - * sm4加密 + * SM4加密(Base64编码) * * @param data 待加密数据 * @param password 秘钥字符串 @@ -127,11 +127,11 @@ public class EncryptUtils { } /** - * sm4加密 + * SM4加密(Hex编码) * * @param data 待加密数据 * @param password 秘钥字符串 - * @return 加密后字符串, 采用Base64编码 + * @return 加密后字符串, 采用Hex编码 */ public static String encryptBySm4Hex(String data, String password) { if (StrUtil.isBlank(password)) { @@ -148,7 +148,7 @@ public class EncryptUtils { /** * sm4解密 * - * @param data 待解密数据 + * @param data 待解密数据(可以是Base64或Hex编码) * @param password 秘钥字符串 * @return 解密后字符串 */ From 5a8dc8e1cfc1999ef677b75da3417d48d96eaa87 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 10 May 2025 15:51:17 +0800 Subject: [PATCH 137/155] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7warm-flow1.7?= =?UTF-8?q?.0=20update=20=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B=E6=92=A4?= =?UTF-8?q?=E9=94=80=20remove=20=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../workflow/service/IFlwCommonService.java | 20 ++----- .../service/impl/FlwCommonServiceImpl.java | 56 +++---------------- .../service/impl/FlwInstanceServiceImpl.java | 27 ++++----- .../service/impl/FlwTaskServiceImpl.java | 6 +- 5 files changed, 31 insertions(+), 80 deletions(-) diff --git a/pom.xml b/pom.xml index ebec03645..a9b5296e8 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 8.7.2-20250101 - 1.6.10 + 1.7.0 3.2.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java index 73201f43f..4d3540b91 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java @@ -1,9 +1,11 @@ package org.dromara.workflow.service; +import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.core.service.UserService; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -48,17 +50,6 @@ public interface IFlwCommonService { */ void sendMessage(String flowName, Long instId, List messageType, String message); - /** - * 驳回 - * - * @param message 审批意见 - * @param instanceId 流程实例id - * @param targetNodeCode 目标节点 - * @param flowStatus 流程状态 - * @param flowHisStatus 节点操作状态 - */ - void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus); - /** * 申请人节点编码 * @@ -68,9 +59,10 @@ public interface IFlwCommonService { String applyNodeCode(Long definitionId); /** - * 删除运行中的任务 + * 合并变量 * - * @param taskIds 任务id + * @param instance 流程实例 + * @param variable 变量 */ - void deleteRunTask(List taskIds); + void mergeVariable(Instance instance, Map variable); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index df4893d9b..5c77d2c08 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -12,8 +12,9 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.utils.SseMessageUtils; +import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.constant.ExceptionCons; -import org.dromara.warm.flow.core.dto.FlowParams; +import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; @@ -23,6 +24,7 @@ import org.dromara.warm.flow.core.service.NodeService; import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.service.UserService; import org.dromara.warm.flow.core.utils.AssertUtil; +import org.dromara.warm.flow.core.utils.MapUtil; import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; @@ -177,42 +179,6 @@ public class FlwCommonServiceImpl implements IFlwCommonService { } } - /** - * 驳回 - * - * @param message 审批意见 - * @param instanceId 流程实例id - * @param targetNodeCode 目标节点 - * @param flowStatus 流程状态 - * @param flowHisStatus 节点操作状态 - */ - @Override - public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) { - IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class); - List list = flwTaskService.selectByInstId(instanceId); - if (CollUtil.isNotEmpty(list)) { - List tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode)); - if (list.size() == tasks.size()) { - return; - } - } - for (FlowTask task : list) { - List userList = flwTaskService.currentTaskAllUser(task.getId()); - FlowParams flowParams = FlowParams.build() - .nodeCode(targetNodeCode) - .message(message) - .skipType(SkipType.PASS.getKey()) - .flowStatus(flowStatus).hisStatus(flowHisStatus) - .ignore(true); - //解决会签没权限问题 - if (CollUtil.isNotEmpty(userList)) { - flowParams.handler(userList.get(0).getUserId().toString()); - } - taskService.skip(task.getId(), flowParams); - } - //解决会签多人审批问题 - backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus); - } /** * 申请人节点编码 @@ -231,17 +197,13 @@ public class FlwCommonServiceImpl implements IFlwCommonService { return nextNode.getNodeCode(); } - /** - * 删除运行中的任务 - * - * @param taskIds 任务id - */ @Override - public void deleteRunTask(List taskIds) { - if (CollUtil.isEmpty(taskIds)) { - return; + public void mergeVariable(Instance instance, Map variable) { + if (MapUtil.isNotEmpty(variable)) { + String variableStr = instance.getVariable(); + Map deserialize = FlowEngine.jsonConvert.strToMap(variableStr); + deserialize.putAll(variable); + instance.setVariable(FlowEngine.jsonConvert.objToStr(deserialize)); } - userService.deleteByTaskIds(taskIds); - flowTaskMapper.deleteByIds(taskIds); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 2aa95484f..e50744005 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -19,13 +19,13 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.ChartService; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.core.service.InsService; @@ -185,7 +185,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override @Transactional(rollbackFor = Exception.class) public boolean deleteByBusinessIds(List businessIds) { - List flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds,Convert::toStr))); + List flowInstances = flowInstanceMapper.selectList(new LambdaQueryWrapper().in(FlowInstance::getBusinessId, StreamUtils.toList(businessIds, Convert::toStr))); if (CollUtil.isEmpty(flowInstances)) { log.warn("未找到对应的流程实例信息,无法执行删除操作。"); return false; @@ -244,19 +244,16 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { throw new ServiceException(ExceptionCons.NOT_FOUNT_DEF); } String message = bo.getMessage(); + String userIdStr = LoginHelper.getUserIdStr(); BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus()); - String applyNodeCode = flwCommonService.applyNodeCode(definition.getId()); - //撤销 - flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus()); - //判断或签节点是否有多个,只保留一个 - List currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId())); - if (CollUtil.isNotEmpty(currentTaskList)) { - if (currentTaskList.size() > 1) { - currentTaskList.remove(0); - flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId)); - } - } - + FlowParams flowParams = FlowParams.build() + .message(message) + .skipType(SkipType.PASS.getKey()) + .flowStatus(BusinessStatusEnum.CANCEL.getStatus()) + .hisStatus(BusinessStatusEnum.CANCEL.getStatus()) + .handler(userIdStr) + .ignore(true); + taskService.revoke(instance.getId(), flowParams); } catch (Exception e) { log.error("撤销失败: {}", e.getMessage(), e); throw new ServiceException(e.getMessage()); @@ -363,7 +360,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { public void setVariable(Long instanceId, Map variable) { Instance instance = insService.getById(instanceId); if (instance != null) { - taskService.mergeVariable(instance, variable); + flwCommonService.mergeVariable(instance, variable); insService.updateById(instance); } } 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 5685ac3dc..77c7fcecf 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 @@ -112,7 +112,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (ObjectUtil.isNotNull(flowInstance)) { BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); List taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); - taskService.mergeVariable(flowInstance, variables); + flwCommonService.mergeVariable(flowInstance, variables); insService.updateById(flowInstance); StartProcessReturnDTO dto = new StartProcessReturnDTO(); dto.setProcessInstanceId(taskList.get(0).getInstanceId()); @@ -217,7 +217,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { variableMap.remove(task.getNodeCode()); } } - taskService.mergeVariable(inst, variableMap); + flwCommonService.mergeVariable(inst, variableMap); } /** @@ -594,7 +594,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType())); if (CollUtil.isNotEmpty(nextNodeList)) { // 构建以下节点数据 - List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null)); + List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build())); // 办理人变量替换 ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable); for (FlowNode flowNode : nextFlowNodes) { From d6758dc47b51ae14b93ac15c1a5a436cd1958779 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 10 May 2025 16:41:50 +0800 Subject: [PATCH 138/155] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=B3=E8=AF=B7=E4=BA=BA=E8=8A=82=E7=82=B9=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwCommonServiceImpl.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 5c77d2c08..086ae6870 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -2,7 +2,6 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; @@ -13,23 +12,16 @@ import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; -import org.dromara.warm.flow.core.enums.NodeType; import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.NodeService; -import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.service.UserService; -import org.dromara.warm.flow.core.utils.AssertUtil; import org.dromara.warm.flow.core.utils.MapUtil; -import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; -import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.TaskAssigneeType; @@ -52,11 +44,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Service public class FlwCommonServiceImpl implements IFlwCommonService { - - private final FlowNodeMapper flowNodeMapper; - private final FlowTaskMapper flowTaskMapper; private final UserService userService; - private final TaskService taskService; private final NodeService nodeService; /** @@ -188,11 +176,7 @@ public class FlwCommonServiceImpl implements IFlwCommonService { */ @Override public String applyNodeCode(Long definitionId) { - //获取已发布的流程节点 - List flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper().eq(FlowNode::getDefinitionId, definitionId)); - AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE); - Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null); - AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE); + Node startNode = nodeService.getStartNode(definitionId); Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey()); return nextNode.getNodeCode(); } From 9df837f0473ba3162164077cbd8565710846f550 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sat, 10 May 2025 16:51:56 +0800 Subject: [PATCH 139/155] =?UTF-8?q?update=20=E9=87=8D=E6=9E=84=E5=8A=9E?= =?UTF-8?q?=E7=90=86=E4=BA=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/core/service/UserService.java | 33 +++++ .../service/impl/SysUserServiceImpl.java | 82 ++++++++++- .../service/IFlwTaskAssigneeService.java | 15 +- .../impl/FlwTaskAssigneeServiceImpl.java | 136 ++++++++++++++---- script/sql/oracle/oracle_ry_workflow.sql | 30 ++-- script/sql/postgres/postgres_ry_workflow.sql | 10 +- script/sql/ry_workflow.sql | 13 +- .../sql/sqlserver/sqlserver_ry_workflow.sql | 15 +- script/sql/update/update_5.3.1-5.3.2.sql | 8 ++ 10 files changed, 292 insertions(+), 52 deletions(-) create mode 100644 script/sql/update/update_5.3.1-5.3.2.sql diff --git a/pom.xml b/pom.xml index a9b5296e8..311e17011 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,7 @@ 1.2.83 8.7.2-20250101 - + 1.7.0 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 67cd54fba..4903c3860 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -3,6 +3,7 @@ package org.dromara.common.core.service; import org.dromara.common.core.domain.dto.UserDTO; import java.util.List; +import java.util.Map; /** * 通用 用户服务 @@ -91,4 +92,36 @@ public interface UserService { */ List selectUsersByPostIds(List postIds); + /** + * 根据用户 ID 列表查询用户名称映射关系 + * + * @param userIds 用户 ID 列表 + * @return Map,其中 key 为用户 ID,value 为对应的用户名称 + */ + Map selectUserNamesByIds(List userIds); + + /** + * 根据角色 ID 列表查询角色名称映射关系 + * + * @param roleIds 角色 ID 列表 + * @return Map,其中 key 为角色 ID,value 为对应的角色名称 + */ + Map selectRoleNamesByIds(List roleIds); + + /** + * 根据部门 ID 列表查询部门名称映射关系 + * + * @param deptIds 部门 ID 列表 + * @return Map,其中 key 为部门 ID,value 为对应的部门名称 + */ + Map selectDeptNamesByIds(List deptIds); + + /** + * 根据岗位 ID 列表查询岗位名称映射关系 + * + * @param postIds 岗位 ID 列表 + * @return Map,其中 key 为岗位 ID,value 为对应的岗位名称 + */ + Map selectPostNamesByIds(List postIds); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index cecd7f56f..e493e426c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -35,10 +35,8 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -720,4 +718,80 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return selectListByIds(new ArrayList<>(userIds)); } + /** + * 根据用户 ID 列表查询用户名称映射关系 + * + * @param userIds 用户 ID 列表 + * @return Map,其中 key 为用户 ID,value 为对应的用户名称 + */ + @Override + public Map selectUserNamesByIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyMap(); + } + return baseMapper.selectList( + new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getNickName) + .in(SysUser::getUserId, userIds) + ).stream() + .collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName)); + } + + /** + * 根据角色 ID 列表查询角色名称映射关系 + * + * @param roleIds 角色 ID 列表 + * @return Map,其中 key 为角色 ID,value 为对应的角色名称 + */ + @Override + public Map selectRoleNamesByIds(List roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return Collections.emptyMap(); + } + return roleMapper.selectList( + new LambdaQueryWrapper() + .select(SysRole::getRoleId, SysRole::getRoleName) + .in(SysRole::getRoleId, roleIds) + ).stream() + .collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName)); + } + + /** + * 根据部门 ID 列表查询部门名称映射关系 + * + * @param deptIds 部门 ID 列表 + * @return Map,其中 key 为部门 ID,value 为对应的部门名称 + */ + @Override + public Map selectDeptNamesByIds(List deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyMap(); + } + return deptMapper.selectList( + new LambdaQueryWrapper() + .select(SysDept::getDeptId, SysDept::getDeptName) + .in(SysDept::getDeptId, deptIds) + ).stream() + .collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName)); + } + + /** + * 根据岗位 ID 列表查询岗位名称映射关系 + * + * @param postIds 岗位 ID 列表 + * @return Map,其中 key 为岗位 ID,value 为对应的岗位名称 + */ + @Override + public Map selectPostNamesByIds(List postIds) { + if (CollUtil.isEmpty(postIds)) { + return Collections.emptyMap(); + } + return postMapper.selectList( + new LambdaQueryWrapper() + .select(SysPost::getPostId, SysPost::getPostName) + .in(SysPost::getPostId, postIds) + ).stream() + .collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName)); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java index 116cb74f3..90d87e37f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -13,10 +13,21 @@ public interface IFlwTaskAssigneeService { /** * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表 * - * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") - * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + * @param storageId 包含分配类型和ID的字符串 + * @return 匹配的用户列表,格式非法返回空列表 */ List fetchUsersByStorageId(String storageId); + /** + * 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表 + * 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789") + * 会自动去重返回结果,非法格式的标识将被忽略 + * + * @param storageIds 多个存储标识符字符串(逗号分隔) + * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 + */ + List fetchUsersByStorageIds(String storageIds); + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 1e0d17278..67c58b001 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Pair; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -10,7 +11,6 @@ import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.enums.FormatsType; -import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.TaskAssigneeService; import org.dromara.common.core.service.UserService; @@ -20,6 +20,7 @@ import org.dromara.warm.flow.ui.dto.HandlerFunDto; import org.dromara.warm.flow.ui.dto.HandlerQuery; import org.dromara.warm.flow.ui.dto.TreeFunDto; import org.dromara.warm.flow.ui.service.HandlerSelectService; +import org.dromara.warm.flow.ui.vo.HandlerFeedBackVo; import org.dromara.warm.flow.ui.vo.HandlerSelectVo; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.TaskAssigneeEnum; @@ -74,6 +75,49 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand return getHandlerSelectVo(buildHandlerData(dto, type), buildDeptTree(depts)); } + /** + * 办理人权限名称回显 + * + * @param storageIds 入库主键集合 + * @return 结果 + */ + @Override + public List handlerFeedback(List storageIds) { + if (CollUtil.isEmpty(storageIds)) { + return Collections.emptyList(); + } + // 解析并归类 ID,同时记录原始顺序和对应解析结果 + Map> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class); + Map> parsedMap = new LinkedHashMap<>(); + for (String storageId : storageIds) { + Pair parsed = this.parseStorageId(storageId); + parsedMap.put(storageId, parsed); + if (parsed != null) { + typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue()); + } + } + + // 查询所有类型对应的 ID 名称映射 + Map> nameMap = new EnumMap<>(TaskAssigneeEnum.class); + typeIdMap.forEach((type, ids) -> nameMap.put(type, this.getNamesByType(type, ids))); + + // 组装返回结果,保持原始顺序 + return parsedMap.entrySet().stream() + .map(entry -> { + String storageId = entry.getKey(); + Pair parsed = entry.getValue(); + String handlerName = "格式错误"; + if (parsed != null) { + Map nameMapping = nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap()); + handlerName = nameMapping.getOrDefault(parsed.getValue(), "未知名称"); + } + HandlerFeedBackVo backVo = new HandlerFeedBackVo(); + backVo.setStorageId(storageId); + backVo.setHandlerName(handlerName); + return backVo; + }).toList(); + } + /** * 根据任务办理类型查询对应的数据 */ @@ -83,7 +127,6 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand case ROLE -> taskAssigneeService.selectRolesByTaskAssigneeList(taskQuery); case DEPT -> taskAssigneeService.selectDeptsByTaskAssigneeList(taskQuery); case POST -> taskAssigneeService.selectPostsByTaskAssigneeList(taskQuery); - default -> throw new ServiceException("Unsupported handler type"); }; } @@ -124,33 +167,41 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand /** * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 + * 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表 * - * @param storageId 包含分配类型和ID的字符串(例如 "user:123" 或 "role:456") - * @return 与分配类型和ID匹配的用户列表,如果格式无效则返回空列表 + * @param storageId 包含分配类型和ID的字符串 + * @return 匹配的用户列表,格式非法返回空列表 */ @Override public List fetchUsersByStorageId(String storageId) { - List list = new ArrayList<>(); - Map> 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) { - // 无前缀时默认是用户类型 - type = TaskAssigneeEnum.USER; - id = Long.valueOf(parts[0]); - } else { - // 根据前缀解析类型(如 "role:123" -> ROLE 类型) - type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON); - id = Long.valueOf(parts[1]); - } - typeIdMap.computeIfAbsent(type, k -> new ArrayList<>()).add(id); + Pair parsed = this.parseStorageId(storageId); + if (parsed == null) { + return Collections.emptyList(); } - typeIdMap.entrySet().stream() - .filter(entry -> CollUtil.isNotEmpty(entry.getValue())) - .forEach(entry -> list.addAll(getUsersByType(entry.getKey(), entry.getValue()))); - return list.stream().distinct().toList(); + return this.getUsersByType(parsed.getKey(), Collections.singletonList(parsed.getValue())); + } + + /** + * 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表 + * 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789") + * 会自动去重返回结果,非法格式的标识将被忽略 + * + * @param storageIds 多个存储标识符字符串(逗号分隔) + * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 + */ + @Override + public List fetchUsersByStorageIds(String storageIds) { + Map> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class); + for (String storageId : storageIds.split(StrUtil.COMMA)) { + Pair parsed = this.parseStorageId(storageId); + if (parsed != null) { + typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue()); + } + } + return typeIdMap.entrySet().stream() + .flatMap(entry -> this.getUsersByType(entry.getKey(), entry.getValue()).stream()) + .distinct() + .toList(); } /** @@ -172,4 +223,41 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand }; } + /** + * 根据任务分配类型和对应 ID 列表,批量查询名称映射关系 + * + * @param type 分配类型(用户、角色、部门、岗位) + * @param ids ID 列表(如用户ID、角色ID等) + * @return 返回 Map,其中 key 为 ID,value 为对应的名称 + */ + private Map getNamesByType(TaskAssigneeEnum type, List ids) { + return switch (type) { + case USER -> userService.selectUserNamesByIds(ids); + case ROLE -> userService.selectRoleNamesByIds(ids); + case DEPT -> userService.selectDeptNamesByIds(ids); + case POST -> userService.selectPostNamesByIds(ids); + }; + } + + /** + * 解析 storageId 字符串,返回类型和ID的组合 + * + * @param storageId 例如 "user:123" 或 "456" + * @return Pair(TaskAssigneeEnum, Long),如果格式非法返回 null + */ + private Pair parseStorageId(String storageId) { + try { + String[] parts = storageId.split(StrUtil.COLON, 2); + if (parts.length < 2) { + return Pair.of(TaskAssigneeEnum.USER, Long.valueOf(parts[0])); + } else { + TaskAssigneeEnum type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON); + return Pair.of(type, Long.valueOf(parts[1])); + } + } catch (Exception e) { + log.warn("解析 storageId 失败,格式非法:{},错误信息:{}", storageId, e.getMessage()); + return null; + } + } + } diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index d982f03ed..7925fc3e4 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -1,3 +1,6 @@ +-- ---------------------------- +-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/oracle/oracle-wram-flow-all.sql +-- ---------------------------- create table FLOW_DEFINITION ( ID NUMBER(20) not null, @@ -18,7 +21,8 @@ create table FLOW_DEFINITION TENANT_ID VARCHAR2(40) ); -alter table FLOW_DEFINITION add constraint PK_FLOW_DEFINITION primary key (ID); +alter table FLOW_DEFINITION + add constraint PK_FLOW_DEFINITION primary key (ID); comment on table FLOW_DEFINITION is '流程定义表'; comment on column FLOW_DEFINITION.ID is '主键id'; @@ -63,7 +67,8 @@ create table FLOW_NODE PERMISSION_FLAG VARCHAR2(200) ); -alter table FLOW_NODE add constraint PK_FLOW_NODE primary key (ID); +alter table FLOW_NODE + add constraint PK_FLOW_NODE primary key (ID); comment on table FLOW_NODE is '流程节点表'; comment on column FLOW_NODE.ID is '主键id'; @@ -106,7 +111,8 @@ create table FLOW_SKIP TENANT_ID VARCHAR2(40) ); -alter table FLOW_SKIP add constraint PK_FLOW_SKIP primary key (ID); +alter table FLOW_SKIP + add constraint PK_FLOW_SKIP primary key (ID); comment on table FLOW_SKIP is '节点跳转关联表'; comment on column FLOW_SKIP.ID is '主键id'; @@ -144,7 +150,8 @@ create table FLOW_INSTANCE TENANT_ID VARCHAR2(40) ); -alter table FLOW_INSTANCE add constraint PK_FLOW_INSTANCE primary key (ID); +alter table FLOW_INSTANCE + add constraint PK_FLOW_INSTANCE primary key (ID); comment on table FLOW_INSTANCE is '流程实例表'; comment on column FLOW_INSTANCE.ID is '主键id'; @@ -154,7 +161,7 @@ comment on column FLOW_INSTANCE.NODE_TYPE is '开始节点类型 (0开始节点 comment on column FLOW_INSTANCE.NODE_CODE is '开始节点编码'; comment on column FLOW_INSTANCE.NODE_NAME is '开始节点名称'; comment on column FLOW_INSTANCE.VARIABLE is '任务变量'; -comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)'; +comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; comment on column FLOW_INSTANCE.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)'; comment on column FLOW_INSTANCE.DEF_JSON is '流程定义json'; comment on column FLOW_INSTANCE.CREATE_BY is '创建者'; @@ -172,6 +179,7 @@ create table FLOW_TASK NODE_CODE VARCHAR2(100), NODE_NAME VARCHAR2(100), NODE_TYPE NUMBER(1), + FLOW_STATUS VARCHAR2(20), FORM_CUSTOM VARCHAR2(1) default 'N', FORM_PATH VARCHAR2(100), CREATE_TIME DATE, @@ -180,7 +188,8 @@ create table FLOW_TASK TENANT_ID VARCHAR2(40) ); -alter table FLOW_TASK add constraint PK_FLOW_TASK primary key (ID); +alter table FLOW_TASK + add constraint PK_FLOW_TASK primary key (ID); comment on table FLOW_TASK is '待办任务表'; comment on column FLOW_TASK.ID is '主键id'; @@ -189,6 +198,7 @@ comment on column FLOW_TASK.INSTANCE_ID is '对应flow_instance表的id'; comment on column FLOW_TASK.NODE_CODE is '节点编码'; comment on column FLOW_TASK.NODE_NAME is '节点名称'; comment on column FLOW_TASK.NODE_TYPE is '节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +comment on column FLOW_TASK.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; comment on column FLOW_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)'; comment on column FLOW_TASK.FORM_PATH is '审批表单路径'; comment on column FLOW_TASK.CREATE_TIME is '创建时间'; @@ -224,7 +234,8 @@ create table FLOW_HIS_TASK ); -alter table FLOW_HIS_TASK add constraint PK_FLOW_HIS_TASK primary key (ID); +alter table FLOW_HIS_TASK + add constraint PK_FLOW_HIS_TASK primary key (ID); comment on table FLOW_HIS_TASK is '历史任务记录表'; comment on column FLOW_HIS_TASK.ID is '主键id'; @@ -237,7 +248,7 @@ comment on column FLOW_HIS_TASK.NODE_TYPE is '开始节点类型 (0开始节点 comment on column FLOW_HIS_TASK.TARGET_NODE_CODE is '目标节点编码'; comment on column FLOW_HIS_TASK.TARGET_NODE_NAME is '目标节点名称'; comment on column FLOW_HIS_TASK.SKIP_TYPE is '流转类型(PASS通过 REJECT退回 NONE无动作)'; -comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(1审批中 2 审批通过 9已退回 10失效)'; +comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; comment on column FLOW_HIS_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)'; comment on column FLOW_HIS_TASK.FORM_PATH is '审批表单路径'; comment on column FLOW_HIS_TASK.MESSAGE is '审批意见'; @@ -264,7 +275,8 @@ create table FLOW_USER TENANT_ID VARCHAR2(40) ); -alter table FLOW_USER add constraint PK_FLOW_USER primary key (ID); +alter table FLOW_USER + add constraint PK_FLOW_USER primary key (ID); comment on table FLOW_USER is '待办任务表'; comment on column FLOW_USER.ID is '主键id'; diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index df3d41313..c943024df 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -154,7 +154,7 @@ COMMENT ON COLUMN flow_instance.node_type IS '节点类型(0开始节点 1中 COMMENT ON COLUMN flow_instance.node_code IS '流程节点编码'; COMMENT ON COLUMN flow_instance.node_name IS '流程节点名称'; COMMENT ON COLUMN flow_instance.variable IS '任务变量'; -COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)'; +COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; COMMENT ON COLUMN flow_instance.activity_status IS '流程激活状态(0挂起 1激活)'; COMMENT ON COLUMN flow_instance.def_json IS '流程定义json'; COMMENT ON COLUMN flow_instance.create_by IS '创建者'; @@ -172,6 +172,7 @@ CREATE TABLE flow_task node_code varchar(100) NOT NULL, -- 节点编码 node_name varchar(100) NULL, -- 节点名称 node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) + flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 create_time timestamp NULL, -- 创建时间 @@ -188,6 +189,7 @@ COMMENT ON COLUMN flow_task.instance_id IS '对应flow_instance表的id'; COMMENT ON COLUMN flow_task.node_code IS '节点编码'; COMMENT ON COLUMN flow_task.node_name IS '节点名称'; COMMENT ON COLUMN flow_task.node_type IS '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)'; +COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; COMMENT ON COLUMN flow_task.form_custom IS '审批表单是否自定义(Y是 N否)'; COMMENT ON COLUMN flow_task.form_path IS '审批表单路径'; COMMENT ON COLUMN flow_task.create_time IS '创建时间'; @@ -201,8 +203,8 @@ CREATE TABLE flow_his_task definition_id int8 NOT NULL, -- 对应flow_definition表的id instance_id int8 NOT NULL, -- 对应flow_instance表的id task_id int8 NOT NULL, -- 对应flow_task表的id - node_code varchar(200) NULL, -- 开始节点编码 - node_name varchar(200) NULL, -- 开始节点名称 + node_code varchar(100) NULL, -- 开始节点编码 + node_name varchar(100) NULL, -- 开始节点名称 node_type int2 NULL, -- 开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) target_node_code varchar(200) NULL, -- 目标节点编码 target_node_name varchar(200) NULL, -- 结束节点名称 @@ -237,7 +239,7 @@ COMMENT ON COLUMN flow_his_task.approver IS '审批者'; COMMENT ON COLUMN flow_his_task.cooperate_type IS '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)'; COMMENT ON COLUMN flow_his_task.collaborator IS '协作人'; COMMENT ON COLUMN flow_his_task.skip_type IS '流转类型(PASS通过 REJECT退回 NONE无动作)'; -COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(1审批中 2 审批通过 9已退回 10失效)'; +COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; COMMENT ON COLUMN flow_his_task.form_custom IS '审批表单是否自定义(Y是 N否)'; COMMENT ON COLUMN flow_his_task.form_path IS '审批表单路径'; COMMENT ON COLUMN flow_his_task.message IS '审批意见'; diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index acc297ec5..a9cddeb24 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -3,7 +3,7 @@ -- ---------------------------- CREATE TABLE `flow_definition` ( - `id` bigint unsigned NOT NULL COMMENT '主键id', + `id` bigint NOT NULL COMMENT '主键id', `flow_code` varchar(40) NOT NULL COMMENT '流程编码', `flow_name` varchar(100) NOT NULL COMMENT '流程名称', `category` varchar(100) DEFAULT NULL COMMENT '流程类别', @@ -50,7 +50,7 @@ CREATE TABLE `flow_node` CREATE TABLE `flow_skip` ( - `id` bigint unsigned NOT NULL COMMENT '主键id', + `id` bigint NOT NULL COMMENT '主键id', `definition_id` bigint NOT NULL COMMENT '流程定义id', `now_node_code` varchar(100) NOT NULL COMMENT '当前流程节点的编码', `now_node_type` tinyint(1) DEFAULT NULL COMMENT '当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', @@ -76,7 +76,7 @@ CREATE TABLE `flow_instance` `node_code` varchar(40) NOT NULL COMMENT '流程节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', `variable` text COMMENT '任务变量', - `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)', `def_json` text COMMENT '流程定义json', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', @@ -96,6 +96,7 @@ CREATE TABLE `flow_task` `node_code` varchar(100) NOT NULL COMMENT '节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '节点名称', `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -107,7 +108,7 @@ CREATE TABLE `flow_task` CREATE TABLE `flow_his_task` ( - `id` bigint(20) unsigned NOT NULL COMMENT '主键id', + `id` bigint(20) NOT NULL COMMENT '主键id', `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', @@ -120,7 +121,7 @@ CREATE TABLE `flow_his_task` `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', `collaborator` varchar(40) DEFAULT NULL COMMENT '协作人', `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', - `flow_status` varchar(20) NOT NULL COMMENT '流程状态(1审批中 2 审批通过 9已退回 10失效)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', `message` varchar(500) DEFAULT NULL COMMENT '审批意见', @@ -136,7 +137,7 @@ CREATE TABLE `flow_his_task` CREATE TABLE `flow_user` ( - `id` bigint unsigned NOT NULL COMMENT '主键id', + `id` bigint NOT NULL COMMENT '主键id', `type` char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)', `processed_by` varchar(80) DEFAULT NULL COMMENT '权限人', `associated` bigint NOT NULL COMMENT '任务表id', diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql index 96ea62ad3..46f0bf941 100644 --- a/script/sql/sqlserver/sqlserver_ry_workflow.sql +++ b/script/sql/sqlserver/sqlserver_ry_workflow.sql @@ -1,3 +1,6 @@ +-- ---------------------------- +-- 0、warm-flow-all.sql,地址:https://gitee.com/dromara/warm-flow/blob/master/sql/sqlserver/sqlserver.sql +-- ---------------------------- CREATE TABLE flow_definition ( id bigint NOT NULL, flow_code nvarchar(40) NOT NULL, @@ -523,7 +526,7 @@ EXEC sp_addextendedproperty GO EXEC sp_addextendedproperty -'MS_Description', N'流程状态(0待提交 1审批中 2 审批通过 3自动通过 4终止 5作废 6撤销 7取回 8已完成 9已退回 10失效)', +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', 'SCHEMA', N'dbo', 'TABLE', N'flow_instance', 'COLUMN', N'flow_status' @@ -598,6 +601,7 @@ CREATE TABLE flow_task ( node_code nvarchar(100) NOT NULL, node_name nvarchar(100) NULL, node_type tinyint NOT NULL, + flow_status nvarchar(20) NOT NULL, form_custom nchar(1) DEFAULT('N') NULL, form_path nvarchar(100) NULL, create_time datetime2(7) NULL, @@ -653,6 +657,13 @@ EXEC sp_addextendedproperty 'COLUMN', N'node_type' GO +EXEC sp_addextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'flow_status' +GO + EXEC sp_addextendedproperty 'MS_Description', N'审批表单是否自定义(Y是 N否)', 'SCHEMA', N'dbo', @@ -824,7 +835,7 @@ EXEC sp_addextendedproperty GO EXEC sp_addextendedproperty -'MS_Description', N'流程状态(1审批中 2 审批通过 9已退回 10失效)', +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', 'SCHEMA', N'dbo', 'TABLE', N'flow_his_task', 'COLUMN', N'flow_status' diff --git a/script/sql/update/update_5.3.1-5.3.2.sql b/script/sql/update/update_5.3.1-5.3.2.sql new file mode 100644 index 000000000..c703a4e72 --- /dev/null +++ b/script/sql/update/update_5.3.1-5.3.2.sql @@ -0,0 +1,8 @@ +ALTER TABLE `flow_task` + ADD COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `node_type`; + +ALTER TABLE `flow_instance` + MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `variable`; + +ALTER TABLE `flow_his_task` + MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type` From ea74803ccc877e85b70178bf942d6405cb065a79 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 11 May 2025 17:57:42 +0800 Subject: [PATCH 140/155] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E4=BD=93=E8=AF=BB=E5=8F=96=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/handler/GlobalExceptionHandler.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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 0a60fbcc7..28aacbcfb 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,6 +2,7 @@ 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 +15,7 @@ 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.context.support.DefaultMessageSourceResolvable; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -180,4 +182,24 @@ public class GlobalExceptionHandler { return R.fail(message); } + /** + * JSON 解析异常(Jackson 在处理 JSON 格式出错时抛出) + * 可能是请求体格式非法,也可能是服务端反序列化失败 + */ + @ExceptionHandler(JsonParseException.class) + public R handleJsonParseException(JsonParseException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}' 发生 JSON 解析异常: {}", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_BAD_REQUEST, "请求数据格式错误(JSON 解析失败):" + e.getMessage()); + } + + /** + * 请求体读取异常(通常是请求参数格式非法、字段类型不匹配等) + */ + @ExceptionHandler(HttpMessageNotReadableException.class) + public R handleHttpMessageNotReadableException(HttpMessageNotReadableException e, HttpServletRequest request) { + log.error("请求地址'{}', 参数解析失败: {}", request.getRequestURI(), e.getMessage()); + return R.fail(HttpStatus.HTTP_BAD_REQUEST, "请求参数格式错误:" + e.getMostSpecificCause().getMessage()); + } + } From a5c2093c76bbf505a3cd0a9eaf440fd912cf72a8 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 11 May 2025 18:12:49 +0800 Subject: [PATCH 141/155] =?UTF-8?q?docs=20=E4=BF=AE=E6=AD=A3=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index ee059dc3c..8e3f55acb 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -21,8 +21,8 @@ server: worker: 256 captcha: + # 是否启用验证码校验 enable: true - # 页面 <参数设置> 可开启关闭 验证码校验 # 验证码类型 math 数组计算 char 字符验证 type: MATH # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 From 2dde42168f5fa04af3ae224676b6f04c492510a1 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, 12 May 2025 09:33:23 +0800 Subject: [PATCH 142/155] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20readme=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E6=88=90=E5=91=98=E9=A1=B9=E7=9B=AE?= 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 5b132c662..f4d4a2873 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,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) > 文档地址: [plus-doc](https://plus-doc.dromara.org) 文档在华为云上如果打不开大概率是DNS问题 可以尝试切换网络等方式(或者科学上网) From 0c2fe34d929471d37254633797671e9177173421 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 12 May 2025 02:04:43 +0000 Subject: [PATCH 143/155] =?UTF-8?q?!678=20add=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=20Date=20=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E5=A4=84=E7=90=86=E5=99=A8?= =?UTF-8?q?=EF=BC=88=E6=94=AF=E6=8C=81=E5=A4=9A=E7=A7=8D=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=89=20*=20add=20=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=20Date=20=E7=B1=BB=E5=9E=8B=E5=8F=8D=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E5=A4=84=E7=90=86=E5=99=A8=EF=BC=88=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E7=A7=8D=E6=A0=BC=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/json/config/JacksonConfig.java | 10 ++++-- .../json/handler/CustomDateDeserializer.java | 31 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java index 8f5a45d11..f800463ba 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java @@ -1,11 +1,13 @@ package org.dromara.common.json.config; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import org.dromara.common.json.handler.BigNumberSerializer; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.json.handler.BigNumberSerializer; +import org.dromara.common.json.handler.CustomDateDeserializer; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; @@ -15,6 +17,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Date; import java.util.TimeZone; /** @@ -38,7 +41,10 @@ public class JacksonConfig { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - builder.modules(javaTimeModule); + // 自定义 java.util.Date 的反序列化(支持多格式字符串解析) + SimpleModule dateModule = new SimpleModule(); + dateModule.addDeserializer(Date.class, new CustomDateDeserializer()); + builder.modules(javaTimeModule, dateModule); builder.timeZone(TimeZone.getDefault()); log.info("初始化 jackson 配置"); }; diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java new file mode 100644 index 000000000..069b924f0 --- /dev/null +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/handler/CustomDateDeserializer.java @@ -0,0 +1,31 @@ +package org.dromara.common.json.handler; + +import cn.hutool.core.date.DateUtil; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.util.Date; + +/** + * 自定义 Date 类型反序列化处理器(支持多种格式) + * + * @author AprilWind + */ +public class CustomDateDeserializer extends JsonDeserializer { + + /** + * 反序列化逻辑:将字符串转换为 Date 对象 + * + * @param p JSON 解析器,用于获取字符串值 + * @param ctxt 上下文环境(可用于获取更多配置) + * @return 转换后的 Date 对象,若为空字符串返回 null + * @throws IOException 当字符串格式非法或转换失败时抛出 + */ + @Override + public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return DateUtil.parse(p.getText()); + } + +} From 5a1523564b1db3204490273dfbb8aa0052b45ede Mon Sep 17 00:00:00 2001 From: lcry <1318070+lcry@user.noreply.gitee.com> Date: Mon, 12 May 2025 02:07:46 +0000 Subject: [PATCH 144/155] =?UTF-8?q?!677=20add=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=20gitea=20=E4=B8=89=E6=96=B9=E5=8D=95?= =?UTF-8?q?=E7=82=B9=E7=99=BB=E5=BD=95=20*=20add=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=20gitea=20=E4=B8=89=E6=96=B9=E5=8D=95?= =?UTF-8?q?=E7=82=B9=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 6 ++ .../src/main/resources/application-prod.yml | 6 ++ .../common/social/gitea/AuthGiteaRequest.java | 92 +++++++++++++++++++ .../common/social/gitea/AuthGiteaSource.java | 50 ++++++++++ .../common/social/utils/SocialUtils.java | 2 + script/sql/oracle/oracle_ry_vue_5.X.sql | 4 +- script/sql/postgres/postgres_ry_vue_5.X.sql | 4 +- script/sql/ry_vue_5.X.sql | 4 +- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 4 +- script/sql/update/update_5.3.1-5.3.2.sql | 5 + 10 files changed, 169 insertions(+), 8 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index d2c45eae1..34a62d39b 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -263,3 +263,9 @@ justauth: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab + gitea: + # gitea 服务器地址 + server-url: https://demo.gitea.com + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitea diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 1c7eae428..8440deece 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -265,3 +265,9 @@ justauth: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab + gitea: + # gitea 服务器地址 + server-url: https://demo.gitea.com + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitea diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java new file mode 100644 index 000000000..d3fc7516f --- /dev/null +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java @@ -0,0 +1,92 @@ +package org.dromara.common.social.gitea; + +import cn.hutool.core.lang.Dict; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthDefaultRequest; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.json.utils.JsonUtils; + +/** + * @author lcry + */ +@Slf4j +public class AuthGiteaRequest extends AuthDefaultRequest { + + public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.gitea.server-url"); + + /** + * 设定归属域 + */ + public AuthGiteaRequest(AuthConfig config) { + super(config, AuthGiteaSource.GITEA); + } + + public AuthGiteaRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthGiteaSource.GITEA, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + String body = doPostAuthorizationCode(authCallback.getCode()); + Dict object = JsonUtils.parseMap(body); + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + return AuthToken.builder() + .accessToken(object.getStr("access_token")) + .refreshToken(object.getStr("refresh_token")) + .idToken(object.getStr("id_token")) + .tokenType(object.getStr("token_type")) + .scope(object.getStr("scope")) + .build(); + } + + @Override + protected String doPostAuthorizationCode(String code) { + HttpRequest request = HttpRequest.post(source.accessToken()) + .form("client_id", config.getClientId()) + .form("client_secret", config.getClientSecret()) + .form("grant_type", "authorization_code") + .form("code", code) + .form("redirect_uri", config.getRedirectUri()); + HttpResponse response = request.execute(); + return response.body(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + String body = doGetUserInfo(authToken); + Dict object = JsonUtils.parseMap(body); + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + return AuthUser.builder() + .uuid(object.getStr("sub")) + .username(object.getStr("name")) + .nickname(object.getStr("preferred_username")) + .avatar(object.getStr("picture")) + .email(object.getStr("email")) + .token(authToken) + .source(source.toString()) + .build(); + } + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java new file mode 100644 index 000000000..201b22308 --- /dev/null +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java @@ -0,0 +1,50 @@ +package org.dromara.common.social.gitea; + +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthDefaultRequest; + +/** + * gitea Oauth2 默认接口说明 + * + * @author lcry + */ +public enum AuthGiteaSource implements AuthSource { + + /** + * 自己搭建的 gitea 私服 + */ + GITEA { + /** + * 授权的api + */ + @Override + public String authorize() { + return AuthGiteaRequest.SERVER_URL + "/login/oauth/authorize"; + } + + /** + * 获取accessToken的api + */ + @Override + public String accessToken() { + return AuthGiteaRequest.SERVER_URL + "/login/oauth/access_token"; + } + + /** + * 获取用户信息的api + */ + @Override + public String userInfo() { + return AuthGiteaRequest.SERVER_URL + "/login/oauth/userinfo"; + } + + /** + * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} + */ + @Override + public Class getTargetClass() { + return AuthGiteaRequest.class; + } + + } +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index db696e515..a73b229f8 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -10,6 +10,7 @@ import me.zhyd.oauth.request.*; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.social.config.properties.SocialLoginConfigProperties; import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.gitea.AuthGiteaRequest; import org.dromara.common.social.maxkey.AuthMaxKeyRequest; import org.dromara.common.social.topiam.AuthTopIamRequest; @@ -66,6 +67,7 @@ public class SocialUtils { case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); case "maxkey" -> new AuthMaxKeyRequest(builder.build(), STATE_CACHE); case "topiam" -> new AuthTopIamRequest(builder.build(), STATE_CACHE); + case "gitea" -> new AuthGiteaRequest(builder.build(), STATE_CACHE); default -> throw new AuthException("未获取到有效的Auth配置"); }; } diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 7fff0b443..ce38b069d 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -13,9 +13,9 @@ create table sys_social nick_name varchar2(30) default '', email varchar2(255) default '', avatar varchar2(500) default '', - access_token varchar2(255) not null, + access_token varchar2(2000) not null, expire_in number(20) default null, - refresh_token varchar2(255) default null, + refresh_token varchar2(2000) default null, access_code varchar2(255) default null, union_id varchar2(255) default null, scope varchar2(255) default null, diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 523cbe266..0f92c839e 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -13,9 +13,9 @@ create table sys_social nick_name varchar(30) default ''::varchar, email varchar(255) default ''::varchar, avatar varchar(500) default ''::varchar, - access_token varchar(255) not null, + access_token varchar(2000) not null, expire_in int8 default null, - refresh_token varchar(255) default null::varchar, + refresh_token varchar(2000) default null::varchar, access_code varchar(255) default null::varchar, union_id varchar(255) default null::varchar, scope varchar(255) default null::varchar, diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index c17e4a01a..ffc469e29 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -13,10 +13,10 @@ create table sys_social nick_name varchar(30) default '' comment '用户昵称', email varchar(255) default '' comment '用户邮箱', avatar varchar(500) default '' comment '头像地址', - access_token varchar(255) not null comment '用户的授权令牌', + access_token varchar(2000) not null comment '用户的授权令牌', expire_in int default null comment '用户的授权令牌的有效期,部分平台可能没有', refresh_token varchar(255) default null comment '刷新令牌,部分平台可能没有', - access_code varchar(255) default null comment '平台的授权信息,部分平台可能没有', + access_code varchar(2000) default null comment '平台的授权信息,部分平台可能没有', union_id varchar(255) default null comment '用户的 unionid', scope varchar(255) default null comment '授予的权限,部分平台可能没有', token_type varchar(255) default null comment '个别平台的授权信息,部分平台可能没有', diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index f64d8f804..c7fed712a 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -10,9 +10,9 @@ create table sys_social nick_name nvarchar(30) DEFAULT ('') NULL, email nvarchar(255) DEFAULT ('') NULL, avatar nvarchar(500) DEFAULT ('') NULL, - access_token nvarchar(255) NOT NULL, + access_token nvarchar(2000) NOT NULL, expire_in bigint NULL, - refresh_token nvarchar(255) NULL, + refresh_token nvarchar(2000) NULL, access_code nvarchar(255) NULL, union_id nvarchar(255) NULL, scope nvarchar(255) NULL, diff --git a/script/sql/update/update_5.3.1-5.3.2.sql b/script/sql/update/update_5.3.1-5.3.2.sql index c703a4e72..6feb5c9f7 100644 --- a/script/sql/update/update_5.3.1-5.3.2.sql +++ b/script/sql/update/update_5.3.1-5.3.2.sql @@ -6,3 +6,8 @@ ALTER TABLE `flow_instance` ALTER TABLE `flow_his_task` MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type` + +ALTER TABLE `sys_social` + MODIFY COLUMN `access_token` varchar(2000) NOT NULL COMMENT '用户的授权令牌' AFTER `avatar`; +ALTER TABLE `sys_social` + MODIFY COLUMN `refresh_token` varchar(2000) NOT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`; From e0672fc75319c0ccfdbfb0c8054225cbbeebd303 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, 12 May 2025 10:12:20 +0800 Subject: [PATCH 145/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AF=B9=E6=8E=A5gitea=E5=AF=B9=E6=8E=A5=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E7=9A=84pr=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application-dev.yml | 1 + ruoyi-admin/src/main/resources/application-prod.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 34a62d39b..5dd2e00fe 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -264,6 +264,7 @@ justauth: client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab gitea: + # 前端改动 https://gitee.com/JavaLionLi/plus-ui/pulls/204 # gitea 服务器地址 server-url: https://demo.gitea.com client-id: 10**********6 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 8440deece..435a9e856 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -266,6 +266,7 @@ justauth: client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab gitea: + # 前端改动 https://gitee.com/JavaLionLi/plus-ui/pulls/204 # gitea 服务器地址 server-url: https://demo.gitea.com client-id: 10**********6 From 748c95b30f0ea78ba58d4fa0ab1a62f536a9b761 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, 12 May 2025 10:59:12 +0800 Subject: [PATCH 146/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20=E5=85=B6=E4=BB=96=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=9A=84=E5=8D=87=E7=BA=A7sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/update/oracle/update_5.3.1-5.4.0.sql | 9 +++ .../update/postgres/update_5.3.1-5.4.0.sql | 9 +++ .../update/sqlserver/update_5.3.1-5.4.0.sql | 56 +++++++++++++++++++ ...5.3.1-5.3.2.sql => update_5.3.1-5.4.0.sql} | 2 +- 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 script/sql/update/oracle/update_5.3.1-5.4.0.sql create mode 100644 script/sql/update/postgres/update_5.3.1-5.4.0.sql create mode 100644 script/sql/update/sqlserver/update_5.3.1-5.4.0.sql rename script/sql/update/{update_5.3.1-5.3.2.sql => update_5.3.1-5.4.0.sql} (86%) diff --git a/script/sql/update/oracle/update_5.3.1-5.4.0.sql b/script/sql/update/oracle/update_5.3.1-5.4.0.sql new file mode 100644 index 000000000..ae53fc078 --- /dev/null +++ b/script/sql/update/oracle/update_5.3.1-5.4.0.sql @@ -0,0 +1,9 @@ +COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; + +COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; + +COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; + +ALTER TABLE sys_social + MODIFY (access_token VARCHAR2(2000 BYTE)) + MODIFY (refresh_token VARCHAR2(2000 BYTE)); diff --git a/script/sql/update/postgres/update_5.3.1-5.4.0.sql b/script/sql/update/postgres/update_5.3.1-5.4.0.sql new file mode 100644 index 000000000..5ba8302fc --- /dev/null +++ b/script/sql/update/postgres/update_5.3.1-5.4.0.sql @@ -0,0 +1,9 @@ +COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; + +COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; + +COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; + +ALTER TABLE sys_social +ALTER COLUMN access_token TYPE varchar(2000), +ALTER COLUMN refresh_token TYPE varchar(2000); diff --git a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql new file mode 100644 index 000000000..7fedcbd6f --- /dev/null +++ b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql @@ -0,0 +1,56 @@ +IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'flow_status')) > 0) + EXEC sp_updateextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'flow_status' +ELSE + EXEC sp_addextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_task', +'COLUMN', N'flow_status' +GO + +IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'flow_status')) > 0) + EXEC sp_updateextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'flow_status' +ELSE + EXEC sp_addextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_instance', +'COLUMN', N'flow_status' +GO + +IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'flow_status')) > 0) + EXEC sp_updateextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'flow_status' +ELSE + EXEC sp_addextendedproperty +'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', +'SCHEMA', N'dbo', +'TABLE', N'flow_his_task', +'COLUMN', N'flow_status' +GO + +-- sys_social 表修改列 +ALTER TABLE sys_social ALTER COLUMN access_token VARCHAR(2000) NOT NULL +GO +ALTER TABLE sys_social ALTER COLUMN refresh_token VARCHAR(2000) NULL +GO diff --git a/script/sql/update/update_5.3.1-5.3.2.sql b/script/sql/update/update_5.3.1-5.4.0.sql similarity index 86% rename from script/sql/update/update_5.3.1-5.3.2.sql rename to script/sql/update/update_5.3.1-5.4.0.sql index 6feb5c9f7..68d6bc7f1 100644 --- a/script/sql/update/update_5.3.1-5.3.2.sql +++ b/script/sql/update/update_5.3.1-5.4.0.sql @@ -10,4 +10,4 @@ ALTER TABLE `flow_his_task` ALTER TABLE `sys_social` MODIFY COLUMN `access_token` varchar(2000) NOT NULL COMMENT '用户的授权令牌' AFTER `avatar`; ALTER TABLE `sys_social` - MODIFY COLUMN `refresh_token` varchar(2000) NOT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`; + MODIFY COLUMN `refresh_token` varchar(2000) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`; From 122f2770b21f928cbfb4f027b8aa7f7e9eff3c9b 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, 12 May 2025 12:56:24 +0800 Subject: [PATCH 147/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20!pr678=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/json/config/JacksonConfig.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java index f800463ba..77cf83381 100644 --- a/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java +++ b/ruoyi-common/ruoyi-common-json/src/main/java/org/dromara/common/json/config/JacksonConfig.java @@ -1,6 +1,5 @@ package org.dromara.common.json.config; -import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; @@ -41,10 +40,8 @@ public class JacksonConfig { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - // 自定义 java.util.Date 的反序列化(支持多格式字符串解析) - SimpleModule dateModule = new SimpleModule(); - dateModule.addDeserializer(Date.class, new CustomDateDeserializer()); - builder.modules(javaTimeModule, dateModule); + javaTimeModule.addDeserializer(Date.class, new CustomDateDeserializer()); + builder.modules(javaTimeModule); builder.timeZone(TimeZone.getDefault()); log.info("初始化 jackson 配置"); }; From 97caabe0a2c8755fc381ff1bd96e03926bd86d3a 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, 12 May 2025 13:01:55 +0800 Subject: [PATCH 148/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20update=20?= =?UTF-8?q?sql=20=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/update/oracle/update_5.3.1-5.4.0.sql | 1 + script/sql/update/postgres/update_5.3.1-5.4.0.sql | 1 + script/sql/update/sqlserver/update_5.3.1-5.4.0.sql | 14 +++----------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/script/sql/update/oracle/update_5.3.1-5.4.0.sql b/script/sql/update/oracle/update_5.3.1-5.4.0.sql index ae53fc078..d4de6ad2c 100644 --- a/script/sql/update/oracle/update_5.3.1-5.4.0.sql +++ b/script/sql/update/oracle/update_5.3.1-5.4.0.sql @@ -1,3 +1,4 @@ +ALTER TABLE flow_task ADD (flow_status VARCHAR2(20)); COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; diff --git a/script/sql/update/postgres/update_5.3.1-5.4.0.sql b/script/sql/update/postgres/update_5.3.1-5.4.0.sql index 5ba8302fc..8f5c9d4e0 100644 --- a/script/sql/update/postgres/update_5.3.1-5.4.0.sql +++ b/script/sql/update/postgres/update_5.3.1-5.4.0.sql @@ -1,3 +1,4 @@ +ALTER TABLE flow_task ADD COLUMN flow_status varchar(20); COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)'; diff --git a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql index 7fedcbd6f..2cbf99e01 100644 --- a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql +++ b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql @@ -1,14 +1,6 @@ -IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description', -'SCHEMA', N'dbo', -'TABLE', N'flow_task', -'COLUMN', N'flow_status')) > 0) - EXEC sp_updateextendedproperty -'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', -'SCHEMA', N'dbo', -'TABLE', N'flow_task', -'COLUMN', N'flow_status' -ELSE - EXEC sp_addextendedproperty +ALTER TABLE flow_task ADD flow_status nvarchar(20) NULL; + +EXEC sp_addextendedproperty 'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', 'SCHEMA', N'dbo', 'TABLE', N'flow_task', From 553fca28a27b16963ada982505e131bbc2364214 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 12 May 2025 16:51:58 +0800 Subject: [PATCH 149/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=81=87?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/core/page/TableDataInfo.java | 16 ++++++++++++++++ .../generator/service/GenTableServiceImpl.java | 8 +------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java index 370f47995..a1d499205 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -1,5 +1,6 @@ package org.dromara.common.mybatis.core.page; +import cn.hutool.core.collection.CollUtil; import cn.hutool.http.HttpStatus; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.Data; @@ -88,4 +89,19 @@ public class TableDataInfo implements Serializable { return rspData; } + /** + * 根据原始数据列表和分页参数,构建表格分页数据对象(用于假分页) + * + * @param list 原始数据列表(全部数据) + * @param page 分页参数对象(包含当前页码、每页大小等) + * @return 构造好的分页结果 TableDataInfo + */ + public static TableDataInfo build(List list, IPage page) { + if (CollUtil.isEmpty(list)) { + return TableDataInfo.build(); + } + List pageList = CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), list); + return new TableDataInfo(pageList, list.size()); + } + } 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 6b9e60617..b397f37f4 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 @@ -9,7 +9,6 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -168,12 +167,7 @@ public class GenTableServiceImpl implements IGenTableService { return gen; }).sorted(Comparator.comparing(GenTable::getCreateTime).reversed()) .toList(); - - IPage page = pageQuery.build(); - page.setTotal(tables.size()); - // 手动分页 set数据 - page.setRecords(CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tables)); - return TableDataInfo.build(page); + return TableDataInfo.build(tables, pageQuery.build()); } /** From b9e5914babcbf5436965a365b50b5391da4f046c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 12 May 2025 18:11:32 +0800 Subject: [PATCH 150/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8A=9E=E7=90=86=E4=BA=BA=E9=94=99=E8=AF=AF=E4=BD=BF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/IFlwTaskAssigneeService.java | 2 +- .../workflow/service/impl/FlwCommonServiceImpl.java | 9 ++++++--- .../service/impl/FlwTaskAssigneeServiceImpl.java | 9 ++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java index 90d87e37f..7264ee079 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -28,6 +28,6 @@ public interface IFlwTaskAssigneeService { * @param storageIds 多个存储标识符字符串(逗号分隔) * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 */ - List fetchUsersByStorageIds(String storageIds); + List fetchUsersByStorageIds(List storageIds); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 086ae6870..35434d389 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -72,10 +72,13 @@ public class FlwCommonServiceImpl implements IFlwCommonService { IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); Map> userListMap = StreamUtils.groupByKey(userList, User::getType); for (Map.Entry> entry : userListMap.entrySet()) { - List entryValue = entry.getValue(); - String processedBys = StreamUtils.join(entryValue, User::getProcessedBy); + List processedBys = entry.getValue().stream() + .map(User::getProcessedBy) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List users = taskAssigneeService.fetchUsersByStorageId(processedBys); + List users = taskAssigneeService.fetchUsersByStorageIds(processedBys); // 转换为 FlowUser 并添加到结果集合 if (CollUtil.isNotEmpty(users)) { users.forEach(dto -> { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 67c58b001..9f847e184 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -176,7 +176,7 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand public List fetchUsersByStorageId(String storageId) { Pair parsed = this.parseStorageId(storageId); if (parsed == null) { - return Collections.emptyList(); + return List.of(); } return this.getUsersByType(parsed.getKey(), Collections.singletonList(parsed.getValue())); } @@ -190,9 +190,12 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 */ @Override - public List fetchUsersByStorageIds(String storageIds) { + public List fetchUsersByStorageIds(List storageIds) { + if (CollUtil.isEmpty(storageIds)) { + return List.of(); + } Map> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class); - for (String storageId : storageIds.split(StrUtil.COMMA)) { + for (String storageId : storageIds) { Pair parsed = this.parseStorageId(storageId); if (parsed != null) { typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue()); From a4ad56f0ebd57e88455611d7dcb3408549ad7fc4 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 12 May 2025 18:18:10 +0800 Subject: [PATCH 151/155] =?UTF-8?q?fix=20=E7=BB=A7=E7=BB=AD=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9F=A5=E8=AF=A2=E5=8A=9E=E7=90=86=E4=BA=BA=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/workflow/service/impl/FlwTaskServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 77c7fcecf..4bc0b0878 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 @@ -600,7 +600,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { for (FlowNode flowNode : nextFlowNodes) { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { if (CollUtil.isNotEmpty(t.getPermissionList())) { - List users = flwTaskAssigneeService.fetchUsersByStorageId(String.join(StringUtils.SEPARATOR, t.getPermissionList())); + List users = flwTaskAssigneeService.fetchUsersByStorageIds(t.getPermissionList()); if (CollUtil.isNotEmpty(users)) { flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId()))); } From facd3e351f0c94269a438223eb8dce56443a2940 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, 12 May 2025 18:21:21 +0800 Subject: [PATCH 152/155] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=AF=BC=E8=87=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IFlwTaskAssigneeService.java | 14 ++--------- .../service/impl/FlwCommonServiceImpl.java | 7 ++---- .../impl/FlwTaskAssigneeServiceImpl.java | 25 +++---------------- .../service/impl/FlwTaskServiceImpl.java | 2 +- 4 files changed, 9 insertions(+), 39 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java index 7264ee079..dfeb4df57 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -15,19 +15,9 @@ public interface IFlwTaskAssigneeService { * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 * 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表 * - * @param storageId 包含分配类型和ID的字符串 + * @param storageIds 包含分配类型和ID的字符串 * @return 匹配的用户列表,格式非法返回空列表 */ - List fetchUsersByStorageId(String storageId); - - /** - * 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表 - * 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789") - * 会自动去重返回结果,非法格式的标识将被忽略 - * - * @param storageIds 多个存储标识符字符串(逗号分隔) - * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 - */ - List fetchUsersByStorageIds(List storageIds); + List fetchUsersByStorageIds(String storageIds); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 35434d389..8e9c5096c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -72,11 +72,8 @@ public class FlwCommonServiceImpl implements IFlwCommonService { IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); Map> userListMap = StreamUtils.groupByKey(userList, User::getType); for (Map.Entry> entry : userListMap.entrySet()) { - List processedBys = entry.getValue().stream() - .map(User::getProcessedBy) - .filter(StringUtils::isNotBlank) - .distinct() - .collect(Collectors.toList()); + List entryValue = entry.getValue(); + String processedBys = StreamUtils.join(entryValue, User::getProcessedBy); // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 List users = taskAssigneeService.fetchUsersByStorageIds(processedBys); // 转换为 FlowUser 并添加到结果集合 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 9f847e184..5ebf2bbeb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -169,33 +169,16 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 * 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表 * - * @param storageId 包含分配类型和ID的字符串 + * @param storageIds 包含分配类型和ID的字符串 * @return 匹配的用户列表,格式非法返回空列表 */ @Override - public List fetchUsersByStorageId(String storageId) { - Pair parsed = this.parseStorageId(storageId); - if (parsed == null) { - return List.of(); - } - return this.getUsersByType(parsed.getKey(), Collections.singletonList(parsed.getValue())); - } - - /** - * 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表 - * 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789") - * 会自动去重返回结果,非法格式的标识将被忽略 - * - * @param storageIds 多个存储标识符字符串(逗号分隔) - * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 - */ - @Override - public List fetchUsersByStorageIds(List storageIds) { - if (CollUtil.isEmpty(storageIds)) { + public List fetchUsersByStorageIds(String storageIds) { + if (StringUtils.isEmpty(storageIds)) { return List.of(); } Map> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class); - for (String storageId : storageIds) { + for (String storageId : storageIds.split(StringUtils.SEPARATOR)) { Pair parsed = this.parseStorageId(storageId); if (parsed != null) { typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue()); 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 4bc0b0878..0cdabbf4a 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 @@ -600,7 +600,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { for (FlowNode flowNode : nextFlowNodes) { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { if (CollUtil.isNotEmpty(t.getPermissionList())) { - List users = flwTaskAssigneeService.fetchUsersByStorageIds(t.getPermissionList()); + List users = flwTaskAssigneeService.fetchUsersByStorageIds(String.join(StringUtils.SEPARATOR, t.getPermissionList())); if (CollUtil.isNotEmpty(users)) { flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId()))); } From fdfca0b33afa7b8dc3fc2ad678b2b4a5be233ebf 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, 12 May 2025 18:28:24 +0800 Subject: [PATCH 153/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/mybatis/core/page/TableDataInfo.java | 2 +- .../workflow/service/IFlwTaskAssigneeService.java | 9 +++++---- .../service/impl/FlwTaskAssigneeServiceImpl.java | 9 +++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java index a1d499205..1fe2b3ef1 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -101,7 +101,7 @@ public class TableDataInfo implements Serializable { return TableDataInfo.build(); } List pageList = CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), list); - return new TableDataInfo(pageList, list.size()); + return new TableDataInfo<>(pageList, list.size()); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java index dfeb4df57..830abaf52 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskAssigneeService.java @@ -12,11 +12,12 @@ import java.util.List; public interface IFlwTaskAssigneeService { /** - * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 - * 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表 + * 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表 + * 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789") + * 会自动去重返回结果,非法格式的标识将被忽略 * - * @param storageIds 包含分配类型和ID的字符串 - * @return 匹配的用户列表,格式非法返回空列表 + * @param storageIds 多个存储标识符字符串(逗号分隔) + * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 */ List fetchUsersByStorageIds(String storageIds); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 5ebf2bbeb..3009e0a1d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -166,11 +166,12 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand } /** - * 根据存储标识符(storageId)解析分配类型和ID,并获取对应的用户列表 - * 支持单个标识(例如 "user:123" 或 "456"),格式非法将返回空列表 + * 批量解析多个存储标识符(storageIds),按类型分类并合并查询用户列表 + * 输入格式支持多个以逗号分隔的标识(如 "user:123,role:456,789") + * 会自动去重返回结果,非法格式的标识将被忽略 * - * @param storageIds 包含分配类型和ID的字符串 - * @return 匹配的用户列表,格式非法返回空列表 + * @param storageIds 多个存储标识符字符串(逗号分隔) + * @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 */ @Override public List fetchUsersByStorageIds(String storageIds) { From 90fb26fbf163724956995c1230228212629b605c 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, 14 May 2025 18:01:46 +0800 Subject: [PATCH 154/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20redis?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7=E5=88=B0?= =?UTF-8?q?7.2.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index 3814a2d89..3767194d2 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -48,7 +48,7 @@ services: network_mode: "host" redis: - image: redis:6.2.12 + image: redis:7.2.8 container_name: redis ports: - "6379:6379" From cf871d9387ef540b443b2dab5ff10d667fc46826 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, 14 May 2025 18:08:58 +0800 Subject: [PATCH 155/155] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20mysql?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7=E5=88=B0?= =?UTF-8?q?8.0.42?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index 3767194d2..82548e4db 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -1,6 +1,6 @@ services: mysql: - image: mysql:8.0.33 + image: mysql:8.0.42 container_name: mysql environment: # 时区上海