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 01/53] =?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 02/53] =?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 03/53] =?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 04/53] =?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 05/53] =?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 06/53] =?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 07/53] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20ProcessTask?=
=?UTF-8?q?Event=20=E6=94=B9=E5=90=8D=E4=B8=BA=20ProcessCreateTaskEvent=20?=
=?UTF-8?q?=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 08/53] =?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 09/53] =?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 10/53] =?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 11/53] 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 12/53] =?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 13/53] =?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 14/53] =?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 15/53] =?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 16/53] =?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 17/53] =?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 18/53] =?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 19/53] =?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 20/53] =?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 21/53] =?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 22/53] =?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 23/53] =?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 24/53] =?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 25/53] =?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 26/53] =?UTF-8?q?update=20mybatis-plus=203.5.10=20=3D>=203?=
=?UTF-8?q?.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 27/53] =?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 28/53] =?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 29/53] =?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 30/53] =?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 31/53] =?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 32/53] =?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 33/53] =?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 34/53] =?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 35/53] =?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 36/53] =?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 37/53] =?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 38/53] =?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 39/53] =?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 40/53] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20getLoginUse?=
=?UTF-8?q?r=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 41/53] =?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 42/53] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20getLoginUse?=
=?UTF-8?q?r=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 43/53] =?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 44/53] =?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 45/53] =?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 46/53] =?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 47/53] =?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 48/53] =?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 49/53] =?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 50/53] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B0=86cr?=
=?UTF-8?q?t=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 51/53] =?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 52/53] =?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 53/53] =?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 @@
[](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE)
[](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[](https://gitee.com/dromara/RuoYi-Vue-Plus)
+[](https://gitee.com/dromara/RuoYi-Vue-Plus)
[]()
[]()
[]()
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:
# 时区上海