From 6d2f104a43e2ae4b8a1340ab2a333fa73b838aba 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, 29 May 2025 19:50:50 +0800 Subject: [PATCH 01/54] =?UTF-8?q?fixbug=20=E4=BF=AE=E5=A4=8D=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E8=A7=A3=E6=9E=90=E5=B7=A5=E5=85=B7=E7=B1=BB=E6=8A=A5?= =?UTF-8?q?=E9=94=99#ICBHUQ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/ip/AddressUtils.java | 53 ++++++++++++++----- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java index 104734465..2fe3bd7b6 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/AddressUtils.java @@ -16,28 +16,55 @@ import org.dromara.common.core.utils.StringUtils; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddressUtils { + // 未知IP + public static final String UNKNOWN_IP = "XX XX"; + // 内网地址 + public static final String LOCAL_ADDRESS = "内网IP"; // 未知地址 - public static final String UNKNOWN = "XX XX"; + public static final String UNKNOWN_ADDRESS = "未知"; public static String getRealAddressByIP(String ip) { // 处理空串并过滤HTML标签 ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip,"")); - boolean isIPv6 = NetUtils.isIPv6(ip); - // 判断是否为IPv4或IPv6,如果不是则返回未知地址 - if (!NetUtils.isIPv4(ip) && !isIPv6) { - return UNKNOWN; + // 判断是否为IPv4 + if (NetUtils.isIPv4(ip)) { + return resolverIPv4Region(ip); } + // 判断是否为IPv6 + if (NetUtils.isIPv6(ip)) { + return resolverIPv6Region(ip); + } + // 如果不是IPv4或IPv6,则返回未知IP + return UNKNOWN_IP; + } + + /** + * 根据IPv4地址查询IP归属行政区域 + * @param ip ipv4地址 + * @return 归属行政区域 + */ + private static String resolverIPv4Region(String ip){ // 内网不查询 - if (NetUtils.isInnerIPv6(ip) || NetUtils.isInnerIP(ip)) { - return "内网IP"; - } - // 不支持IPv6,不再进行没有必要的IP地址信息的解析,直接返回 - if (isIPv6) { - log.warn("ip2region不支持IPV6地址解析:{}", ip); - // 如有需要,可自行实现IPv6地址信息解析逻辑,并在这里返回 - return "未知"; + if (NetUtils.isInnerIP(ip)) { + return LOCAL_ADDRESS; } return RegionUtils.getCityInfo(ip); } + /** + * 根据IPv6地址查询IP归属行政区域 + * @param ip ipv6地址 + * @return 归属行政区域 + */ + private static String resolverIPv6Region(String ip){ + // 内网不查询 + if (NetUtils.isInnerIPv6(ip)) { + return LOCAL_ADDRESS; + } + log.warn("ip2region不支持IPV6地址解析:{}", ip); + // 不支持IPv6,不再进行没有必要的IP地址信息的解析,直接返回 + // 如有需要,可自行实现IPv6地址信息解析逻辑,并在这里返回 + return UNKNOWN_ADDRESS; + } + } From 0b0f2ee8eadf7b32cd30827b4836b85067e7aec8 Mon Sep 17 00:00:00 2001 From: dhb52 Date: Fri, 30 May 2025 08:07:24 +0000 Subject: [PATCH 02/54] =?UTF-8?q?!692=20fix:=20=E9=9C=80=E8=A6=81=E4=BC=A0?= =?UTF-8?q?=E9=80=92=20version=20=E5=AD=97=E6=AE=B5=E6=89=8D=E8=83=BD?= =?UTF-8?q?=E5=90=AF=E7=94=A8=E4=B9=90=E8=A7=82=E9=94=81=20*=20fix:=20?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E4=BC=A0=E9=80=92=20version=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=89=8D=E8=83=BD=E5=90=AF=E7=94=A8=E4=B9=90=E8=A7=82?= =?UTF-8?q?=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java | 5 +++++ .../src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java index 81346770e..ef21980d3 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestDemoBo.java @@ -59,4 +59,9 @@ public class TestDemoBo extends BaseEntity { @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) private String value; + /** + * 版本 + */ + private Long version; + } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index c6595b0e2..e757221c3 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -108,4 +108,9 @@ public class TestDemoVo implements Serializable { @ExcelProperty(value = "更新人账号") private String updateByName; + /** + * 版本 + */ + private Long version; + } From ea9379a52f872d780e642dcf0415a3412901b6ab 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, 30 May 2025 23:40:39 +0800 Subject: [PATCH 03/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20justauth=20?= =?UTF-8?q?=E5=AE=98=E6=96=B9=E4=BB=A3=E7=A0=81bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractAuthWeChatEnterpriseRequest.java | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java new file mode 100644 index 000000000..f2a1f7b9f --- /dev/null +++ b/ruoyi-common/ruoyi-common-social/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java @@ -0,0 +1,154 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.enums.AuthUserGender; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.HttpUtils; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + *

+ * 企业微信登录父类 + *

+ * + * @author liguanhua (347826496(a)qq.com) + * @since 1.15.9 + */ +public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultRequest { + + public AbstractAuthWeChatEnterpriseRequest(AuthConfig config, AuthSource source) { + super(config,source); + } + + + public AbstractAuthWeChatEnterpriseRequest(AuthConfig config, AuthSource source, AuthStateCache authStateCache) { + super(config, source, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + String response = doGetAuthorizationCode(accessTokenUrl(null)); + + JSONObject object = this.checkResponse(response); + + return AuthToken.builder() + .accessToken(object.getString("access_token")) + .expireIn(object.getIntValue("expires_in")) + .code(authCallback.getCode()) + .build(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + String response = doGetUserInfo(authToken); + JSONObject object = this.checkResponse(response); + + // 返回 OpenId 或其他,均代表非当前企业用户,不支持 + // https://github.com/justauth/JustAuth/issues/227 修复bug + if (!object.containsKey("userid")) { + throw new AuthException(AuthResponseStatus.UNIDENTIFIED_PLATFORM, source); + } + String userId = object.getString("userid"); + String userTicket = object.getString("user_ticket"); + JSONObject userDetail = getUserDetail(authToken.getAccessToken(), userId, userTicket); + + return AuthUser.builder() + .rawUserInfo(userDetail) + .username(userDetail.getString("name")) + .nickname(userDetail.getString("alias")) + .avatar(userDetail.getString("avatar")) + .location(userDetail.getString("address")) + .email(userDetail.getString("email")) + .uuid(userId) + .gender(AuthUserGender.getWechatRealGender(userDetail.getString("gender"))) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 校验请求结果 + * + * @param response 请求结果 + * @return 如果请求结果正常,则返回JSONObject + */ + private JSONObject checkResponse(String response) { + JSONObject object = JSONObject.parseObject(response); + + if (object.containsKey("errcode") && object.getIntValue("errcode") != 0) { + throw new AuthException(object.getString("errmsg"), source); + } + + return object; + } + + + /** + * 返回获取accessToken的url + * + * @param code 授权码 + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("corpid", config.getClientId()) + .queryParam("corpsecret", config.getClientSecret()) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken 用户授权后的token + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("code", authToken.getCode()) + .build(); + } + + /** + * 用户详情 + * + * @param accessToken accessToken + * @param userId 企业内用户id + * @param userTicket 成员票据,用于获取用户信息或敏感信息 + * @return 用户详情 + */ + private JSONObject getUserDetail(String accessToken, String userId, String userTicket) { + // 用户基础信息 + String userInfoUrl = UrlBuilder.fromBaseUrl("https://qyapi.weixin.qq.com/cgi-bin/user/get") + .queryParam("access_token", accessToken) + .queryParam("userid", userId) + .build(); + String userInfoResponse = new HttpUtils(config.getHttpConfig()).get(userInfoUrl).getBody(); + JSONObject userInfo = checkResponse(userInfoResponse); + + // 用户敏感信息 + if (StringUtils.isNotEmpty(userTicket)) { + String userDetailUrl = UrlBuilder.fromBaseUrl("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail") + .queryParam("access_token", accessToken) + .build(); + JSONObject param = new JSONObject(); + param.put("user_ticket", userTicket); + String userDetailResponse = new HttpUtils(config.getHttpConfig()).post(userDetailUrl, param.toJSONString()).getBody(); + JSONObject userDetail = checkResponse(userDetailResponse); + + userInfo.putAll(userDetail); + } + return userInfo; + } + +} From 297e920179ef0ef845cf1eb7ad61b4e3581b428d 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, 3 Jun 2025 10:14:05 +0800 Subject: [PATCH 04/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20satoken?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E8=B0=83=E7=94=A8=E9=9C=80=E8=A6=81=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E4=BC=A0=E9=80=92=E4=B8=8A=E4=B8=8B=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/web/controller/AuthController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index 7fbc57f95..d7e17f282 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,6 +1,7 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.context.mock.SaTokenContextMockUtil; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.codec.Base64; @@ -103,10 +104,13 @@ public class AuthController { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { - SseMessageDto dto = new SseMessageDto(); - dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); - dto.setUserIds(List.of(userId)); - SseMessageUtils.publishMessage(dto); + SaTokenContextMockUtil.setMockContext(() -> { + StpUtil.setTokenValueToStorage(loginVo.getAccessToken()); + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); + }); }, 5, TimeUnit.SECONDS); return R.ok(loginVo); } From fecc5640993367f5474db5f565594a1c288fd600 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, 3 Jun 2025 11:17:17 +0800 Subject: [PATCH 05/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BD=AC=E7=A7=BB=E7=AC=A6?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=B8=8D=E7=94=9F=E6=95=88=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=BD=BF=E7=94=A8=E5=8D=95=E6=96=9C=E6=9D=A0?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_vue_5.X.sql | 8 ++++---- script/sql/postgres/postgres_ry_vue_5.X.sql | 8 ++++---- script/sql/ry_vue_5.X.sql | 8 ++++---- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 8 ++++---- script/sql/update/oracle/update_5.3.1-5.4.0.sql | 8 ++++---- script/sql/update/postgres/update_5.3.1-5.4.0.sql | 8 ++++---- script/sql/update/sqlserver/update_5.3.1-5.4.0.sql | 8 ++++---- script/sql/update/update_5.3.1-5.4.0.sql | 8 ++++---- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index baf00494d..c39ce4b0c 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -447,10 +447,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate, null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate, null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate, null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate, null, null, ''); -- springboot-admin监控 diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index ce836c405..4442fb54e 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -448,10 +448,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', '1', '0', 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, now(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', '1', '0', 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, now(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', '1', '0', 'C', '0', '0', 'system:client:list', 'international', 103, 1, now(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', '1', '1', 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, now(), null, null, ''); -- springboot-admin监控 diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 9c9bad517..82ca5676e 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -282,10 +282,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); -- springboot-admin监控 diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index 6a66f0ac2..e3b6de39c 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -1690,13 +1690,13 @@ INSERT sys_menu VALUES (122, N'租户套餐管理', 6, 2, N'tenantPackage', N'sy GO INSERT sys_menu VALUES (123, N'客户端管理', 1, 11, N'client', N'system/client/index', N'', 1, 0, N'C', N'0', N'0', N'system:client:list', N'international', 103, 1, getdate(), NULL, NULL, N'客户端管理菜单') GO -INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId(\\d+)', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId(\d+)', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId(\\d+)', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId(\d+)', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId(\\d+)', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId(\d+)', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId(\\d+)', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId(\d+)', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); GO INSERT sys_menu VALUES (133, N'文件配置管理', 1, 10, N'oss-config/index', N'system/oss/config', N'', 1, 1, N'C', N'1', N'0', N'system:ossConfig:list', N'#', 103, 1, getdate(), null, null, N''); GO diff --git a/script/sql/update/oracle/update_5.3.1-5.4.0.sql b/script/sql/update/oracle/update_5.3.1-5.4.0.sql index d0d049932..9ff8ed44f 100644 --- a/script/sql/update/oracle/update_5.3.1-5.4.0.sql +++ b/script/sql/update/oracle/update_5.3.1-5.4.0.sql @@ -9,10 +9,10 @@ ALTER TABLE sys_social MODIFY (access_token VARCHAR2(2000 BYTE)) MODIFY (refresh_token VARCHAR2(2000 BYTE)); -INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); INSERT INTO sys_menu VALUES ('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate, null, null, ''); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); diff --git a/script/sql/update/postgres/update_5.3.1-5.4.0.sql b/script/sql/update/postgres/update_5.3.1-5.4.0.sql index 476229c84..7357de8c5 100644 --- a/script/sql/update/postgres/update_5.3.1-5.4.0.sql +++ b/script/sql/update/postgres/update_5.3.1-5.4.0.sql @@ -9,10 +9,10 @@ ALTER TABLE sys_social ALTER COLUMN access_token TYPE varchar(2000), ALTER COLUMN refresh_token TYPE varchar(2000); -INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); INSERT INTO sys_menu VALUES ('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', '1', '1', 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, now(), null, null, ''); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql index c5ec57ccc..74a0b7e7a 100644 --- a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql +++ b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql @@ -47,13 +47,13 @@ GO ALTER TABLE sys_social ALTER COLUMN refresh_token VARCHAR(2000) NULL GO -INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId(\\d+)', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId(\d+)', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId(\\d+)', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId(\d+)', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId(\\d+)', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId(\d+)', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId(\\d+)', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId(\d+)', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); GO INSERT sys_menu VALUES (133, N'文件配置管理', 1, 10, N'oss-config/index', N'system/oss/config', N'', 1, 1, N'C', N'1', N'0', N'system:ossConfig:list', N'#', 103, 1, getdate(), null, null, N''); GO diff --git a/script/sql/update/update_5.3.1-5.4.0.sql b/script/sql/update/update_5.3.1-5.4.0.sql index d5062c31b..55b29ee3c 100644 --- a/script/sql/update/update_5.3.1-5.4.0.sql +++ b/script/sql/update/update_5.3.1-5.4.0.sql @@ -12,10 +12,10 @@ ALTER TABLE `sys_social` ALTER TABLE `sys_social` MODIFY COLUMN `refresh_token` varchar(2000) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`; -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, ''); From b2d694b90b01823103ac1b9cb9e8b691034f72fb 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, 3 Jun 2025 16:13:05 +0800 Subject: [PATCH 06/54] =?UTF-8?q?reset=20=E4=BF=AE=E5=A4=8D=20satoken?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E8=B0=83=E7=94=A8=E9=9C=80=E8=A6=81=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E4=BC=A0=E9=80=92=E4=B8=8A=E4=B8=8B=E6=96=87=20(?= =?UTF-8?q?=E8=B7=9Fsatoken=E6=97=A0=E5=85=B3=E7=9A=84=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E4=B8=8D=E7=94=A8=E5=A4=84=E7=90=86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/web/controller/AuthController.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index d7e17f282..7fbc57f95 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,7 +1,6 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; -import cn.dev33.satoken.context.mock.SaTokenContextMockUtil; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.codec.Base64; @@ -104,13 +103,10 @@ public class AuthController { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { - SaTokenContextMockUtil.setMockContext(() -> { - StpUtil.setTokenValueToStorage(loginVo.getAccessToken()); - SseMessageDto dto = new SseMessageDto(); - dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); - dto.setUserIds(List.of(userId)); - SseMessageUtils.publishMessage(dto); - }); + SseMessageDto dto = new SseMessageDto(); + dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统"); + dto.setUserIds(List.of(userId)); + SseMessageUtils.publishMessage(dto); }, 5, TimeUnit.SECONDS); return R.ok(loginVo); } From 60b0faa3c6778d624603890361b9daf283c7a389 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, 3 Jun 2025 17:11:39 +0800 Subject: [PATCH 07/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B0=86de?= =?UTF-8?q?bian=E6=8D=A2=E4=B8=BA=E6=9B=B4=E6=96=B0=E6=9B=B4=E5=A5=91?= =?UTF-8?q?=E5=90=88=E7=9A=84rockylinux(centos=E4=BD=9C=E8=80=85=E5=86=99?= =?UTF-8?q?=E7=9A=84=E7=A8=B3=E5=AE=9A)=20=E5=8D=87=E7=BA=A7jdk=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E9=81=BF=E5=85=8D=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/Dockerfile | 4 ++-- ruoyi-extend/ruoyi-monitor-admin/Dockerfile | 4 ++-- ruoyi-extend/ruoyi-snailjob-server/Dockerfile | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile index 278d67bb4..fc13f4ff7 100644 --- a/ruoyi-admin/Dockerfile +++ b/ruoyi-admin/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile index d55b95627..f97cb9e86 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile +++ b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" diff --git a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile index 6f4484d33..d134a95bd 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile +++ b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-debian:17.0.11-cds -#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds +FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" From eff131a1ed6aa31336d20418ce2b82a5733b23f4 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, 5 Jun 2025 16:47:34 +0800 Subject: [PATCH 08/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E7=A7=9F=E6=88=B7=E8=A1=A8=E5=88=A4=E6=96=AD=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E7=B2=BE=E7=A1=AE=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/tenant/handle/PlusTenantLineHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java index d518becbc..f6d224bd6 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java @@ -48,7 +48,7 @@ public class PlusTenantLineHandler implements TenantLineHandler { "gen_table_column" ); tables.addAll(excludes); - return StringUtils.containsAnyIgnoreCase(tableName, tables.toArray(new String[0])); + return StringUtils.equalsAnyIgnoreCase(tableName, tables.toArray(new String[0])); } return true; } From 529f1e5dbba90edb9e98b50d393749285de73cbd 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, 5 Jun 2025 18:27:44 +0800 Subject: [PATCH 09/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=A5=97=E9=A4=90=E8=8F=9C=E5=8D=95=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E6=8E=89=20=E7=A7=9F=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=9B=B8=E5=85=B3=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/system/SysMenuController.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index 3171ec390..6e682d89f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -21,6 +21,7 @@ import org.dromara.system.service.ISysMenuService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.List; /** @@ -111,9 +112,14 @@ public class SysMenuController extends BaseController { @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { List menus = menuService.selectMenuList(LoginHelper.getUserId()); - MenuTreeSelectVo selectVo = new MenuTreeSelectVo( - menuService.selectMenuListByPackageId(packageId), - menuService.buildMenuTreeSelect(menus)); + List> list = menuService.buildMenuTreeSelect(menus); + // 删除租户管理菜单 + list.removeIf(menu -> menu.getId() == 6L); + List ids = new ArrayList<>(); + if (packageId > 0L) { + ids = menuService.selectMenuListByPackageId(packageId); + } + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(ids, list); return R.ok(selectVo); } From 7471fa7ee0cfcd1cd922d652b98223b97e8aed12 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 6 Jun 2025 09:45:06 +0800 Subject: [PATCH 10/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=A0=B9?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E4=B8=8D=E5=85=81=E8=AE=B8=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=8A=9E=E7=90=86=E4=BA=BA=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/system/SysDeptController.java | 3 +++ .../service/impl/FlwTaskAssigneeServiceImpl.java | 13 ++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 45b841850..4184a973d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -113,6 +113,9 @@ public class SysDeptController extends BaseController { @Log(title = "部门管理", businessType = BusinessType.DELETE) @DeleteMapping("/{deptId}") public R remove(@PathVariable Long deptId) { + if (StringUtils.equals(SystemConstants.ROOT_DEPT_ANCESTORS, String.valueOf(deptId))) { + return R.warn("根部门不允许删除"); + } if (deptService.hasChildByDeptId(deptId)) { return R.warn("存在下级部门,不允许删除"); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 3009e0a1d..04d4c6cb4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -106,15 +106,10 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand .map(entry -> { String storageId = entry.getKey(); Pair parsed = entry.getValue(); - String handlerName = "格式错误"; - if (parsed != null) { - Map nameMapping = nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap()); - handlerName = nameMapping.getOrDefault(parsed.getValue(), "未知名称"); - } - HandlerFeedBackVo backVo = new HandlerFeedBackVo(); - backVo.setStorageId(storageId); - backVo.setHandlerName(handlerName); - return backVo; + String handlerName = (parsed == null) ? null + : nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap()) + .get(parsed.getValue()); + return new HandlerFeedBackVo(storageId, handlerName); }).toList(); } From 8f95374cefb95a49e7a7751f9d8f91f034cb5714 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 6 Jun 2025 10:06:23 +0800 Subject: [PATCH 11/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E9=83=A8=E9=97=A8=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/common/core/constant/SystemConstants.java | 5 +++++ .../dromara/system/controller/system/SysDeptController.java | 4 ++-- 2 files changed, 7 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 8a37a51fc..4bd858f4c 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 @@ -77,4 +77,9 @@ public interface SystemConstants { */ String ROOT_DEPT_ANCESTORS = "0"; + /** + * 默认部门 ID + */ + Long DEFAULT_DEPT_ID = 100L; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 4184a973d..447c3368f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -113,8 +113,8 @@ public class SysDeptController extends BaseController { @Log(title = "部门管理", businessType = BusinessType.DELETE) @DeleteMapping("/{deptId}") public R remove(@PathVariable Long deptId) { - if (StringUtils.equals(SystemConstants.ROOT_DEPT_ANCESTORS, String.valueOf(deptId))) { - return R.warn("根部门不允许删除"); + if (SystemConstants.DEFAULT_DEPT_ID.equals(deptId)) { + return R.warn("默认部门,不允许删除"); } if (deptService.hasChildByDeptId(deptId)) { return R.warn("存在下级部门,不允许删除"); From fad91f01ff491f4319d13ee7d3b3a0c5e7574abd 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, 9 Jun 2025 14:54:03 +0800 Subject: [PATCH 12/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E6=AD=A3=E5=88=99=E6=A0=A1=E9=AA=8C=20=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E9=85=8D=E7=BD=AE=E5=AF=BC=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_vue_5.X.sql | 8 ++++---- script/sql/postgres/postgres_ry_vue_5.X.sql | 8 ++++---- script/sql/ry_vue_5.X.sql | 8 ++++---- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 8 ++++---- script/sql/update/oracle/update_5.3.1-5.4.0.sql | 8 ++++---- script/sql/update/postgres/update_5.3.1-5.4.0.sql | 8 ++++---- script/sql/update/sqlserver/update_5.3.1-5.4.0.sql | 8 ++++---- script/sql/update/update_5.3.1-5.4.0.sql | 8 ++++---- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index c39ce4b0c..daee48561 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -447,10 +447,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate, null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate, null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate, null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate, null, null, ''); -- springboot-admin监控 diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 4442fb54e..86a9eddd6 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -448,10 +448,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', '1', '0', 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, now(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', '1', '0', 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, now(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', '1', '0', 'C', '0', '0', 'system:client:list', 'international', 103, 1, now(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', '1', '1', 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, now(), null, null, ''); -- springboot-admin监控 diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 82ca5676e..9c9bad517 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -282,10 +282,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); -- springboot-admin监控 diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index e3b6de39c..c63313f00 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -1690,13 +1690,13 @@ INSERT sys_menu VALUES (122, N'租户套餐管理', 6, 2, N'tenantPackage', N'sy GO INSERT sys_menu VALUES (123, N'客户端管理', 1, 11, N'client', N'system/client/index', N'', 1, 0, N'C', N'0', N'0', N'system:client:list', N'international', 103, 1, getdate(), NULL, NULL, N'客户端管理菜单') GO -INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId(\d+)', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId(\d+)', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId(\d+)', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId(\d+)', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); GO INSERT sys_menu VALUES (133, N'文件配置管理', 1, 10, N'oss-config/index', N'system/oss/config', N'', 1, 1, N'C', N'1', N'0', N'system:ossConfig:list', N'#', 103, 1, getdate(), null, null, N''); GO diff --git a/script/sql/update/oracle/update_5.3.1-5.4.0.sql b/script/sql/update/oracle/update_5.3.1-5.4.0.sql index 9ff8ed44f..3561f4d94 100644 --- a/script/sql/update/oracle/update_5.3.1-5.4.0.sql +++ b/script/sql/update/oracle/update_5.3.1-5.4.0.sql @@ -9,10 +9,10 @@ ALTER TABLE sys_social MODIFY (access_token VARCHAR2(2000 BYTE)) MODIFY (refresh_token VARCHAR2(2000 BYTE)); -INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); -INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate, null, null, ''); +INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate, null, null, ''); INSERT INTO sys_menu VALUES ('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate, null, null, ''); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, SYSDATE, NULL, NULL, ''); diff --git a/script/sql/update/postgres/update_5.3.1-5.4.0.sql b/script/sql/update/postgres/update_5.3.1-5.4.0.sql index 7357de8c5..e0b67e2dc 100644 --- a/script/sql/update/postgres/update_5.3.1-5.4.0.sql +++ b/script/sql/update/postgres/update_5.3.1-5.4.0.sql @@ -9,10 +9,10 @@ ALTER TABLE sys_social ALTER COLUMN access_token TYPE varchar(2000), ALTER COLUMN refresh_token TYPE varchar(2000); -INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); -INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', '1', '1', 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', '1', '1', 'C', '1', '0', 'system:role:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', '1', '1', 'C', '1', '0', 'system:user:edit', '#', 103, 1, now(), null, null, ''); +INSERT INTO sys_menu VALUES ('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', '1', '1', 'C', '1', '0', 'system:dict:list', '#', 103, 1, now(), null, null, ''); INSERT INTO sys_menu VALUES ('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', '1', '1', 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, now(), null, null, ''); INSERT INTO sys_menu VALUES ('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); INSERT INTO sys_menu VALUES ('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', '1', '1', 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, ''); diff --git a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql index 74a0b7e7a..1535566ce 100644 --- a/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql +++ b/script/sql/update/sqlserver/update_5.3.1-5.4.0.sql @@ -47,13 +47,13 @@ GO ALTER TABLE sys_social ALTER COLUMN refresh_token VARCHAR(2000) NULL GO -INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId(\d+)', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (116, N'修改生成配置', 3, 2, N'gen-edit/index/:tableId', N'tool/gen/editTable', N'', 1, 1, N'C', N'1', N'0', N'tool:gen:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId(\d+)', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (130, N'分配用户', 1, 2, N'role-auth/user/:roleId', N'system/role/authUser', N'', 1, 1, N'C', N'1', N'0', N'system:role:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId(\d+)', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (131, N'分配角色', 1, 1, N'user-auth/role/:userId', N'system/user/authRole', N'', 1, 1, N'C', N'1', N'0', N'system:user:edit', N'#', 103, 1, getdate(), null, null, N''); GO -INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId(\d+)', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); +INSERT sys_menu VALUES (132, N'字典数据', 1, 6, N'dict-data/index/:dictId', N'system/dict/data', N'', 1, 1, N'C', N'1', N'0', N'system:dict:list', N'#', 103, 1, getdate(), null, null, N''); GO INSERT sys_menu VALUES (133, N'文件配置管理', 1, 10, N'oss-config/index', N'system/oss/config', N'', 1, 1, N'C', N'1', N'0', N'system:ossConfig:list', N'#', 103, 1, getdate(), null, null, N''); GO diff --git a/script/sql/update/update_5.3.1-5.4.0.sql b/script/sql/update/update_5.3.1-5.4.0.sql index 55b29ee3c..058f6fcba 100644 --- a/script/sql/update/update_5.3.1-5.4.0.sql +++ b/script/sql/update/update_5.3.1-5.4.0.sql @@ -12,10 +12,10 @@ ALTER TABLE `sys_social` ALTER TABLE `sys_social` MODIFY COLUMN `refresh_token` varchar(2000) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`; -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('11700', '流程设计', '11616', '5', 'design/index', 'workflow/processDefinition/design', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('11701', '请假申请', '11616', '6', 'leaveEdit/index', 'workflow/leave/leaveEdit', '', 1, 1, 'C', '1', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), null, null, ''); From be2e5059fd8137a6471e7ae83245c97e85ec9ad5 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, 12 Jun 2025 17:39:34 +0800 Subject: [PATCH 13/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4snailjob=E7=9A=84jvm=E5=8F=82=E6=95=B0=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=8D=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/src/main/resources/application.yml | 2 +- ruoyi-extend/ruoyi-snailjob-server/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 1bdc75e7e..03cb2f987 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -183,7 +183,7 @@ springdoc: # 描述 description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...' # 版本 - version: '版本号: ${ruoyi.version}' + version: '版本号: ${project.version}' # 作者信息 contact: name: Lion Li diff --git a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile index d134a95bd..ef85eb2c9 100644 --- a/ruoyi-extend/ruoyi-snailjob-server/Dockerfile +++ b/ruoyi-extend/ruoyi-snailjob-server/Dockerfile @@ -9,7 +9,7 @@ RUN mkdir -p /ruoyi/snailjob/logs WORKDIR /ruoyi/snailjob -ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m" +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE 8800 EXPOSE 17888 From 2ff2d89b2dbf1faf42a408d1ca4bca0769adaaf7 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, 13 Jun 2025 14:24:27 +0800 Subject: [PATCH 14/54] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/web/service/impl/SocialAuthStrategy.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java index ffe95e0b6..e01666ea6 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java @@ -3,10 +3,7 @@ package org.dromara.web.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.http.Method; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthResponse; @@ -68,15 +65,6 @@ public class SocialAuthStrategy implements IAuthStrategy { throw new ServiceException(response.getMsg()); } AuthUser authUserData = response.getData(); - if ("GITEE".equals(authUserData.getSource())) { - // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - } List list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); if (CollUtil.isEmpty(list)) { From d9cc85187a9772630b00ca780a745b0b15115a2c 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, 13 Jun 2025 17:30:01 +0800 Subject: [PATCH 15/54] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/ry_vue_5.X.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 9c9bad517..ddc20876d 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -282,10 +282,10 @@ insert into sys_menu values('115', '代码生成', '3', '2', 'gen', insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单'); insert into sys_menu values('123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); -insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId(\\d+)', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId(\\d+)', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId(\\d+)', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); -insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId(\\d+)', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('116', '修改生成配置', '3', '2', 'gen-edit/index/:tableId', 'tool/gen/editTable', '', 1, 1, 'C', '1', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('130', '分配用户', '1', '2', 'role-auth/user/:roleId', 'system/role/authUser', '', 1, 1, 'C', '1', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('131', '分配角色', '1', '1', 'user-auth/role/:userId', 'system/user/authRole', '', 1, 1, 'C', '1', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values('132', '字典数据', '1', '6', 'dict-data/index/:dictId', 'system/dict/data', '', 1, 1, 'C', '1', '0', 'system:dict:list', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('133', '文件配置管理', '1', '10', 'oss-config/index', 'system/oss/config', '', 1, 1, 'C', '1', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); -- springboot-admin监控 From 97d3a31abad5b75c06db55bf594a7bd3eef55da6 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, 16 Jun 2025 11:27:49 +0800 Subject: [PATCH 16/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20snailjob?= =?UTF-8?q?=E7=9A=84oracle.sql=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_job.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/sql/oracle/oracle_ry_job.sql b/script/sql/oracle/oracle_ry_job.sql index ba914e5f6..66943a934 100644 --- a/script/sql/oracle/oracle_ry_job.sql +++ b/script/sql/oracle/oracle_ry_job.sql @@ -411,7 +411,7 @@ CREATE TABLE sj_distributed_lock ); ALTER TABLE sj_distributed_lock - ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (id); + ADD CONSTRAINT pk_sj_distributed_lock PRIMARY KEY (name); COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称'; COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长'; From 9256432532734836647b7d277ea1f3a5f7d39c54 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 16 Jun 2025 19:55:34 +0800 Subject: [PATCH 17/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=EF=BC=8C=E8=B7=B3=E8=BF=87=E4=BB=A5=20$=20?= =?UTF-8?q?=E6=88=96=20#=20=E5=BC=80=E5=A4=B4=E7=9A=84=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwTaskAssigneeServiceImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 04d4c6cb4..af7f71bb7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -228,6 +228,14 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand * @return Pair(TaskAssigneeEnum, Long),如果格式非法返回 null */ private Pair parseStorageId(String storageId) { + if (StringUtils.isBlank(storageId)) { + return null; + } + // 跳过以 $ 或 # 开头的字符串 + if (StringUtils.startsWith(storageId, "$") || StringUtils.startsWith(storageId, "#")) { + log.info("跳过 storageId 解析,检测到内置变量表达式:{}", storageId); + return null; + } try { String[] parts = storageId.split(StrUtil.COLON, 2); if (parts.length < 2) { From d51f3b9f4ebd5406e2fc5719cfc2cae7810400a7 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 17 Jun 2025 09:17:49 +0800 Subject: [PATCH 18/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=86=85=E7=BD=AE=E5=8F=98=E9=87=8F=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E8=A7=A3=E6=9E=90=E6=97=A5=E5=BF=97=E7=BA=A7?= =?UTF-8?q?=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwTaskAssigneeServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index af7f71bb7..638c9a280 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -233,7 +233,7 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand } // 跳过以 $ 或 # 开头的字符串 if (StringUtils.startsWith(storageId, "$") || StringUtils.startsWith(storageId, "#")) { - log.info("跳过 storageId 解析,检测到内置变量表达式:{}", storageId); + log.debug("跳过 storageId 解析,检测到内置变量表达式:{}", storageId); return null; } try { From 83b6addbba7ea77ca68361c542f1728b10d63c3e Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 17 Jun 2025 09:49:31 +0800 Subject: [PATCH 19/54] =?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=E9=BB=98=E8=AE=A4?= =?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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 31e9be902..0bd5873e0 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 @@ -2,6 +2,7 @@ package org.dromara.system.service.impl; import cn.hutool.core.convert.Convert; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.service.TaskAssigneeService; @@ -51,6 +52,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { SysRoleBo bo = new SysRoleBo(); bo.setRoleKey(taskQuery.getHandlerCode()); bo.setRoleName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); @@ -73,6 +75,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { SysPostBo bo = new SysPostBo(); bo.setPostCategory(taskQuery.getHandlerCode()); bo.setPostName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); @@ -96,6 +99,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { SysDeptBo bo = new SysDeptBo(); bo.setDeptCategory(taskQuery.getHandlerCode()); bo.setDeptName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); @@ -107,7 +111,6 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { return new TaskAssigneeDTO(page.getTotal(), handlers); } - /** * 查询用户并返回任务指派的列表,支持分页 * @@ -120,6 +123,7 @@ public class SysTaskAssigneeServiceImpl implements TaskAssigneeService { SysUserBo bo = new SysUserBo(); bo.setUserName(taskQuery.getHandlerCode()); bo.setNickName(taskQuery.getHandlerName()); + bo.setStatus(SystemConstants.NORMAL); Map params = bo.getParams(); params.put("beginTime", taskQuery.getBeginTime()); params.put("endTime", taskQuery.getEndTime()); From bd88e27c820cabfacc9442bcb0f3817067e1e0bb 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, 17 Jun 2025 11:03:03 +0800 Subject: [PATCH 20/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E6=A8=A1=E5=9D=97=20=E8=A7=A3=E5=AF=86=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8=20=E5=B0=86=E5=8F=82=E6=95=B0=E4=B8=80?= =?UTF-8?q?=E8=B5=B7=E8=A7=A3=E5=AF=86=E4=BA=86=20=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=A2=AB=E5=A4=9A=E6=AC=A1=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/MybatisDecryptInterceptor.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java index 460aa360e..d5faae715 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.resultset.ResultSetHandler; import org.apache.ibatis.plugin.*; import org.dromara.common.core.utils.StringUtils; @@ -39,12 +40,23 @@ public class MybatisDecryptInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { + // 开始进行参数解密 + ResultSetHandler resultSetHandler = (ResultSetHandler) invocation.getTarget(); + Field parameterHandlerField = resultSetHandler.getClass().getDeclaredField("parameterHandler"); + parameterHandlerField.setAccessible(true); + Object target = parameterHandlerField.get(resultSetHandler); + if (target instanceof ParameterHandler parameterHandler) { + Object parameterObject = parameterHandler.getParameterObject(); + if (ObjectUtil.isNotNull(parameterObject) && !(parameterObject instanceof String)) { + this.decryptHandler(parameterObject); + } + } // 获取执行mysql执行结果 Object result = invocation.proceed(); if (result == null) { return null; } - decryptHandler(result); + this.decryptHandler(result); return result; } From d7af32724824812e6d9193d85d9558defe725d7d Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 19 Jun 2025 17:16:18 +0800 Subject: [PATCH 21/54] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7warm-flow1.7.3?= =?UTF-8?q?->1.7.4=20=E6=94=AF=E6=8C=81=E6=B5=81=E7=A8=8B=E5=9B=BE?= =?UTF-8?q?=E6=82=AC=E6=B5=AE=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/core/service/UserService.java | 8 + .../service/impl/SysUserServiceImpl.java | 26 ++- .../service/impl/FlwChartExtServiceImpl.java | 194 ++++++++++++++++++ .../service/impl/FlwTaskServiceImpl.java | 5 +- script/sql/ry_workflow.sql | 22 +- 6 files changed, 241 insertions(+), 16 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java diff --git a/pom.xml b/pom.xml index 8456059d8..2d5746c3a 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 8.7.2-20250101 - 1.7.3 + 1.7.4 3.2.2 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 4903c3860..271c46bcb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -52,6 +52,14 @@ public interface UserService { */ String selectEmailById(Long userId); + /** + * 通过用户ID查询用户详细信息 + * + * @param userId 用户id + * @return 用户详细信息 + */ + UserDTO selectUserDtoById(Long userId); + /** * 通过用户ID查询用户列表 * 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 cc2cc88a9..6b41b8e4f 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 @@ -623,6 +623,23 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return ObjectUtils.notNullGetter(sysUser, SysUser::getEmail); } + /** + * 通过用户ID查询用户详细信息 + * + * @param userId 用户id + * @return 用户详细信息 + */ + @Override + public UserDTO selectUserDtoById(Long userId) { + SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysUser::getUserId, SysUser::getDeptId, SysUser::getUserName, + SysUser::getNickName, SysUser::getUserType, SysUser::getEmail, + SysUser::getPhonenumber, SysUser::getSex, SysUser::getStatus, + SysUser::getCreateTime) + .eq(SysUser::getUserId, userId)); + return BeanUtil.toBean(sysUser, UserDTO.class); + } + /** * 通过用户ID查询用户列表 * @@ -635,7 +652,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return List.of(); } List list = baseMapper.selectVoList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) + .select(SysUser::getUserId, SysUser::getDeptId, SysUser::getUserName, + SysUser::getNickName, SysUser::getUserType, SysUser::getEmail, + SysUser::getPhonenumber, SysUser::getSex, SysUser::getStatus, + SysUser::getCreateTime) .eq(SysUser::getStatus, SystemConstants.NORMAL) .in(SysUser::getUserId, userIds)); return BeanUtil.copyToList(list, UserDTO.class); @@ -676,7 +696,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { // 获取用户ID列表 Set userIds = StreamUtils.toSet(userRoles, SysUserRole::getUserId); - return selectListByIds(new ArrayList<>(userIds)); + return this.selectListByIds(new ArrayList<>(userIds)); } /** @@ -716,7 +736,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { // 获取用户ID列表 Set userIds = StreamUtils.toSet(userPosts, SysUserPost::getUserId); - return selectListByIds(new ArrayList<>(userIds)); + return this.selectListByIds(new ArrayList<>(userIds)); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java new file mode 100644 index 000000000..e1f8f11a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -0,0 +1,194 @@ +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 com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.service.DeptService; +import org.dromara.common.core.service.UserService; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.warm.flow.core.dto.DefJson; +import org.dromara.warm.flow.core.dto.NodeJson; +import org.dromara.warm.flow.core.dto.PromptContent; +import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.orm.entity.FlowHisTask; +import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; +import org.dromara.warm.flow.ui.service.ChartExtService; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 流程图提示信息 + * + * @author AprilWind + */ +@ConditionalOnEnable +@Slf4j +@RequiredArgsConstructor +@Service +public class FlwChartExtServiceImpl implements ChartExtService { + + /** + * 悬浮窗整体样式(支持滚动) + */ + public static final Map DIALOG_STYLE = Map.ofEntries( + Map.entry("position", "absolute"), + Map.entry("backgroundColor", "#fff"), + Map.entry("border", "1px solid #ccc"), + Map.entry("borderRadius", "4px"), + Map.entry("boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)"), + Map.entry("padding", "8px 12px"), + Map.entry("fontSize", "14px"), + Map.entry("zIndex", 1000), + Map.entry("maxWidth", "500px"), + // 取消 maxHeight,让高度自适应 + Map.entry("overflowY", "visible"), + Map.entry("overflowX", "hidden"), + Map.entry("color", "#333"), + Map.entry("pointerEvents", "auto"), + Map.entry("scrollbarWidth", "thin") + ); + public static final Map PREFIX_STYLE = Map.of( + "textAlign", "right", + "color", "#444", + "userSelect", "none", + "display", "inline-block", + "width", "100px", + "paddingRight", "8px", + "fontWeight", "500", + "fontSize", "14px", + "lineHeight", "24px", + "verticalAlign", "middle" + ); + public static final Map CONTENT_STYLE = Map.of( + "backgroundColor", "#f7faff", + "color", "#005cbf", + "padding", "4px 8px", + "fontSize", "14px", + "borderRadius", "4px", + "whiteSpace", "normal", + "border", "1px solid #d0e5ff", + "userSelect", "text", + "lineHeight", "20px" + ); + public static final Map ROW_STYLE = Map.of( + "color", "#222", + "alignItems", "center", + "display", "flex", + "marginBottom", "6px", + "fontWeight", "400", + "fontSize", "14px" + ); + + private final UserService userService; + private final DeptService deptService; + private final FlowHisTaskMapper flowHisTaskMapper; + + /** + * 设置流程图提示信息 + * + * @param defJson 流程定义json对象 + */ + @Override + public void execute(DefJson defJson) { + //TODO 等待下一版本更新传递 流程实例id + Long instanceId = 1935591874325151746L; + // 按 nodeCode 分组的历史任务列表 + Map> groupedByNode = this.getHisTaskGroupedByNode(instanceId); + + // 遍历每个节点,处理扩展提示内容 + for (NodeJson nodeJson : defJson.getNodeList()) { + List taskList = groupedByNode.getOrDefault(nodeJson.getNodeCode(), Collections.emptyList()); + this.processNodeExtInfo(nodeJson, taskList); + } + } + + /** + * 初始化流程图提示信息 + * + * @param defJson 流程定义json对象 + */ + @Override + public void initPromptContent(DefJson defJson) { + ChartExtService.super.initPromptContent(defJson); + // 为每个节点设置统一的提示框样式 + defJson.getNodeList().forEach(nodeJson -> nodeJson.getPromptContent().setDialogStyle(DIALOG_STYLE)); + } + + /** + * 处理每个节点的扩展信息,生成提示内容 + * + * @param nodeJson 当前节点 + */ + private void processNodeExtInfo(NodeJson nodeJson, List taskList) { + if (CollUtil.isEmpty(taskList)) { + return; + } + List info = nodeJson.getPromptContent().getInfo(); + for (FlowHisTask task : taskList) { + UserDTO userDTO = userService.selectUserDtoById(Long.valueOf(task.getApprover())); + if (ObjectUtil.isEmpty(userDTO)) { + return; + } + String deptName = deptService.selectDeptNameByIds(String.valueOf(userDTO.getDeptId())); + String displayName = String.format("👤 %s(%s)", userDTO.getNickName(), deptName); + + info.add(new PromptContent.InfoItem() + .setPrefix(displayName) + .setPrefixStyle(Map.of( + "fontWeight", "bold", + "fontSize", "15px", + "color", "#333" + )) + .setContent("") + .setContentStyle(Collections.emptyMap()) + .setRowStyle(Map.of("margin", "8px 0", "borderBottom", "1px dashed #ccc")) + ); + info.add(buildInfoItem("用户账号", userDTO.getUserName())); + info.add(buildInfoItem("审批耗时", DateUtils.getTimeDifference(task.getUpdateTime(), task.getCreateTime()))); + info.add(buildInfoItem("办理时间", DateUtils.formatDateTime(task.getUpdateTime()))); + } + } + + /** + * 构建单条提示内容对象 InfoItem,用于悬浮窗显示(key: value) + * + * @param key 字段名(作为前缀) + * @param value 字段值 + * @return 提示项对象 + */ + private PromptContent.InfoItem buildInfoItem(String key, String value) { + return new PromptContent.InfoItem() + .setPrefix(key + ": ") + .setPrefixStyle(PREFIX_STYLE) + .setContent(value) + .setContentStyle(CONTENT_STYLE) + .setRowStyle(ROW_STYLE); + } + + /** + * 根据流程实例ID获取按节点编号分组的历史任务列表 + * + * @param instanceId 流程实例ID + * @return Map<节点编码, 对应的历史任务列表> + */ + public Map> getHisTaskGroupedByNode(Long instanceId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(FlowHisTask::getInstanceId, instanceId); + wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); + wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); + List flowHisTasks = flowHisTaskMapper.selectList(wrapper); + + return flowHisTasks.stream() + .collect(Collectors.groupingBy(FlowHisTask::getNodeCode)); + } + +} 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 8a2f72380..71ce177aa 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 @@ -530,7 +530,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService { // 构建以下节点数据 List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build())); // 办理人变量替换 - ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable); + ExpressionUtil.evalVariable(buildNextTaskList, + FlowParams.build() + .variable(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/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 5e055d2ed..20b96dfa6 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -29,7 +29,7 @@ CREATE TABLE `flow_node` `definition_id` bigint NOT NULL COMMENT '流程定义id', `node_code` varchar(100) NOT NULL COMMENT '流程节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', - `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用逗号隔开)', + `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用@@隔开)', `node_ratio` decimal(6, 3) DEFAULT NULL COMMENT '流程签署比例值', `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', `any_node_skip` varchar(100) DEFAULT NULL COMMENT '任意结点跳转', @@ -42,7 +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 '扩展属性', + `ext` text COMMENT '节点扩展属性', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', PRIMARY KEY (`id`) USING BTREE @@ -96,7 +96,7 @@ CREATE TABLE `flow_task` `node_code` varchar(100) NOT NULL COMMENT '节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '节点名称', `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', - `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -108,25 +108,25 @@ CREATE TABLE `flow_task` CREATE TABLE `flow_his_task` ( - `id` bigint(20) NOT NULL COMMENT '主键id', - `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', - `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', - `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', + `id` bigint(20) NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', + `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', + `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', `node_code` varchar(100) DEFAULT NULL COMMENT '开始节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '开始节点名称', `node_type` tinyint(1) DEFAULT NULL COMMENT '开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', `target_node_code` varchar(200) DEFAULT NULL COMMENT '目标节点编码', `target_node_name` varchar(200) DEFAULT NULL COMMENT '结束节点名称', `approver` varchar(40) DEFAULT NULL COMMENT '审批者', - `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', + `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', `collaborator` varchar(40) DEFAULT NULL COMMENT '协作人', - `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', - `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', `message` varchar(500) DEFAULT NULL COMMENT '审批意见', `variable` TEXT DEFAULT NULL COMMENT '任务变量', - `ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', + `ext` TEXT DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', `create_time` datetime DEFAULT NULL COMMENT '任务开始时间', `update_time` datetime DEFAULT NULL COMMENT '审批完成时间', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', From f3d475438f09d93cc646e16fcd13c20330ad6267 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 19 Jun 2025 18:13:34 +0800 Subject: [PATCH 22/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=9A=84=E6=B5=81=E7=A8=8B=E5=9B=BE=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwChartExtServiceImpl.java | 159 ++++++++++-------- .../service/impl/FlwInstanceServiceImpl.java | 8 +- 2 files changed, 92 insertions(+), 75 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index e1f8f11a7..6f3d7c90e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -10,6 +10,7 @@ import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.DefJson; import org.dromara.warm.flow.core.dto.NodeJson; import org.dromara.warm.flow.core.dto.PromptContent; @@ -36,58 +37,6 @@ import java.util.stream.Collectors; @Service public class FlwChartExtServiceImpl implements ChartExtService { - /** - * 悬浮窗整体样式(支持滚动) - */ - public static final Map DIALOG_STYLE = Map.ofEntries( - Map.entry("position", "absolute"), - Map.entry("backgroundColor", "#fff"), - Map.entry("border", "1px solid #ccc"), - Map.entry("borderRadius", "4px"), - Map.entry("boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)"), - Map.entry("padding", "8px 12px"), - Map.entry("fontSize", "14px"), - Map.entry("zIndex", 1000), - Map.entry("maxWidth", "500px"), - // 取消 maxHeight,让高度自适应 - Map.entry("overflowY", "visible"), - Map.entry("overflowX", "hidden"), - Map.entry("color", "#333"), - Map.entry("pointerEvents", "auto"), - Map.entry("scrollbarWidth", "thin") - ); - public static final Map PREFIX_STYLE = Map.of( - "textAlign", "right", - "color", "#444", - "userSelect", "none", - "display", "inline-block", - "width", "100px", - "paddingRight", "8px", - "fontWeight", "500", - "fontSize", "14px", - "lineHeight", "24px", - "verticalAlign", "middle" - ); - public static final Map CONTENT_STYLE = Map.of( - "backgroundColor", "#f7faff", - "color", "#005cbf", - "padding", "4px 8px", - "fontSize", "14px", - "borderRadius", "4px", - "whiteSpace", "normal", - "border", "1px solid #d0e5ff", - "userSelect", "text", - "lineHeight", "20px" - ); - public static final Map ROW_STYLE = Map.of( - "color", "#222", - "alignItems", "center", - "display", "flex", - "marginBottom", "6px", - "fontWeight", "400", - "fontSize", "14px" - ); - private final UserService userService; private final DeptService deptService; private final FlowHisTaskMapper flowHisTaskMapper; @@ -120,38 +69,75 @@ public class FlwChartExtServiceImpl implements ChartExtService { public void initPromptContent(DefJson defJson) { ChartExtService.super.initPromptContent(defJson); // 为每个节点设置统一的提示框样式 - defJson.getNodeList().forEach(nodeJson -> nodeJson.getPromptContent().setDialogStyle(DIALOG_STYLE)); + defJson.getNodeList().forEach(nodeJson -> + nodeJson.getPromptContent() + .setDialogStyle( + Map.ofEntries( + Map.entry("position", "absolute"), + Map.entry("backgroundColor", "#fff"), + Map.entry("border", "1px solid #ccc"), + Map.entry("borderRadius", "4px"), + Map.entry("boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)"), + Map.entry("padding", "8px 12px"), + Map.entry("fontSize", "14px"), + Map.entry("zIndex", 1000), + Map.entry("maxWidth", "500px"), + Map.entry("overflowY", "visible"), + Map.entry("overflowX", "hidden"), + Map.entry("color", "#333"), + Map.entry("pointerEvents", "auto"), + Map.entry("scrollbarWidth", "thin") + ) + ) + ); } /** - * 处理每个节点的扩展信息,生成提示内容 + * 处理节点的扩展信息,构建用于流程图悬浮提示的内容 * - * @param nodeJson 当前节点 + * @param nodeJson 当前节点对象 + * @param taskList 当前节点对应的历史审批任务列表 */ private void processNodeExtInfo(NodeJson nodeJson, List taskList) { if (CollUtil.isEmpty(taskList)) { return; } + + // 根据 taskList 中的 approver ID 查询用户,并构建 userId -> UserDTO 的映射表 + Map userMap = userService.selectListByIds( + taskList.stream() + .map(task -> Long.valueOf(task.getApprover())) + .collect(Collectors.toList()) + ).stream().collect(Collectors.toMap(UserDTO::getUserId, user -> user)); + + // 获取节点提示内容对象中的 info 列表,用于追加提示项 List info = nodeJson.getPromptContent().getInfo(); + + // 遍历所有任务记录,构建提示内容 for (FlowHisTask task : taskList) { - UserDTO userDTO = userService.selectUserDtoById(Long.valueOf(task.getApprover())); + UserDTO userDTO = userMap.get(Long.valueOf(task.getApprover())); if (ObjectUtil.isEmpty(userDTO)) { return; } - String deptName = deptService.selectDeptNameByIds(String.valueOf(userDTO.getDeptId())); - String displayName = String.format("👤 %s(%s)", userDTO.getNickName(), deptName); + // 查询用户所属部门名称 + String deptName = deptService.selectDeptNameByIds(String.valueOf(userDTO.getDeptId())); + + // 添加标题项,如:👤 张三(市场部) info.add(new PromptContent.InfoItem() - .setPrefix(displayName) + .setPrefix(StringUtils.format("👥 {}({})", userDTO.getNickName(), deptName)) .setPrefixStyle(Map.of( "fontWeight", "bold", "fontSize", "15px", "color", "#333" )) - .setContent("") - .setContentStyle(Collections.emptyMap()) - .setRowStyle(Map.of("margin", "8px 0", "borderBottom", "1px dashed #ccc")) + .setRowStyle(Map.of( + "margin", "8px 0", + "borderBottom", "1px dashed #ccc" + )) ); + + // 添加具体信息项:账号、耗时、时间 info.add(buildInfoItem("用户账号", userDTO.getUserName())); info.add(buildInfoItem("审批耗时", DateUtils.getTimeDifference(task.getUpdateTime(), task.getCreateTime()))); info.add(buildInfoItem("办理时间", DateUtils.formatDateTime(task.getUpdateTime()))); @@ -167,11 +153,44 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ private PromptContent.InfoItem buildInfoItem(String key, String value) { return new PromptContent.InfoItem() + // 前缀 .setPrefix(key + ": ") - .setPrefixStyle(PREFIX_STYLE) + // 前缀样式 + .setPrefixStyle(Map.of( + "textAlign", "right", + "color", "#444", + "userSelect", "none", + "display", "inline-block", + "width", "100px", + "paddingRight", "8px", + "fontWeight", "500", + "fontSize", "14px", + "lineHeight", "24px", + "verticalAlign", "middle" + )) + // 内容 .setContent(value) - .setContentStyle(CONTENT_STYLE) - .setRowStyle(ROW_STYLE); + // 内容样式 + .setContentStyle(Map.of( + "backgroundColor", "#f7faff", + "color", "#005cbf", + "padding", "4px 8px", + "fontSize", "14px", + "borderRadius", "4px", + "whiteSpace", "normal", + "border", "1px solid #d0e5ff", + "userSelect", "text", + "lineHeight", "20px" + )) + // 行样式 + .setRowStyle(Map.of( + "color", "#222", + "alignItems", "center", + "display", "flex", + "marginBottom", "6px", + "fontWeight", "400", + "fontSize", "14px" + )); } /** @@ -182,13 +201,11 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ public Map> getHisTaskGroupedByNode(Long instanceId) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(FlowHisTask::getInstanceId, instanceId); - wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); - wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); + wrapper.eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) + .orderByDesc(FlowHisTask::getCreateTime, FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); - - return flowHisTasks.stream() - .collect(Collectors.groupingBy(FlowHisTask::getNodeCode)); + return flowHisTasks.stream().collect(Collectors.groupingBy(FlowHisTask::getNodeCode)); } } 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 848bec4eb..a3e272f7e 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 @@ -304,14 +304,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { } //历史任务 LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(FlowHisTask::getInstanceId, instanceId); - wrapper.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()); - wrapper.orderByDesc(FlowHisTask::getCreateTime).orderByDesc(FlowHisTask::getUpdateTime); + wrapper.eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) + .orderByDesc(FlowHisTask::getCreateTime, FlowHisTask::getUpdateTime); List flowHisTasks = flowHisTaskMapper.selectList(wrapper); if (CollUtil.isNotEmpty(flowHisTasks)) { list.addAll(BeanUtil.copyToList(flowHisTasks, FlowHisTaskVo.class)); } - return Map.of("list", list,"instanceId",instanceId); + return Map.of("list", list, "instanceId", instanceId); } /** From fb785dc17f3057d6e5f82e4f026d3b9d95819f5c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 19 Jun 2025 18:31:58 +0800 Subject: [PATCH 23/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=9A=84=E6=B5=81=E7=A8=8B=E5=9B=BE=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FlwChartExtServiceImpl.java | 51 ++++++++++++------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index 6f3d7c90e..3db8fb7ce 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -48,15 +48,38 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ @Override public void execute(DefJson defJson) { - //TODO 等待下一版本更新传递 流程实例id + // TODO: 后续版本将通过参数传入流程实例ID,这里先写死测试用 Long instanceId = 1935591874325151746L; - // 按 nodeCode 分组的历史任务列表 - Map> groupedByNode = this.getHisTaskGroupedByNode(instanceId); - // 遍历每个节点,处理扩展提示内容 + // 根据流程实例ID查询所有相关的历史任务列表 + List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); + if (CollUtil.isEmpty(flowHisTasks)) { + return; + } + + // 按节点编号(nodeCode)对历史任务进行分组 + Map> groupedByNode = flowHisTasks.stream() + .collect(Collectors.groupingBy(FlowHisTask::getNodeCode)); + + // 批量查询所有审批人的用户信息 + List userDTOList = userService.selectListByIds( + flowHisTasks.stream() + .map(task -> Long.valueOf(task.getApprover())) + .distinct() + .collect(Collectors.toList()) + ); + + // 将查询到的用户列表转换为以用户ID为key的映射 + Map userMap = userDTOList.stream() + .collect(Collectors.toMap(UserDTO::getUserId, user -> user)); + + // 遍历流程定义中的每个节点,调用处理方法,将对应节点的任务列表及用户信息传入,生成扩展提示内容 for (NodeJson nodeJson : defJson.getNodeList()) { + // 获取当前节点对应的历史任务列表,如果没有则返回空列表避免空指针 List taskList = groupedByNode.getOrDefault(nodeJson.getNodeCode(), Collections.emptyList()); - this.processNodeExtInfo(nodeJson, taskList); + + // 处理当前节点的扩展信息,包括构建审批人提示内容等 + this.processNodeExtInfo(nodeJson, taskList, userMap); } } @@ -98,18 +121,11 @@ public class FlwChartExtServiceImpl implements ChartExtService { * @param nodeJson 当前节点对象 * @param taskList 当前节点对应的历史审批任务列表 */ - private void processNodeExtInfo(NodeJson nodeJson, List taskList) { + private void processNodeExtInfo(NodeJson nodeJson, List taskList, Map userMap) { if (CollUtil.isEmpty(taskList)) { return; } - // 根据 taskList 中的 approver ID 查询用户,并构建 userId -> UserDTO 的映射表 - Map userMap = userService.selectListByIds( - taskList.stream() - .map(task -> Long.valueOf(task.getApprover())) - .collect(Collectors.toList()) - ).stream().collect(Collectors.toMap(UserDTO::getUserId, user -> user)); - // 获取节点提示内容对象中的 info 列表,用于追加提示项 List info = nodeJson.getPromptContent().getInfo(); @@ -194,18 +210,17 @@ public class FlwChartExtServiceImpl implements ChartExtService { } /** - * 根据流程实例ID获取按节点编号分组的历史任务列表 + * 根据流程实例ID获取历史任务列表 * * @param instanceId 流程实例ID - * @return Map<节点编码, 对应的历史任务列表> + * @return 历史任务列表 */ - public Map> getHisTaskGroupedByNode(Long instanceId) { + public List getHisTaskGroupedByNode(Long instanceId) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(FlowHisTask::getInstanceId, instanceId) .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) .orderByDesc(FlowHisTask::getCreateTime, FlowHisTask::getUpdateTime); - List flowHisTasks = flowHisTaskMapper.selectList(wrapper); - return flowHisTasks.stream().collect(Collectors.groupingBy(FlowHisTask::getNodeCode)); + return flowHisTaskMapper.selectList(wrapper); } } From f868de1b7bf5f5e10c970bb4773df597b4795759 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 19 Jun 2025 19:02:22 +0800 Subject: [PATCH 24/54] =?UTF-8?q?fix=20=E4=B8=B4=E6=97=B6=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=B5=81=E7=A8=8B=E5=9B=BE=E6=8F=90=E7=A4=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF,=E5=90=8E=E7=BB=AD=E7=89=88=E6=9C=AC=E5=B0=86?= =?UTF-8?q?=E9=80=9A=E8=BF=87defjson=E8=8E=B7=E5=8F=96=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9E=E4=BE=8BID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/FlwChartExtServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index 3db8fb7ce..0d73c12ff 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -10,6 +10,7 @@ import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.DefJson; import org.dromara.warm.flow.core.dto.NodeJson; @@ -48,8 +49,9 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ @Override public void execute(DefJson defJson) { - // TODO: 后续版本将通过参数传入流程实例ID,这里先写死测试用 - Long instanceId = 1935591874325151746L; + // 临时修复 后续版本将通过defjson获取流程实例ID + String[] parts = ServletUtils.getRequest().getRequestURI().split("/"); + Long instanceId = Long.valueOf(parts[parts.length - 1]); // 根据流程实例ID查询所有相关的历史任务列表 List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); From 3fa572f0a884fa873ac52ecf8968d025bfbf13d2 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, 20 Jun 2025 09:27:34 +0800 Subject: [PATCH 25/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E8=87=AA=E5=8A=A8=E6=B3=A8=E5=85=A5=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AD=A6=E5=91=8A=E6=94=B9=E4=B8=BA=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=20=E9=81=BF=E5=85=8D=E4=B8=80=E5=A4=A7=E5=A0=86=E4=BA=BA?= =?UTF-8?q?=E5=8E=BB=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=90=9E=E4=BB=80?= =?UTF-8?q?=E4=B9=88=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/handler/InjectionMetaObjectHandler.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index fec25792a..38f724768 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -22,6 +22,11 @@ import java.util.Date; @Slf4j public class InjectionMetaObjectHandler implements MetaObjectHandler { + /** + * 如果用户不存在默认注入-1代表无用户 + */ + private static final Long DEFAULT_USER_ID = -1L; + /** * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息 * @@ -45,6 +50,11 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { baseEntity.setCreateBy(userId); baseEntity.setUpdateBy(userId); baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); + } else { + // 填充创建人、更新人和创建部门信息 + baseEntity.setCreateBy(DEFAULT_USER_ID); + baseEntity.setUpdateBy(DEFAULT_USER_ID); + baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), DEFAULT_USER_ID)); } } } else { @@ -74,6 +84,8 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { Long userId = LoginHelper.getUserId(); if (ObjectUtil.isNotNull(userId)) { baseEntity.setUpdateBy(userId); + } else { + baseEntity.setUpdateBy(DEFAULT_USER_ID); } } else { this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); @@ -93,7 +105,6 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { try { loginUser = LoginHelper.getLoginUser(); } catch (Exception e) { - log.warn("自动注入警告 => 用户未登录"); return null; } return loginUser; From ffa01bdb3a43673da195a86c87563f6ea31c4079 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 20 Jun 2025 10:24:46 +0800 Subject: [PATCH 26/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=BD=AC=E6=8D=A2=E9=80=BB=E8=BE=91=E3=80=81=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/UserService.java | 8 -- .../service/impl/SysUserServiceImpl.java | 17 --- .../common/constant/FlowConstant.java | 5 + .../service/IFlwDefinitionService.java | 1 - .../impl/CategoryNameTranslationImpl.java | 8 +- .../service/impl/FlwChartExtServiceImpl.java | 109 ++++++++++-------- .../impl/FlwTaskAssigneeServiceImpl.java | 5 +- .../service/impl/FlwTaskServiceImpl.java | 4 +- .../service/impl/TestLeaveServiceImpl.java | 4 +- 9 files changed, 77 insertions(+), 84 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java index 271c46bcb..4903c3860 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/UserService.java @@ -52,14 +52,6 @@ public interface UserService { */ String selectEmailById(Long userId); - /** - * 通过用户ID查询用户详细信息 - * - * @param userId 用户id - * @return 用户详细信息 - */ - UserDTO selectUserDtoById(Long userId); - /** * 通过用户ID查询用户列表 * 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 6b41b8e4f..2cfe7b30a 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 @@ -623,23 +623,6 @@ public class SysUserServiceImpl implements ISysUserService, UserService { return ObjectUtils.notNullGetter(sysUser, SysUser::getEmail); } - /** - * 通过用户ID查询用户详细信息 - * - * @param userId 用户id - * @return 用户详细信息 - */ - @Override - public UserDTO selectUserDtoById(Long userId) { - SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getDeptId, SysUser::getUserName, - SysUser::getNickName, SysUser::getUserType, SysUser::getEmail, - SysUser::getPhonenumber, SysUser::getSex, SysUser::getStatus, - SysUser::getCreateTime) - .eq(SysUser::getUserId, userId)); - return BeanUtil.toBean(sysUser, UserDTO.class); - } - /** * 通过用户ID查询用户列表 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index f3290b841..aaa640bfb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -73,4 +73,9 @@ public interface FlowConstant { */ String MESSAGE_NOTICE = "messageNotice"; + /** + * 任务状态 + */ + String WF_TASK_STATUS = "wf_task_status"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java index 1a2d29f77..54743b72b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwDefinitionService.java @@ -35,7 +35,6 @@ public interface IFlwDefinitionService { */ TableDataInfo unPublishList(FlowDefinition flowDefinition, PageQuery pageQuery); - /** * 发布流程定义 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java index 8c73b59ee..883a967aa 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/CategoryNameTranslationImpl.java @@ -26,12 +26,6 @@ public class CategoryNameTranslationImpl implements TranslationInterface @Override public String translation(Object key, String other) { - Long id = null; - if (key instanceof String categoryId) { - id = Convert.toLong(categoryId); - } else if (key instanceof Long categoryId) { - id = categoryId; - } - return flwCategoryService.selectCategoryNameById(id); + return flwCategoryService.selectCategoryNameById(Convert.toLong(key)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index 0d73c12ff..d7c6f77eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -8,24 +9,26 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.service.DeptService; +import org.dromara.common.core.service.DictService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.DefJson; import org.dromara.warm.flow.core.dto.NodeJson; import org.dromara.warm.flow.core.dto.PromptContent; import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.utils.MapUtil; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.ui.service.ChartExtService; import org.dromara.workflow.common.ConditionalOnEnable; +import org.dromara.workflow.common.constant.FlowConstant; import org.springframework.stereotype.Service; -import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * 流程图提示信息 @@ -41,6 +44,7 @@ public class FlwChartExtServiceImpl implements ChartExtService { private final UserService userService; private final DeptService deptService; private final FlowHisTaskMapper flowHisTaskMapper; + private final DictService dictService; /** * 设置流程图提示信息 @@ -51,7 +55,7 @@ public class FlwChartExtServiceImpl implements ChartExtService { public void execute(DefJson defJson) { // 临时修复 后续版本将通过defjson获取流程实例ID String[] parts = ServletUtils.getRequest().getRequestURI().split("/"); - Long instanceId = Long.valueOf(parts[parts.length - 1]); + Long instanceId = Convert.toLong(parts[parts.length - 1]); // 根据流程实例ID查询所有相关的历史任务列表 List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); @@ -60,28 +64,25 @@ public class FlwChartExtServiceImpl implements ChartExtService { } // 按节点编号(nodeCode)对历史任务进行分组 - Map> groupedByNode = flowHisTasks.stream() - .collect(Collectors.groupingBy(FlowHisTask::getNodeCode)); + Map> groupedByNode = StreamUtils.groupByKey(flowHisTasks, FlowHisTask::getNodeCode); // 批量查询所有审批人的用户信息 - List userDTOList = userService.selectListByIds( - flowHisTasks.stream() - .map(task -> Long.valueOf(task.getApprover())) - .distinct() - .collect(Collectors.toList()) - ); + List userDTOList = userService.selectListByIds(StreamUtils.toList(flowHisTasks, e -> Convert.toLong(e.getApprover()))); // 将查询到的用户列表转换为以用户ID为key的映射 - Map userMap = userDTOList.stream() - .collect(Collectors.toMap(UserDTO::getUserId, user -> user)); + Map userMap = StreamUtils.toIdentityMap(userDTOList, UserDTO::getUserId); + + Map dictType = dictService.getAllDictByDictType(FlowConstant.WF_TASK_STATUS); // 遍历流程定义中的每个节点,调用处理方法,将对应节点的任务列表及用户信息传入,生成扩展提示内容 for (NodeJson nodeJson : defJson.getNodeList()) { // 获取当前节点对应的历史任务列表,如果没有则返回空列表避免空指针 - List taskList = groupedByNode.getOrDefault(nodeJson.getNodeCode(), Collections.emptyList()); - + List taskList = groupedByNode.get(nodeJson.getNodeCode()); + if (CollUtil.isEmpty(taskList)) { + continue; + } // 处理当前节点的扩展信息,包括构建审批人提示内容等 - this.processNodeExtInfo(nodeJson, taskList, userMap); + this.processNodeExtInfo(nodeJson, taskList, userMap, dictType); } } @@ -92,29 +93,49 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ @Override public void initPromptContent(DefJson defJson) { - ChartExtService.super.initPromptContent(defJson); - // 为每个节点设置统一的提示框样式 - defJson.getNodeList().forEach(nodeJson -> - nodeJson.getPromptContent() - .setDialogStyle( - Map.ofEntries( - Map.entry("position", "absolute"), - Map.entry("backgroundColor", "#fff"), - Map.entry("border", "1px solid #ccc"), - Map.entry("borderRadius", "4px"), - Map.entry("boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)"), - Map.entry("padding", "8px 12px"), - Map.entry("fontSize", "14px"), - Map.entry("zIndex", 1000), - Map.entry("maxWidth", "500px"), - Map.entry("overflowY", "visible"), - Map.entry("overflowX", "hidden"), - Map.entry("color", "#333"), - Map.entry("pointerEvents", "auto"), - Map.entry("scrollbarWidth", "thin") + defJson.setTopText("流程名称: " + defJson.getFlowName()); + defJson.getNodeList().forEach(nodeJson -> { + nodeJson.setPromptContent( + new PromptContent() + // 提示信息 + .setInfo( + CollUtil.newArrayList( + new PromptContent.InfoItem() + .setPrefix("任务名称: ") + .setContent(nodeJson.getNodeName()) + .setContentStyle(Map.of( + "border", "1px solid #d1e9ff", + "backgroundColor", "#e8f4ff", + "padding", "4px 8px", + "borderRadius", "4px" + )) + .setRowStyle(Map.of( + "fontWeight", "bold", + "margin", "0 0 6px 0", + "padding", "0 0 8px 0", + "borderBottom", "1px solid #ccc" + )) + ) ) - ) - ); + // 弹窗样式 + .setDialogStyle(MapUtil.mergeAll( + "position", "absolute", + "backgroundColor", "#fff", + "border", "1px solid #ccc", + "borderRadius", "4px", + "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", + "padding", "8px 12px", + "fontSize", "14px", + "zIndex", "1000", + "maxWidth", "500px", + "overflowY", "visible", + "overflowX", "hidden", + "color", "#333", + "pointerEvents", "auto", + "scrollbarWidth", "thin" + )) + ); + }); } /** @@ -123,23 +144,20 @@ public class FlwChartExtServiceImpl implements ChartExtService { * @param nodeJson 当前节点对象 * @param taskList 当前节点对应的历史审批任务列表 */ - private void processNodeExtInfo(NodeJson nodeJson, List taskList, Map userMap) { - if (CollUtil.isEmpty(taskList)) { - return; - } + private void processNodeExtInfo(NodeJson nodeJson, List taskList, Map userMap, Map dictType) { // 获取节点提示内容对象中的 info 列表,用于追加提示项 List info = nodeJson.getPromptContent().getInfo(); // 遍历所有任务记录,构建提示内容 for (FlowHisTask task : taskList) { - UserDTO userDTO = userMap.get(Long.valueOf(task.getApprover())); + UserDTO userDTO = userMap.get(Convert.toLong(task.getApprover())); if (ObjectUtil.isEmpty(userDTO)) { - return; + continue; } // 查询用户所属部门名称 - String deptName = deptService.selectDeptNameByIds(String.valueOf(userDTO.getDeptId())); + String deptName = deptService.selectDeptNameByIds(Convert.toStr(userDTO.getDeptId())); // 添加标题项,如:👤 张三(市场部) info.add(new PromptContent.InfoItem() @@ -157,6 +175,7 @@ public class FlwChartExtServiceImpl implements ChartExtService { // 添加具体信息项:账号、耗时、时间 info.add(buildInfoItem("用户账号", userDTO.getUserName())); + info.add(buildInfoItem("审批状态", dictType.get(task.getFlowStatus()))); info.add(buildInfoItem("审批耗时", DateUtils.getTimeDifference(task.getUpdateTime(), task.getCreateTime()))); info.add(buildInfoItem("办理时间", DateUtils.formatDateTime(task.getUpdateTime()))); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 638c9a280..ceefa8032 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; @@ -239,10 +240,10 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand try { String[] parts = storageId.split(StrUtil.COLON, 2); if (parts.length < 2) { - return Pair.of(TaskAssigneeEnum.USER, Long.valueOf(parts[0])); + return Pair.of(TaskAssigneeEnum.USER, Convert.toLong(parts[0])); } else { TaskAssigneeEnum type = TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON); - return Pair.of(type, Long.valueOf(parts[1])); + return Pair.of(type, Convert.toLong(parts[1])); } } catch (Exception e) { log.warn("解析 storageId 失败,格式非法:{},错误信息:{}", storageId, e.getMessage()); 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 71ce177aa..f96a75732 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 @@ -717,7 +717,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { for (Map.Entry> entry : listMap.entrySet()) { List value = entry.getValue(); if (CollUtil.isNotEmpty(value)) { - List userDtoList = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); + List userDtoList = userService.selectListByIds(StreamUtils.toList(value, e -> Convert.toLong(e.getProcessedBy()))); map.put(entry.getKey(), userDtoList); } } @@ -736,7 +736,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } - return userService.selectListByIds(StreamUtils.toList(userList, e -> Long.valueOf(e.getProcessedBy()))); + return userService.selectListByIds(StreamUtils.toList(userList, e -> Convert.toLong(e.getProcessedBy()))); } /** 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 3a773345d..17d1c7ca3 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 @@ -145,7 +145,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @EventListener(condition = "#processEvent.flowCode.startsWith('leave')") public void processHandler(ProcessEvent processEvent) { log.info("当前任务执行了{}", processEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessId())); + TestLeave testLeave = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId())); testLeave.setStatus(processEvent.getStatus()); // 用于例如审批附件 审批意见等 存储到业务表内 自行根据业务实现存储流程 Map params = processEvent.getParams(); @@ -188,7 +188,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService { @EventListener(condition = "#processDeleteEvent.flowCode.startsWith('leave')") public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) { log.info("监听删除流程事件,当前任务执行了{}", processDeleteEvent.toString()); - TestLeave testLeave = baseMapper.selectById(Long.valueOf(processDeleteEvent.getBusinessId())); + TestLeave testLeave = baseMapper.selectById(Convert.toLong(processDeleteEvent.getBusinessId())); if (ObjectUtil.isNull(testLeave)) { return; } From c1570128077b44c9d19e941754b1ed7dc064485b 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, 20 Jun 2025 10:21:18 +0800 Subject: [PATCH 27/54] update spring-boot 3.4.6 => 3.4.7 update satoken 1.42.0 => 1.44.0 update hutool 5.8.35 => 5.8.38 update redisson 3.45.1 => 3.50.0 update aws-s3 2.28.22 => 2.31.67 update anyline 8.7.2-20250101 => 8.7.2-20250603 update maven-jar-plugin 3.2.2 => 3.4.2 update maven-war-plugin 3.2.2 => 3.4.0 update maven-compiler-plugin 3.11.0 => 3.14.0 update maven-surefire-plugin 3.1.2 => 3.5.3 --- pom.xml | 20 +++++++++---------- .../web/listener/UserActionListener.java | 2 +- .../service/GenTableServiceImpl.java | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 2d5746c3a..573311ab4 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ 5.4.0 - 3.4.6 + 3.4.7 UTF-8 UTF-8 17 @@ -23,12 +23,12 @@ 0.15.0 1.2.0 2.3 - 1.42.0 + 1.44.0 3.5.12 3.9.1 - 5.8.35 + 5.8.38 3.4.7 - 3.45.1 + 3.50.0 2.2.7 4.3.1 1.5.0 @@ -41,21 +41,21 @@ 2.7.0 - 2.28.22 + 2.31.67 3.3.4 1.2.83 - 8.7.2-20250101 + 8.7.2-20250603 1.7.4 - 3.2.2 - 3.2.2 - 3.11.0 - 3.1.2 + 3.4.2 + 3.4.0 + 3.14.0 + 3.5.3 1.3.0 true diff --git a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java index 554c64b32..6c8accb69 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/listener/UserActionListener.java @@ -158,6 +158,6 @@ public class UserActionListener implements SaTokenListener { * 每次Token续期时触发 */ @Override - public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + public void doRenewTimeout(String loginType, Object loginId, String tokenValue, long timeout) { } } diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index b397f37f4..2ff161ffa 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -302,8 +302,8 @@ public class GenTableServiceImpl implements IGenTableService { tableColumn.setColumnComment(column.getComment()); tableColumn.setColumnType(column.getOriginType().toLowerCase()); tableColumn.setSort(column.getPosition()); - tableColumn.setIsRequired(column.isNullable() == 0 ? "1" : "0"); - tableColumn.setIsIncrement(column.isAutoIncrement() == -1 ? "0" : "1"); + tableColumn.setIsRequired(column.isNullable() ? "1" : "0"); + tableColumn.setIsIncrement(column.isAutoIncrement() ? "0" : "1"); tableColumns.add(tableColumn); }); return tableColumns; From cb8fa6ff9aebd7863b2b2afdfb664e1eca94e39d 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, 20 Jun 2025 10:21:55 +0800 Subject: [PATCH 28/54] =?UTF-8?q?update=20QueueUtils=20=E4=B8=8E=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81=E6=A0=87=E8=AE=B0=E8=BF=87=E6=9C=9F?= =?UTF-8?q?(redisson=20=E6=96=B0=E7=89=88=E6=9C=AC=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E5=B0=86=E9=98=9F=E5=88=97=E5=8A=9F=E8=83=BD=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E5=88=A0=E9=99=A4=20=E4=B8=80=E4=BA=9B=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=97=A0=E6=B3=95=E8=A7=A3=E5=86=B3=20?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E6=90=AD=E5=BB=BAMQ=E4=BD=BF=E7=94=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/redis/utils/QueueUtils.java | 2 ++ .../demo/controller/queue/BoundedQueueController.java | 8 ++++---- .../demo/controller/queue/DelayedQueueController.java | 4 ++-- .../org/dromara/demo/controller/queue/PriorityDemo.java | 2 ++ .../demo/controller/queue/PriorityQueueController.java | 2 ++ 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java index 7c09e3138..5b1c7f778 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/QueueUtils.java @@ -16,7 +16,9 @@ import java.util.function.Function; * * @author Lion Li * @version 3.6.0 新增 + * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ +@Deprecated @NoArgsConstructor(access = AccessLevel.PRIVATE) public class QueueUtils { diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java index 30ec27f7f..a3051b24b 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/BoundedQueueController.java @@ -1,11 +1,9 @@ package org.dromara.demo.controller.queue; -import cn.dev33.satoken.annotation.SaIgnore; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.utils.QueueUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.redisson.api.RBoundedBlockingQueue; +import org.dromara.common.core.domain.R; +import org.dromara.common.redis.utils.QueueUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,7 +18,9 @@ import org.springframework.web.bind.annotation.RestController; * * @author Lion Li * @version 3.6.0 + * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ +@Deprecated @Slf4j @RequiredArgsConstructor @RestController diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java index b6e51d3ee..7c494e27f 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/DelayedQueueController.java @@ -1,6 +1,5 @@ package org.dromara.demo.controller.queue; -import cn.dev33.satoken.annotation.SaIgnore; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; @@ -23,8 +22,9 @@ import java.util.concurrent.TimeUnit; * * @author Lion Li * @version 3.6.0 + * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ -@SaIgnore +@Deprecated @Slf4j @RequiredArgsConstructor @RestController diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java index e2449b518..43862a6df 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityDemo.java @@ -8,7 +8,9 @@ import lombok.NoArgsConstructor; * * @author Lion Li * @version 3.6.0 + * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ +@Deprecated @Data @NoArgsConstructor public class PriorityDemo implements Comparable { diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java index 02c739650..2f2b7378d 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/queue/PriorityQueueController.java @@ -19,7 +19,9 @@ import org.springframework.web.bind.annotation.RestController; * * @author Lion Li * @version 3.6.0 + * @deprecated redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用 */ +@Deprecated @Slf4j @RequiredArgsConstructor @RestController From 74d257a6106d1261aa8203443b27ddb26628028b 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, 20 Jun 2025 11:01:17 +0800 Subject: [PATCH 29/54] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81sql(=E5=B0=8F=E6=94=B9=E5=8A=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/oracle/oracle_ry_workflow.sql | 10 +++++----- script/sql/postgres/postgres_ry_workflow.sql | 13 ++++++------- script/sql/ry_workflow.sql | 2 +- script/sql/sqlserver/sqlserver_ry_workflow.sql | 9 +++++---- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql index 4c6f80e74..4367b24d4 100644 --- a/script/sql/oracle/oracle_ry_workflow.sql +++ b/script/sql/oracle/oracle_ry_workflow.sql @@ -61,7 +61,7 @@ create table FLOW_NODE VERSION VARCHAR2(20), CREATE_TIME DATE, UPDATE_TIME DATE, - EXT VARCHAR2(500), + EXT CLOB, DEL_FLAG VARCHAR2(1) default '0', TENANT_ID VARCHAR2(40), PERMISSION_FLAG VARCHAR2(200) @@ -88,10 +88,10 @@ 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.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 '权限标识(权限类型:权限标识,可以多个,用逗号隔开)'; +comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用@@隔开)'; create table FLOW_SKIP ( @@ -179,7 +179,7 @@ create table FLOW_TASK NODE_CODE VARCHAR2(100), NODE_NAME VARCHAR2(100), NODE_TYPE NUMBER(1), - FLOW_STATUS VARCHAR2(20), + FLOW_STATUS VARCHAR2(20), FORM_CUSTOM VARCHAR2(1) default 'N', FORM_PATH VARCHAR2(100), CREATE_TIME DATE, @@ -226,7 +226,7 @@ create table FLOW_HIS_TASK FORM_PATH VARCHAR2(100), MESSAGE VARCHAR2(500), VARIABLE CLOB, - EXT VARCHAR2(500), + EXT CLOB, CREATE_TIME DATE, UPDATE_TIME DATE, DEL_FLAG VARCHAR2(1) default '0', diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql index 8db29c704..6662b794a 100644 --- a/script/sql/postgres/postgres_ry_workflow.sql +++ b/script/sql/postgres/postgres_ry_workflow.sql @@ -47,7 +47,7 @@ CREATE TABLE flow_node definition_id int8 NOT NULL, -- 流程定义id node_code varchar(100) NOT NULL, -- 流程节点编码 node_name varchar(100) NULL, -- 流程节点名称 - permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用逗号隔开) + permission_flag varchar(200) NULL, -- 权限标识(权限类型:权限标识,可以多个,用@@隔开) node_ratio numeric(6, 3) NULL, -- 流程签署比例值 coordinate varchar(100) NULL, -- 坐标 any_node_skip varchar(100) NULL, -- 任意结点跳转 @@ -60,7 +60,7 @@ CREATE TABLE flow_node "version" varchar(20) NOT NULL, -- 版本 create_time timestamp NULL, -- 创建时间 update_time timestamp NULL, -- 更新时间 - ext varchar(500) NULL, -- 扩展属性 + ext text NULL, -- 扩展属性 del_flag bpchar(1) NULL DEFAULT '0':: character varying, -- 删除标志 tenant_id varchar(40) NULL, -- 租户id CONSTRAINT flow_node_pkey PRIMARY KEY (id) @@ -72,7 +72,7 @@ COMMENT ON COLUMN flow_node.node_type IS '节点类型(0开始节点 1中间 COMMENT ON COLUMN flow_node.definition_id IS '流程定义id'; COMMENT ON COLUMN flow_node.node_code IS '流程节点编码'; COMMENT ON COLUMN flow_node.node_name IS '流程节点名称'; -COMMENT ON COLUMN flow_node.permission_flag 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.any_node_skip IS '任意结点跳转'; @@ -85,7 +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.ext IS '节点扩展属性'; COMMENT ON COLUMN flow_node.del_flag IS '删除标志'; COMMENT ON COLUMN flow_node.tenant_id IS '租户id'; @@ -172,7 +172,7 @@ CREATE TABLE flow_task node_code varchar(100) NOT NULL, -- 节点编码 node_name varchar(100) NULL, -- 节点名称 node_type int2 NOT NULL, -- 节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关) - flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) + flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 create_time timestamp NULL, -- 创建时间 @@ -215,7 +215,7 @@ CREATE TABLE flow_his_task flow_status varchar(20) NOT NULL, -- 流程状态(0待提交 1审批中 2 审批通过 8已完成 9已退回 10失效) form_custom bpchar(1) NULL DEFAULT 'N':: character varying, -- 审批表单是否自定义(Y是 N否) form_path varchar(100) NULL, -- 审批表单路径 - ext varchar(500) NULL, -- 扩展字段,预留给业务系统使用 + ext text NULL, -- 扩展字段,预留给业务系统使用 message varchar(500) NULL, -- 审批意见 variable text NULL, -- 任务变量 create_time timestamp NULL, -- 创建时间 @@ -265,7 +265,6 @@ CREATE TABLE flow_user ); CREATE INDEX user_processed_type ON flow_user USING btree (processed_by, type); CREATE INDEX user_associated_idx ON FLOW_USER USING btree (associated); - COMMENT ON TABLE flow_user IS '流程用户表'; COMMENT ON COLUMN flow_user.id IS '主键id'; diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 20b96dfa6..bb3d76e68 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -96,7 +96,7 @@ CREATE TABLE `flow_task` `node_code` varchar(100) NOT NULL COMMENT '节点编码', `node_name` varchar(100) DEFAULT NULL COMMENT '节点名称', `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', - `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', `create_time` datetime DEFAULT NULL COMMENT '创建时间', diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql index 88d92fcb4..6d6370165 100644 --- a/script/sql/sqlserver/sqlserver_ry_workflow.sql +++ b/script/sql/sqlserver/sqlserver_ry_workflow.sql @@ -162,7 +162,7 @@ CREATE TABLE flow_node ( version nvarchar(20) NOT NULL, create_time datetime2(7) NULL, update_time datetime2(7) NULL, - ext nvarchar(500) NULL, + ext nvarchar(max) NULL, del_flag nchar(1) DEFAULT('0') NULL, tenant_id nvarchar(40) NULL, CONSTRAINT PK__flow_nod__3213E83F372470DE PRIMARY KEY CLUSTERED (id) @@ -208,7 +208,7 @@ EXEC sp_addextendedproperty GO EXEC sp_addextendedproperty -'MS_Description', N'权限标识(权限类型:权限标识,可以多个,用逗号隔开)', +'MS_Description', N'权限标识(权限类型:权限标识,可以多个,用@@隔开)', 'SCHEMA', N'dbo', 'TABLE', N'flow_node', 'COLUMN', N'permission_flag' @@ -299,12 +299,13 @@ EXEC sp_addextendedproperty GO EXEC sp_addextendedproperty -'MS_Description', N'扩展属性', +'MS_Description', N'节点扩展属性', 'SCHEMA', N'dbo', 'TABLE', N'flow_node', 'COLUMN', N'ext' GO + EXEC sp_addextendedproperty 'MS_Description', N'删除标志', 'SCHEMA', N'dbo', @@ -731,7 +732,7 @@ CREATE TABLE flow_his_task ( form_path nvarchar(100) NULL, message nvarchar(500) NULL, variable nvarchar(max) NULL, - ext nvarchar(500) NULL, + ext nvarchar(max) NULL, create_time datetime2(7) NULL, update_time datetime2(7) NULL, del_flag nchar(1) DEFAULT('0') NULL, From 84baac0a4f871fe6ba34842fcaedde36c8018d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Sun, 22 Jun 2025 16:39:05 +0800 Subject: [PATCH 30/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20sse=20?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E6=97=B6=E9=97=B4=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?=E4=B8=80=E5=A4=A9=20=E9=81=BF=E5=85=8D=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E7=9B=B4=E6=8E=A5=E5=85=B3=E9=97=AD=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E5=AF=BC=E8=87=B4=E8=BF=9E=E6=8E=A5=E5=81=9C?= =?UTF-8?q?=E6=BB=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index cb9442850..21a4e7772 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -38,8 +38,8 @@ public class SseEmitterManager { // 每个用户可以有多个 SSE 连接,通过 token 进行区分 Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); - // 创建一个新的 SseEmitter 实例,超时时间设置为 0 表示无限制 - SseEmitter emitter = new SseEmitter(0L); + // 创建一个新的 SseEmitter 实例,超时时间设置为一天 避免连接之后直接关闭浏览器导致连接停滞 + SseEmitter emitter = new SseEmitter(86400L); emitters.put(token, emitter); From 0796791ec95e934938e1e6173f2cd13b0ede0c12 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, 23 Jun 2025 14:41:44 +0800 Subject: [PATCH 31/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7anyline=E8=BF=94=E5=9B=9E=E5=80=BC=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=AF=BC=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/service/GenTableServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 2ff161ffa..31278a666 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -297,7 +297,7 @@ public class GenTableServiceImpl implements IGenTableService { List tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { GenTableColumn tableColumn = new GenTableColumn(); - tableColumn.setIsPk(String.valueOf(column.isPrimaryKey())); + tableColumn.setIsPk(column.isPrimaryKey() ? "1" : "0"); tableColumn.setColumnName(column.getName()); tableColumn.setColumnComment(column.getComment()); tableColumn.setColumnType(column.getOriginType().toLowerCase()); From 4577c451109100aef0841fe403e5bddf6d7eed3d 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, 23 Jun 2025 14:55:51 +0800 Subject: [PATCH 32/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7anyline=E8=BF=94=E5=9B=9E=E5=80=BC=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=AF=BC=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/generator/service/GenTableServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 31278a666..3572e6f64 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -303,7 +303,7 @@ public class GenTableServiceImpl implements IGenTableService { tableColumn.setColumnType(column.getOriginType().toLowerCase()); tableColumn.setSort(column.getPosition()); tableColumn.setIsRequired(column.isNullable() ? "1" : "0"); - tableColumn.setIsIncrement(column.isAutoIncrement() ? "0" : "1"); + tableColumn.setIsIncrement(column.isAutoIncrement() ? "1" : "0"); tableColumns.add(tableColumn); }); return tableColumns; From 534182deffa18669549268541b141d196dc0b267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BA=A2=E8=97=95=E9=A6=99=E6=AE=8B=E7=8E=89=E7=B0=9F?= =?UTF-8?q?=E7=A7=8B?= <17862962452@163.com> Date: Mon, 23 Jun 2025 08:57:30 +0000 Subject: [PATCH 33/54] =?UTF-8?q?!698=20fix=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?=E5=8A=9E=E7=90=86=E4=BB=BB=E5=8A=A1=E6=97=B6=E6=9C=AA=E4=BC=A0?= =?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=97=A0=E6=B3=95=E8=8E=B7=E5=8F=96=E5=88=B0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8F=82=E6=95=B0=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20*=20fix=20=E4=BF=AE=E5=A4=8D=20=E5=8A=9E=E7=90=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=97=B6=E6=9C=AA=E4=BC=A0=E5=8F=82=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=89=A7=E8=A1=8C=E4=BB=BB=E5=8A=A1=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=8F=96=E5=88=B0=E4=BB=BB=E5=8A=A1=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/workflow/domain/bo/CompleteTaskBo.java | 3 ++- 1 file changed, 2 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 e5befff75..360fc3b81 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 @@ -70,7 +70,8 @@ public class CompleteTaskBo implements Serializable { public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); + return variables; } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; From 9dce540a092faa15915b22c89f6934e1ddaa61d5 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, 23 Jun 2025 18:17:41 +0800 Subject: [PATCH 34/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20sqlserver=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=95=BF=E5=BA=A6=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index c63313f00..195a46c4a 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -379,7 +379,7 @@ CREATE TABLE sys_tenant_package ( package_id bigint NOT NULL, package_name nvarchar(20) NOT NULL, - menu_ids nvarchar(20) NULL, + menu_ids nvarchar(3000) NULL, remark nvarchar(200) NULL, menu_check_strictly tinyint DEFAULT ((1)) NULL, status nchar(1) DEFAULT ('0') NULL, From 03054fc1e8748abc17e86a0f8651582f5b4a5c1e 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, 24 Jun 2025 11:24:28 +0800 Subject: [PATCH 35/54] =?UTF-8?q?reset=20=E5=9B=9E=E6=BB=9Aaws-s3=E7=89=88?= =?UTF-8?q?=E6=9C=AC=20=E6=9C=89=E6=9C=AA=E7=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 573311ab4..5d5fe84ca 100644 --- a/pom.xml +++ b/pom.xml @@ -39,9 +39,8 @@ 1.16.7 2.7.0 - - 2.31.67 + 2.28.22 3.3.4 From 4b47053dcfd7792cdf51c59a19ac5e0ee6ef8f16 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, 24 Jun 2025 11:42:22 +0800 Subject: [PATCH 36/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E9=97=B4=E5=8D=95=E4=BD=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20=E5=BA=94=E8=AF=A5=E6=98=AF=E6=AF=AB?= =?UTF-8?q?=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/sse/core/SseEmitterManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 21a4e7772..bc19460f8 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -39,7 +39,7 @@ public class SseEmitterManager { Map emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); // 创建一个新的 SseEmitter 实例,超时时间设置为一天 避免连接之后直接关闭浏览器导致连接停滞 - SseEmitter emitter = new SseEmitter(86400L); + SseEmitter emitter = new SseEmitter(86400000L); emitters.put(token, emitter); From a8a1db4463667dadcb3a302bfcc52d20e35b9f98 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 24 Jun 2025 14:37:02 +0800 Subject: [PATCH 37/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96SSE=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/sse/core/SseEmitterManager.java | 65 +++++++++---------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index bc19460f8..936851b3b 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,6 +1,7 @@ package org.dromara.common.sse.core; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.sse.dto.SseMessageDto; @@ -24,6 +25,9 @@ public class SseEmitterManager { */ private final static String SSE_TOPIC = "global:sse"; + /** + * 本地内存缓存,存活用户连接 + */ private final static Map> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>(); /** @@ -43,32 +47,18 @@ public class SseEmitterManager { emitters.put(token, emitter); - // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token - emitter.onCompletion(() -> { - SseEmitter remove = emitters.remove(token); - if (remove != null) { - remove.complete(); - } - }); - emitter.onTimeout(() -> { - SseEmitter remove = emitters.remove(token); - if (remove != null) { - remove.complete(); - } - }); - emitter.onError((e) -> { - SseEmitter remove = emitters.remove(token); - if (remove != null) { - remove.complete(); - } - }); + // 注册连接结束、超时、错误等统一清理逻辑 + Runnable callback = () -> disconnect(userId, token); + emitter.onCompletion(callback); + emitter.onTimeout(callback); + emitter.onError(e -> callback.run()); try { - // 向客户端发送一条连接成功的事件 emitter.send(SseEmitter.event().comment("connected")); + log.warn("SSE连接成功 userId={}, token={}", userId, token); } catch (IOException e) { - // 如果发送消息失败,则从映射表中移除 emitter - emitters.remove(token); + log.warn("SSE连接初始化失败 userId={}, token={}, 错误: {}", userId, token, e.getMessage()); + disconnect(userId, token); } return emitter; } @@ -85,13 +75,20 @@ public class SseEmitterManager { } Map emitters = USER_TOKEN_EMITTERS.get(userId); if (MapUtil.isNotEmpty(emitters)) { - try { - SseEmitter sseEmitter = emitters.get(token); - sseEmitter.send(SseEmitter.event().comment("disconnected")); - sseEmitter.complete(); - } catch (Exception ignore) { + SseEmitter sseEmitter = emitters.remove(token); + if (ObjectUtil.isNotNull(sseEmitter)) { + try { + sseEmitter.send(SseEmitter.event().comment("disconnected")); + } catch (IOException e) { + log.warn("SSE断开通知失败 userId={}, token={}", userId, token); + } finally { + sseEmitter.complete(); + log.warn("SSE连接断开 userId={}, token={}", userId, token); + } + } + if (emitters.isEmpty()) { + USER_TOKEN_EMITTERS.remove(userId); } - emitters.remove(token); } else { USER_TOKEN_EMITTERS.remove(userId); } @@ -115,16 +112,12 @@ public class SseEmitterManager { public void sendMessage(Long userId, String message) { Map emitters = USER_TOKEN_EMITTERS.get(userId); if (MapUtil.isNotEmpty(emitters)) { - for (Map.Entry entry : emitters.entrySet()) { + for (String token : emitters.keySet()) { try { - entry.getValue().send(SseEmitter.event() - .name("message") - .data(message)); + emitters.get(token).send(SseEmitter.event().name("message").data(message)); } catch (Exception e) { - SseEmitter remove = emitters.remove(entry.getKey()); - if (remove != null) { - remove.complete(); - } + log.warn("SSE消息发送失败 userId={}, token={}, error={}", userId, token, e.getMessage()); + disconnect(userId, token); } } } else { From 1598447f6b793da1f38dce599152e00ece301497 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, 24 Jun 2025 06:51:28 +0000 Subject: [PATCH 38/54] =?UTF-8?q?Revert=20"update=20=E4=BC=98=E5=8C=96SSE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a8a1db4463667dadcb3a302bfcc52d20e35b9f98. --- .../common/sse/core/SseEmitterManager.java | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java index 936851b3b..bc19460f8 100644 --- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java +++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java @@ -1,7 +1,6 @@ package org.dromara.common.sse.core; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.sse.dto.SseMessageDto; @@ -25,9 +24,6 @@ public class SseEmitterManager { */ private final static String SSE_TOPIC = "global:sse"; - /** - * 本地内存缓存,存活用户连接 - */ private final static Map> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>(); /** @@ -47,18 +43,32 @@ public class SseEmitterManager { emitters.put(token, emitter); - // 注册连接结束、超时、错误等统一清理逻辑 - Runnable callback = () -> disconnect(userId, token); - emitter.onCompletion(callback); - emitter.onTimeout(callback); - emitter.onError(e -> callback.run()); + // 当 emitter 完成、超时或发生错误时,从映射表中移除对应的 token + emitter.onCompletion(() -> { + SseEmitter remove = emitters.remove(token); + if (remove != null) { + remove.complete(); + } + }); + emitter.onTimeout(() -> { + SseEmitter remove = emitters.remove(token); + if (remove != null) { + remove.complete(); + } + }); + emitter.onError((e) -> { + SseEmitter remove = emitters.remove(token); + if (remove != null) { + remove.complete(); + } + }); try { + // 向客户端发送一条连接成功的事件 emitter.send(SseEmitter.event().comment("connected")); - log.warn("SSE连接成功 userId={}, token={}", userId, token); } catch (IOException e) { - log.warn("SSE连接初始化失败 userId={}, token={}, 错误: {}", userId, token, e.getMessage()); - disconnect(userId, token); + // 如果发送消息失败,则从映射表中移除 emitter + emitters.remove(token); } return emitter; } @@ -75,20 +85,13 @@ public class SseEmitterManager { } Map emitters = USER_TOKEN_EMITTERS.get(userId); if (MapUtil.isNotEmpty(emitters)) { - SseEmitter sseEmitter = emitters.remove(token); - if (ObjectUtil.isNotNull(sseEmitter)) { - try { - sseEmitter.send(SseEmitter.event().comment("disconnected")); - } catch (IOException e) { - log.warn("SSE断开通知失败 userId={}, token={}", userId, token); - } finally { - sseEmitter.complete(); - log.warn("SSE连接断开 userId={}, token={}", userId, token); - } - } - if (emitters.isEmpty()) { - USER_TOKEN_EMITTERS.remove(userId); + try { + SseEmitter sseEmitter = emitters.get(token); + sseEmitter.send(SseEmitter.event().comment("disconnected")); + sseEmitter.complete(); + } catch (Exception ignore) { } + emitters.remove(token); } else { USER_TOKEN_EMITTERS.remove(userId); } @@ -112,12 +115,16 @@ public class SseEmitterManager { public void sendMessage(Long userId, String message) { Map emitters = USER_TOKEN_EMITTERS.get(userId); if (MapUtil.isNotEmpty(emitters)) { - for (String token : emitters.keySet()) { + for (Map.Entry entry : emitters.entrySet()) { try { - emitters.get(token).send(SseEmitter.event().name("message").data(message)); + entry.getValue().send(SseEmitter.event() + .name("message") + .data(message)); } catch (Exception e) { - log.warn("SSE消息发送失败 userId={}, token={}, error={}", userId, token, e.getMessage()); - disconnect(userId, token); + SseEmitter remove = emitters.remove(entry.getKey()); + if (remove != null) { + remove.complete(); + } } } } else { From 4b04a4bf0983dceb912637a5321842d6053bd5a6 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Tue, 24 Jun 2025 16:10:26 +0800 Subject: [PATCH 39/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=8F=90=E5=8D=87=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=A7=A3=E6=9E=90=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/web/config/ResourcesConfig.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java index 1371913be..eda81a7d4 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java @@ -1,9 +1,12 @@ package org.dromara.common.web.config; +import cn.hutool.core.date.DateUtil; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.web.handler.GlobalExceptionHandler; import org.dromara.common.web.interceptor.PlusWebInvokeTimeInterceptor; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; +import org.springframework.format.FormatterRegistry; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @@ -11,6 +14,8 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.Date; + /** * 通用配置 * @@ -25,6 +30,17 @@ public class ResourcesConfig implements WebMvcConfigurer { registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); } + @Override + public void addFormatters(FormatterRegistry registry) { + // 全局日期格式转换配置 + registry.addConverter(String.class, Date.class, source -> { + if (StringUtils.isBlank(source)) { + return null; + } + return DateUtil.parse(source); + }); + } + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } From 770c3bd03e2cfab961bfe2953e173637162d6a4f 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, 26 Jun 2025 09:53:40 +0800 Subject: [PATCH 40/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=94=99=E8=AF=AF=E7=9A=84=E6=B3=A8=E8=A7=A3=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=89=8D=E7=AB=AF=E6=97=B6=E9=97=B4=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=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/workflow/domain/vo/TestLeaveVo.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index 57777edde..4c9b4e936 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -42,14 +42,12 @@ public class TestLeaveVo implements Serializable { * 开始时间 */ @ExcelProperty(value = "开始时间") - @JsonFormat(pattern = "yyyy-MM-dd") private Date startDate; /** * 结束时间 */ @ExcelProperty(value = "结束时间") - @JsonFormat(pattern = "yyyy-MM-dd") private Date endDate; /** From 1ad0d5387b0341300e40c238f1146be406362e44 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, 26 Jun 2025 10:41:06 +0800 Subject: [PATCH 41/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E6=A0=B7=E5=BC=8F=E8=A6=86=E7=9B=96=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/excel/handler/DataWriteHandler.java | 11 ++++++----- .../java/org/dromara/demo/domain/vo/TestDemoVo.java | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java index 259f8225b..75918a0ad 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java @@ -49,15 +49,16 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { if (CollUtil.isEmpty(notationMap) && CollUtil.isEmpty(headColumnMap)) { return; } + // 第一行 WriteCellData cellData = context.getFirstCellData(); + // 第一个格子 WriteCellStyle writeCellStyle = cellData.getOrCreateStyle(); - DataFormatData dataFormatData = new DataFormatData(); - // 单元格设置为文本格式 - dataFormatData.setIndex((short) 49); - writeCellStyle.setDataFormatData(dataFormatData); - if (context.getHead()) { + DataFormatData dataFormatData = new DataFormatData(); + // 单元格设置为文本格式 + dataFormatData.setIndex((short) 49); + writeCellStyle.setDataFormatData(dataFormatData); Cell cell = context.getCell(); WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); Sheet sheet = writeSheetHolder.getSheet(); diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index e757221c3..c4387c6cd 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -2,6 +2,7 @@ package org.dromara.demo.domain.vo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.format.DateTimeFormat; import org.dromara.common.excel.annotation.ExcelNotation; import org.dromara.common.excel.annotation.ExcelRequired; import org.dromara.common.translation.annotation.Translation; @@ -73,6 +74,8 @@ public class TestDemoVo implements Serializable { /** * 创建时间 */ + @ExcelRequired + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "创建时间") private Date createTime; From 8f5d60f543d0c6d1ea1b9c36cb7f50606f761d26 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 26 Jun 2025 11:26:17 +0800 Subject: [PATCH 42/54] =?UTF-8?q?update=20=E5=8D=87=E7=BA=A7warm-flow1.7.4?= =?UTF-8?q?->1.7.5-m2=20=E4=BC=98=E5=8C=96=E6=B5=81=E7=A8=8B=E5=9B=BE?= =?UTF-8?q?=E6=82=AC=E6=B5=AE=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../service/impl/FlwCategoryServiceImpl.java | 34 ++++++-- .../service/impl/FlwChartExtServiceImpl.java | 87 +++++++++---------- script/sql/ry_workflow.sql | 1 + script/sql/update/update_5.3.1-5.4.0.sql | 3 + 5 files changed, 70 insertions(+), 57 deletions(-) diff --git a/pom.xml b/pom.xml index 5d5fe84ca..81fc51c4d 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,7 @@ 8.7.2-20250603 - 1.7.4 + 1.7.5-m2 3.4.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index db1b7b7f0..6870a80c9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -13,6 +13,7 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; +import org.dromara.warm.flow.ui.service.CategoryService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.FlowCategory; @@ -35,7 +36,7 @@ import java.util.List; @ConditionalOnEnable @RequiredArgsConstructor @Service -public class FlwCategoryServiceImpl implements IFlwCategoryService { +public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryService { private final DefService defService; private final FlwCategoryMapper baseMapper; @@ -102,22 +103,37 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { } // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 List> treeList = CollUtil.newArrayList(); - for (FlowCategoryVo d : categorys) { - String parentId = d.getParentId().toString(); + for (FlowCategoryVo current : categorys) { + String parentId = current.getParentId().toString(); FlowCategoryVo categoryVo = StreamUtils.findFirst(categorys, it -> it.getCategoryId().toString().equals(parentId)); if (ObjectUtil.isNull(categoryVo)) { - List> trees = TreeBuildUtils.build(categorys, parentId, (dept, tree) -> - tree.setId(dept.getCategoryId().toString()) - .setParentId(dept.getParentId().toString()) - .setName(dept.getCategoryName()) - .setWeight(dept.getOrderNum())); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(d.getCategoryId().toString())); + List> trees = TreeBuildUtils.build(categorys, parentId, (node, tree) -> + tree.setId(node.getCategoryId().toString()) + .setParentId(node.getParentId().toString()) + .setName(node.getCategoryName()) + .setWeight(node.getOrderNum())); + Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(current.getCategoryId().toString())); treeList.add(tree); } } return treeList; } + /** + * 工作流查询分类 + * + * @return 分类树结构列表 + */ + @Override + public List queryCategory() { + List list = this.queryList(new FlowCategoryBo()); + return StreamUtils.toList(list, category -> new org.dromara.warm.flow.core.dto.Tree() + .setId(String.valueOf(category.getCategoryId())) + .setName(category.getCategoryName()) + .setParentId(String.valueOf(category.getParentId())) + ); + } + /** * 校验流程分类是否有数据权限 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index d7c6f77eb..0f5a2c764 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -12,7 +12,6 @@ import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.DictService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; -import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.DefJson; @@ -53,12 +52,8 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ @Override public void execute(DefJson defJson) { - // 临时修复 后续版本将通过defjson获取流程实例ID - String[] parts = ServletUtils.getRequest().getRequestURI().split("/"); - Long instanceId = Convert.toLong(parts[parts.length - 1]); - // 根据流程实例ID查询所有相关的历史任务列表 - List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); + List flowHisTasks = this.getHisTaskGroupedByNode(defJson.getInstance().getId()); if (CollUtil.isEmpty(flowHisTasks)) { return; } @@ -74,14 +69,12 @@ public class FlwChartExtServiceImpl implements ChartExtService { Map dictType = dictService.getAllDictByDictType(FlowConstant.WF_TASK_STATUS); - // 遍历流程定义中的每个节点,调用处理方法,将对应节点的任务列表及用户信息传入,生成扩展提示内容 for (NodeJson nodeJson : defJson.getNodeList()) { - // 获取当前节点对应的历史任务列表,如果没有则返回空列表避免空指针 List taskList = groupedByNode.get(nodeJson.getNodeCode()); if (CollUtil.isEmpty(taskList)) { continue; } - // 处理当前节点的扩展信息,包括构建审批人提示内容等 + // 处理当前节点的扩展信息 this.processNodeExtInfo(nodeJson, taskList, userMap, dictType); } } @@ -96,44 +89,44 @@ public class FlwChartExtServiceImpl implements ChartExtService { defJson.setTopText("流程名称: " + defJson.getFlowName()); defJson.getNodeList().forEach(nodeJson -> { nodeJson.setPromptContent( - new PromptContent() - // 提示信息 - .setInfo( - CollUtil.newArrayList( - new PromptContent.InfoItem() - .setPrefix("任务名称: ") - .setContent(nodeJson.getNodeName()) - .setContentStyle(Map.of( - "border", "1px solid #d1e9ff", - "backgroundColor", "#e8f4ff", - "padding", "4px 8px", - "borderRadius", "4px" - )) - .setRowStyle(Map.of( - "fontWeight", "bold", - "margin", "0 0 6px 0", - "padding", "0 0 8px 0", - "borderBottom", "1px solid #ccc" - )) - ) - ) - // 弹窗样式 - .setDialogStyle(MapUtil.mergeAll( - "position", "absolute", - "backgroundColor", "#fff", - "border", "1px solid #ccc", - "borderRadius", "4px", - "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", - "padding", "8px 12px", - "fontSize", "14px", - "zIndex", "1000", - "maxWidth", "500px", - "overflowY", "visible", - "overflowX", "hidden", - "color", "#333", - "pointerEvents", "auto", - "scrollbarWidth", "thin" - )) + new PromptContent() + // 提示信息主体内容样式 + .setInfo( + CollUtil.newArrayList( + new PromptContent.InfoItem() + .setPrefix("任务名称: ") + .setContent(nodeJson.getNodeName()) + .setContentStyle(Map.of( + "border", "1px solid #d1e9ff", + "backgroundColor", "#e8f4ff", + "padding", "4px 8px", + "borderRadius", "4px" + )) + .setRowStyle(Map.of( + "fontWeight", "bold", + "margin", "0 0 6px 0", + "padding", "0 0 8px 0", + "borderBottom", "1px solid #ccc" + )) + )) + // 弹窗容器样式(包含滚动条设置) + .setDialogStyle(MapUtil.mergeAll( + "position", "absolute", + "backgroundColor", "#fff", + "border", "1px solid #ccc", + "borderRadius", "4px", + "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", + "padding", "8px 12px", + "fontSize", "14px", + "zIndex", "1000", + "maxWidth", "500px", + "maxHeight", "300px", // 设置最大高度,超过触发滚动 + "overflowY", "auto", // 允许垂直滚动 + "overflowX", "hidden", // 禁止横向滚动 + "color", "#333", + "pointerEvents", "auto", + "scrollbarWidth", "thin" // 滚动条宽度细化(部分浏览器支持) + )) ); }); } diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index bb3d76e68..8c2e12cd1 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -6,6 +6,7 @@ CREATE TABLE `flow_definition` `id` bigint NOT NULL COMMENT '主键id', `flow_code` varchar(40) NOT NULL COMMENT '流程编码', `flow_name` varchar(100) NOT NULL COMMENT '流程名称', + `mode` varchar(40) NOT NULL DEFAULT 'CLASSICS' COMMENT '设计器模式(CLASSICS经典模式 MIMIC仿钉钉模式)', `category` varchar(100) DEFAULT NULL COMMENT '流程类别', `version` varchar(20) NOT NULL COMMENT '流程版本', `is_publish` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否发布(0未发布 1已发布 9失效)', diff --git a/script/sql/update/update_5.3.1-5.4.0.sql b/script/sql/update/update_5.3.1-5.4.0.sql index 058f6fcba..b0e02af69 100644 --- a/script/sql/update/update_5.3.1-5.4.0.sql +++ b/script/sql/update/update_5.3.1-5.4.0.sql @@ -7,6 +7,9 @@ ALTER TABLE `flow_instance` ALTER TABLE `flow_his_task` MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type`; +ALTER TABLE `flow_definition` + ADD COLUMN `mode` varchar(40) NOT NULL DEFAULT 'CLASSICS' COMMENT '设计器模式(CLASSICS经典模式 MIMIC仿钉钉模式)' AFTER `flow_name`; + ALTER TABLE `sys_social` MODIFY COLUMN `access_token` varchar(2000) NOT NULL COMMENT '用户的授权令牌' AFTER `avatar`; ALTER TABLE `sys_social` From 314909a53637246175b7787f83aa6ff36232a516 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, 26 Jun 2025 14:04:10 +0800 Subject: [PATCH 43/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20excel=20?= =?UTF-8?q?=E5=A4=87=E6=B3=A8=E4=B8=8E=E5=BF=85=E5=A1=AB=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E4=B8=8B=E6=A0=87=E4=BD=8D=E7=BD=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E5=8E=BB=E9=99=A4=E4=B8=8B=E6=A0=87=E8=B7=9F?= =?UTF-8?q?=E9=9A=8F=E4=B8=BB=E8=A6=81=E6=B3=A8=E8=A7=A3=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/annotation/ExcelNotation.java | 6 +-- .../excel/annotation/ExcelRequired.java | 6 +-- .../excel/handler/DataWriteHandler.java | 47 +++++++------------ .../dromara/demo/domain/vo/TestDemoVo.java | 2 +- 4 files changed, 20 insertions(+), 41 deletions(-) diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java index f358afcd6..ed42371d7 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelNotation.java @@ -6,17 +6,13 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 批注 + * 批注 此注解仅用于单表头 不支持多层级表头 * @author guzhouyanyu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelNotation { - /** - * col index - */ - int index() default -1; /** * 批注内容 */ diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java index 15784e140..ca8083bc8 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/ExcelRequired.java @@ -8,17 +8,13 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 是否必填 + * 是否必填 此注解仅用于单表头 不支持多层级表头 * @author guzhouyanyu */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelRequired { - /** - * col index - */ - int index() default -1; /** * 字体颜色 */ diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java index 75918a0ad..3770f8032 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/DataWriteHandler.java @@ -1,6 +1,7 @@ package org.dromara.common.excel.handler; import cn.hutool.core.collection.CollUtil; +import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.metadata.data.DataFormatData; import cn.idev.excel.metadata.data.WriteCellData; import cn.idev.excel.util.StyleUtil; @@ -13,7 +14,6 @@ import cn.idev.excel.write.metadata.style.WriteFont; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.excel.annotation.ExcelNotation; import org.dromara.common.excel.annotation.ExcelRequired; @@ -31,12 +31,12 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { /** * 批注 */ - private final Map notationMap; + private final Map notationMap; /** * 头列字体颜色 */ - private final Map headColumnMap; + private final Map headColumnMap; public DataWriteHandler(Class clazz) { @@ -68,17 +68,17 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { WriteFont headWriteFont = new WriteFont(); // 加粗 headWriteFont.setBold(true); - if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getColumnIndex())) { + if (CollUtil.isNotEmpty(headColumnMap) && headColumnMap.containsKey(cell.getStringCellValue())) { // 设置字体颜色 - headWriteFont.setColor(headColumnMap.get(cell.getColumnIndex())); + headWriteFont.setColor(headColumnMap.get(cell.getStringCellValue())); } writeCellStyle.setWriteFont(headWriteFont); CellStyle cellStyle = StyleUtil.buildCellStyle(workbook, null, writeCellStyle); cell.setCellStyle(cellStyle); - if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getColumnIndex())) { + if (CollUtil.isNotEmpty(notationMap) && notationMap.containsKey(cell.getStringCellValue())) { // 批注内容 - String notationContext = notationMap.get(cell.getColumnIndex()); + String notationContext = notationMap.get(cell.getStringCellValue()); // 创建绘图对象 Comment comment = drawing.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) 5, 5)); comment.setString(new XSSFRichTextString(notationContext)); @@ -90,23 +90,16 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { /** * 获取必填列 */ - private static Map getRequiredMap(Class clazz) { - Map requiredMap = new HashMap<>(); + private static Map getRequiredMap(Class clazz) { + Map requiredMap = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); - // 检查 fields 数组是否为空 - if (fields.length == 0) { - return requiredMap; - } - Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); - - for (int i = 0; i < filteredFields.length; i++) { - Field field = filteredFields[i]; + for (Field field : fields) { if (!field.isAnnotationPresent(ExcelRequired.class)) { continue; } ExcelRequired excelRequired = field.getAnnotation(ExcelRequired.class); - int columnIndex = excelRequired.index() == -1 ? i : excelRequired.index(); - requiredMap.put(columnIndex, excelRequired.fontColor().getIndex()); + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + requiredMap.put(excelProperty.value()[0], excelRequired.fontColor().getIndex()); } return requiredMap; } @@ -114,22 +107,16 @@ public class DataWriteHandler implements SheetWriteHandler, CellWriteHandler { /** * 获取批注 */ - private static Map getNotationMap(Class clazz) { - Map notationMap = new HashMap<>(); + private static Map getNotationMap(Class clazz) { + Map notationMap = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); - // 检查 fields 数组是否为空 - if (fields.length == 0) { - return notationMap; - } - Field[] filteredFields = ReflectUtils.getFields(clazz, field -> !"serialVersionUID".equals(field.getName())); - for (int i = 0; i < filteredFields.length; i++) { - Field field = filteredFields[i]; + for (Field field : fields) { if (!field.isAnnotationPresent(ExcelNotation.class)) { continue; } ExcelNotation excelNotation = field.getAnnotation(ExcelNotation.class); - int columnIndex = excelNotation.index() == -1 ? i : excelNotation.index(); - notationMap.put(columnIndex, excelNotation.value()); + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + notationMap.put(excelProperty.value()[0], excelNotation.value()); } return notationMap; } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java index c4387c6cd..642e0f746 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/TestDemoVo.java @@ -47,7 +47,7 @@ public class TestDemoVo implements Serializable { * 用户id */ @ExcelRequired - @ExcelProperty(value = "用户id") + @ExcelProperty(value = "用户id", index = 5) private Long userId; /** From e659740cb86547b2ac58e81c2ebe2453a5924fe6 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, 26 Jun 2025 07:07:03 +0000 Subject: [PATCH 44/54] =?UTF-8?q?Revert=20"update=20=E5=8D=87=E7=BA=A7warm?= =?UTF-8?q?-flow1.7.4->1.7.5-m2=20=E4=BC=98=E5=8C=96=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=9B=BE=E6=82=AC=E6=B5=AE=E7=AA=97"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 8f5d60f543d0c6d1ea1b9c36cb7f50606f761d26. --- pom.xml | 2 +- .../service/impl/FlwCategoryServiceImpl.java | 34 ++------ .../service/impl/FlwChartExtServiceImpl.java | 87 ++++++++++--------- script/sql/ry_workflow.sql | 1 - script/sql/update/update_5.3.1-5.4.0.sql | 3 - 5 files changed, 57 insertions(+), 70 deletions(-) diff --git a/pom.xml b/pom.xml index 81fc51c4d..5d5fe84ca 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,7 @@ 8.7.2-20250603 - 1.7.5-m2 + 1.7.4 3.4.2 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index 6870a80c9..db1b7b7f0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -13,7 +13,6 @@ import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.orm.entity.FlowDefinition; -import org.dromara.warm.flow.ui.service.CategoryService; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.FlowCategory; @@ -36,7 +35,7 @@ import java.util.List; @ConditionalOnEnable @RequiredArgsConstructor @Service -public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryService { +public class FlwCategoryServiceImpl implements IFlwCategoryService { private final DefService defService; private final FlwCategoryMapper baseMapper; @@ -103,37 +102,22 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService, CategoryServ } // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 List> treeList = CollUtil.newArrayList(); - for (FlowCategoryVo current : categorys) { - String parentId = current.getParentId().toString(); + for (FlowCategoryVo d : categorys) { + String parentId = d.getParentId().toString(); FlowCategoryVo categoryVo = StreamUtils.findFirst(categorys, it -> it.getCategoryId().toString().equals(parentId)); if (ObjectUtil.isNull(categoryVo)) { - List> trees = TreeBuildUtils.build(categorys, parentId, (node, tree) -> - tree.setId(node.getCategoryId().toString()) - .setParentId(node.getParentId().toString()) - .setName(node.getCategoryName()) - .setWeight(node.getOrderNum())); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(current.getCategoryId().toString())); + List> trees = TreeBuildUtils.build(categorys, parentId, (dept, tree) -> + tree.setId(dept.getCategoryId().toString()) + .setParentId(dept.getParentId().toString()) + .setName(dept.getCategoryName()) + .setWeight(dept.getOrderNum())); + Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(d.getCategoryId().toString())); treeList.add(tree); } } return treeList; } - /** - * 工作流查询分类 - * - * @return 分类树结构列表 - */ - @Override - public List queryCategory() { - List list = this.queryList(new FlowCategoryBo()); - return StreamUtils.toList(list, category -> new org.dromara.warm.flow.core.dto.Tree() - .setId(String.valueOf(category.getCategoryId())) - .setName(category.getCategoryName()) - .setParentId(String.valueOf(category.getParentId())) - ); - } - /** * 校验流程分类是否有数据权限 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index 0f5a2c764..d7c6f77eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -12,6 +12,7 @@ import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.DictService; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.dto.DefJson; @@ -52,8 +53,12 @@ public class FlwChartExtServiceImpl implements ChartExtService { */ @Override public void execute(DefJson defJson) { + // 临时修复 后续版本将通过defjson获取流程实例ID + String[] parts = ServletUtils.getRequest().getRequestURI().split("/"); + Long instanceId = Convert.toLong(parts[parts.length - 1]); + // 根据流程实例ID查询所有相关的历史任务列表 - List flowHisTasks = this.getHisTaskGroupedByNode(defJson.getInstance().getId()); + List flowHisTasks = this.getHisTaskGroupedByNode(instanceId); if (CollUtil.isEmpty(flowHisTasks)) { return; } @@ -69,12 +74,14 @@ public class FlwChartExtServiceImpl implements ChartExtService { Map dictType = dictService.getAllDictByDictType(FlowConstant.WF_TASK_STATUS); + // 遍历流程定义中的每个节点,调用处理方法,将对应节点的任务列表及用户信息传入,生成扩展提示内容 for (NodeJson nodeJson : defJson.getNodeList()) { + // 获取当前节点对应的历史任务列表,如果没有则返回空列表避免空指针 List taskList = groupedByNode.get(nodeJson.getNodeCode()); if (CollUtil.isEmpty(taskList)) { continue; } - // 处理当前节点的扩展信息 + // 处理当前节点的扩展信息,包括构建审批人提示内容等 this.processNodeExtInfo(nodeJson, taskList, userMap, dictType); } } @@ -89,44 +96,44 @@ public class FlwChartExtServiceImpl implements ChartExtService { defJson.setTopText("流程名称: " + defJson.getFlowName()); defJson.getNodeList().forEach(nodeJson -> { nodeJson.setPromptContent( - new PromptContent() - // 提示信息主体内容样式 - .setInfo( - CollUtil.newArrayList( - new PromptContent.InfoItem() - .setPrefix("任务名称: ") - .setContent(nodeJson.getNodeName()) - .setContentStyle(Map.of( - "border", "1px solid #d1e9ff", - "backgroundColor", "#e8f4ff", - "padding", "4px 8px", - "borderRadius", "4px" - )) - .setRowStyle(Map.of( - "fontWeight", "bold", - "margin", "0 0 6px 0", - "padding", "0 0 8px 0", - "borderBottom", "1px solid #ccc" - )) - )) - // 弹窗容器样式(包含滚动条设置) - .setDialogStyle(MapUtil.mergeAll( - "position", "absolute", - "backgroundColor", "#fff", - "border", "1px solid #ccc", - "borderRadius", "4px", - "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", - "padding", "8px 12px", - "fontSize", "14px", - "zIndex", "1000", - "maxWidth", "500px", - "maxHeight", "300px", // 设置最大高度,超过触发滚动 - "overflowY", "auto", // 允许垂直滚动 - "overflowX", "hidden", // 禁止横向滚动 - "color", "#333", - "pointerEvents", "auto", - "scrollbarWidth", "thin" // 滚动条宽度细化(部分浏览器支持) - )) + new PromptContent() + // 提示信息 + .setInfo( + CollUtil.newArrayList( + new PromptContent.InfoItem() + .setPrefix("任务名称: ") + .setContent(nodeJson.getNodeName()) + .setContentStyle(Map.of( + "border", "1px solid #d1e9ff", + "backgroundColor", "#e8f4ff", + "padding", "4px 8px", + "borderRadius", "4px" + )) + .setRowStyle(Map.of( + "fontWeight", "bold", + "margin", "0 0 6px 0", + "padding", "0 0 8px 0", + "borderBottom", "1px solid #ccc" + )) + ) + ) + // 弹窗样式 + .setDialogStyle(MapUtil.mergeAll( + "position", "absolute", + "backgroundColor", "#fff", + "border", "1px solid #ccc", + "borderRadius", "4px", + "boxShadow", "0 2px 8px rgba(0, 0, 0, 0.15)", + "padding", "8px 12px", + "fontSize", "14px", + "zIndex", "1000", + "maxWidth", "500px", + "overflowY", "visible", + "overflowX", "hidden", + "color", "#333", + "pointerEvents", "auto", + "scrollbarWidth", "thin" + )) ); }); } diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql index 8c2e12cd1..bb3d76e68 100644 --- a/script/sql/ry_workflow.sql +++ b/script/sql/ry_workflow.sql @@ -6,7 +6,6 @@ CREATE TABLE `flow_definition` `id` bigint NOT NULL COMMENT '主键id', `flow_code` varchar(40) NOT NULL COMMENT '流程编码', `flow_name` varchar(100) NOT NULL COMMENT '流程名称', - `mode` varchar(40) NOT NULL DEFAULT 'CLASSICS' COMMENT '设计器模式(CLASSICS经典模式 MIMIC仿钉钉模式)', `category` varchar(100) DEFAULT NULL COMMENT '流程类别', `version` varchar(20) NOT NULL COMMENT '流程版本', `is_publish` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否发布(0未发布 1已发布 9失效)', diff --git a/script/sql/update/update_5.3.1-5.4.0.sql b/script/sql/update/update_5.3.1-5.4.0.sql index b0e02af69..058f6fcba 100644 --- a/script/sql/update/update_5.3.1-5.4.0.sql +++ b/script/sql/update/update_5.3.1-5.4.0.sql @@ -7,9 +7,6 @@ ALTER TABLE `flow_instance` ALTER TABLE `flow_his_task` MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type`; -ALTER TABLE `flow_definition` - ADD COLUMN `mode` varchar(40) NOT NULL DEFAULT 'CLASSICS' COMMENT '设计器模式(CLASSICS经典模式 MIMIC仿钉钉模式)' AFTER `flow_name`; - ALTER TABLE `sys_social` MODIFY COLUMN `access_token` varchar(2000) NOT NULL COMMENT '用户的授权令牌' AFTER `avatar`; ALTER TABLE `sys_social` From eea96e87d992f6a52f35161071f85b5eb55e8b39 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 26 Jun 2025 14:36:18 +0800 Subject: [PATCH 45/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E5=A4=9A=E6=A0=B9=E8=8A=82=E7=82=B9=E7=9A=84=E6=A0=91?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=88=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E9=A1=B6=E7=BA=A7=E8=8A=82=E7=82=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/TreeBuildUtils.java | 35 +++++++++++++++++++ .../service/impl/SysDeptServiceImpl.java | 28 ++++++--------- .../service/impl/FlwCategoryServiceImpl.java | 31 +++++++--------- 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java index 2ab42cbc1..1f2b99c9c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -10,6 +10,9 @@ import lombok.NoArgsConstructor; import org.dromara.common.core.utils.reflect.ReflectUtils; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -60,6 +63,38 @@ public class TreeBuildUtils extends TreeUtil { return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); } + /** + * 构建多根节点的树结构(支持多个顶级节点) + * + * @param list 原始数据列表 + * @param getId 获取节点 ID 的方法引用,例如:node -> node.getId() + * @param getParentId 获取节点父级 ID 的方法引用,例如:node -> node.getParentId() + * @param parser 树节点属性映射器,用于将原始节点 T 转为 Tree 节点 + * @param 原始数据类型(如实体类、DTO 等) + * @param 节点 ID 类型(如 Long、String) + * @return 构建完成的树形结构(可能包含多个顶级根节点) + */ + public static List> buildMultiRoot(List list, Function getId, Function getParentId, NodeParser parser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + + // 提取所有节点 ID,用于后续判断哪些节点为根节点(即 parentId 不在其中) + Set allIds = StreamUtils.toSet(list, getId); + + // 筛选出所有 parentId 不在 allIds 中的节点,这些节点的 parentId 可认为是根节点 + Set rootParentIds = list.stream() + .map(getParentId) + .filter(Objects::nonNull) + .filter(pid -> !allIds.contains(pid)) + .collect(Collectors.toSet()); + + // 使用流处理,遍历每个顶级 parentId,构建对应树,并合并为一个列表返回 + return rootParentIds.stream() + .flatMap(rootParentId -> TreeUtil.build(list, rootParentId, parser).stream()) + .collect(Collectors.toList()); + } + /** * 获取节点列表中所有节点的叶子节点 * 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 5e4904d05..fde4b875b 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 @@ -131,23 +131,17 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { if (CollUtil.isEmpty(depts)) { return CollUtil.newArrayList(); } - // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 - List> treeList = CollUtil.newArrayList(); - for (SysDeptVo d : depts) { - Long parentId = d.getParentId(); - SysDeptVo sysDeptVo = StreamUtils.findFirst(depts, it -> it.getDeptId().longValue() == parentId); - if (ObjectUtil.isNull(sysDeptVo)) { - List> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) -> - tree.setId(dept.getDeptId()) - .setParentId(dept.getParentId()) - .setName(dept.getDeptName()) - .setWeight(dept.getOrderNum()) - .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus()))); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId()); - treeList.add(tree); - } - } - return treeList; + return TreeBuildUtils.buildMultiRoot( + depts, + SysDeptVo::getDeptId, + SysDeptVo::getParentId, + (node, treeNode) -> treeNode + .setId(node.getDeptId()) + .setParentId(node.getParentId()) + .setName(node.getDeptName()) + .setWeight(node.getOrderNum()) + .putExtra("disabled", SystemConstants.DISABLE.equals(node.getStatus())) + ); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index db1b7b7f0..dc8d6c833 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -95,27 +95,20 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { */ @Override public List> selectCategoryTreeList(FlowCategoryBo category) { - LambdaQueryWrapper lqw = buildQueryWrapper(category); - List categorys = baseMapper.selectVoList(lqw); - if (CollUtil.isEmpty(categorys)) { + List categoryList = this.queryList(category); + if (CollUtil.isEmpty(categoryList)) { return CollUtil.newArrayList(); } - // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 - List> treeList = CollUtil.newArrayList(); - for (FlowCategoryVo d : categorys) { - String parentId = d.getParentId().toString(); - FlowCategoryVo categoryVo = StreamUtils.findFirst(categorys, it -> it.getCategoryId().toString().equals(parentId)); - if (ObjectUtil.isNull(categoryVo)) { - List> trees = TreeBuildUtils.build(categorys, parentId, (dept, tree) -> - tree.setId(dept.getCategoryId().toString()) - .setParentId(dept.getParentId().toString()) - .setName(dept.getCategoryName()) - .setWeight(dept.getOrderNum())); - Tree tree = StreamUtils.findFirst(trees, it -> it.getId().equals(d.getCategoryId().toString())); - treeList.add(tree); - } - } - return treeList; + return TreeBuildUtils.buildMultiRoot( + categoryList, + node -> String.valueOf(node.getCategoryId()), + node -> String.valueOf(node.getParentId()), + (node, treeNode) -> treeNode + .setId(String.valueOf(node.getCategoryId())) + .setParentId(String.valueOf(node.getParentId())) + .setName(node.getCategoryName()) + .setWeight(node.getOrderNum()) + ); } /** From 5a9728c868cdecc8de0ff143c551b2242a1bb960 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 26 Jun 2025 17:20:04 +0800 Subject: [PATCH 46/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=9F=A5=E8=AF=A2=E4=BB=A5=E5=8F=8A=E5=A4=9A=E6=A0=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E6=9E=84=E5=BB=BA=E6=A0=91=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/core/utils/TreeBuildUtils.java | 14 +++----------- .../workflow/domain/vo/FlowCategoryVo.java | 15 +++++---------- .../service/impl/FlwCategoryServiceImpl.java | 14 +++++--------- 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java index 1f2b99c9c..5f60ebff1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -10,7 +10,6 @@ import lombok.NoArgsConstructor; import org.dromara.common.core.utils.reflect.ReflectUtils; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -79,17 +78,10 @@ public class TreeBuildUtils extends TreeUtil { return CollUtil.newArrayList(); } - // 提取所有节点 ID,用于后续判断哪些节点为根节点(即 parentId 不在其中) - Set allIds = StreamUtils.toSet(list, getId); + Set rootParentIds = StreamUtils.toSet(list, getParentId); + rootParentIds.removeAll(StreamUtils.toSet(list, getId)); - // 筛选出所有 parentId 不在 allIds 中的节点,这些节点的 parentId 可认为是根节点 - Set rootParentIds = list.stream() - .map(getParentId) - .filter(Objects::nonNull) - .filter(pid -> !allIds.contains(pid)) - .collect(Collectors.toSet()); - - // 使用流处理,遍历每个顶级 parentId,构建对应树,并合并为一个列表返回 + // 构建每一个根 parentId 下的树,并合并成最终结果列表 return rootParentIds.stream() .flatMap(rootParentId -> TreeUtil.build(list, rootParentId, parser).stream()) .collect(Collectors.toList()); 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 db236c2df..c5427a570 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 @@ -4,14 +4,13 @@ import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.workflow.common.constant.FlowConstant; 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; - /** * 流程分类视图对象 wf_category @@ -34,13 +33,14 @@ public class FlowCategoryVo implements Serializable { private Long categoryId; /** - * 父级id + * 父级分类id */ private Long parentId; /** - * 父类别名称 + * 父级分类名称 */ + @Translation(type = FlowConstant.CATEGORY_ID_TO_NAME, mapper = "parentId") private String parentName; /** @@ -66,9 +66,4 @@ public class FlowCategoryVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; - /** - * 子菜单 - */ - private List children = new ArrayList<>(); - } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java index dc8d6c833..d42a48a2f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCategoryServiceImpl.java @@ -8,7 +8,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.*; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.TreeBuildUtils; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.service.DefService; @@ -48,14 +51,7 @@ public class FlwCategoryServiceImpl implements IFlwCategoryService { */ @Override public FlowCategoryVo queryById(Long categoryId) { - FlowCategoryVo category = baseMapper.selectVoById(categoryId); - if (ObjectUtil.isNull(category)) { - return null; - } - FlowCategoryVo parentCategory = baseMapper.selectVoOne(new LambdaQueryWrapper() - .select(FlowCategory::getCategoryName).eq(FlowCategory::getCategoryId, category.getParentId())); - category.setParentName(ObjectUtils.notNullGetter(parentCategory, FlowCategoryVo::getCategoryName)); - return category; + return baseMapper.selectVoById(categoryId); } /** From 6722f2eeed0436f947c7de10578b83a6e785feeb Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 27 Jun 2025 01:07:11 +0000 Subject: [PATCH 47/54] =?UTF-8?q?!703=20update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=AE=A1=E7=90=86=20*=20update=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysClientServiceImpl.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java index 4f6e676df..2b995beec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -43,11 +44,10 @@ public class SysClientServiceImpl implements ISysClientService { @Override public SysClientVo queryById(Long id) { SysClientVo vo = baseMapper.selectVoById(id); - vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + vo.setGrantTypeList(StringUtils.splitList(vo.getGrantType())); return vo; } - /** * 查询客户端管理 */ @@ -64,7 +64,7 @@ public class SysClientServiceImpl implements ISysClientService { public TableDataInfo queryPageList(SysClientBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + result.getRecords().forEach(r -> r.setGrantTypeList(StringUtils.splitList(r.getGrantType()))); return TableDataInfo.build(result); } @@ -93,8 +93,7 @@ public class SysClientServiceImpl implements ISysClientService { @Override public Boolean insertByBo(SysClientBo bo) { SysClient add = MapstructUtils.convert(bo, SysClient.class); - validEntityBeforeSave(add); - add.setGrantType(String.join(",", bo.getGrantTypeList())); + add.setGrantType(CollUtil.join(bo.getGrantTypeList(), StringUtils.SEPARATOR)); // 生成clientid String clientKey = bo.getClientKey(); String clientSecret = bo.getClientSecret(); @@ -113,7 +112,6 @@ public class SysClientServiceImpl implements ISysClientService { @Override public Boolean updateByBo(SysClientBo bo) { SysClient update = MapstructUtils.convert(bo, SysClient.class); - validEntityBeforeSave(update); update.setGrantType(String.join(",", bo.getGrantTypeList())); return baseMapper.updateById(update) > 0; } @@ -130,22 +128,12 @@ public class SysClientServiceImpl implements ISysClientService { .eq(SysClient::getClientId, clientId)); } - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysClient entity) { - //TODO 做一些数据校验,如唯一约束 - } - /** * 批量删除客户端管理 */ @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } return baseMapper.deleteByIds(ids) > 0; } } From bbabffe191a1f50215b28f5e4013a37ab3be7408 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 27 Jun 2025 01:10:26 +0000 Subject: [PATCH 48/54] =?UTF-8?q?!702=20update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE=20*=20update=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysConfigController.java | 7 ++-- .../system/service/ISysConfigService.java | 2 +- .../service/impl/SysConfigServiceImpl.java | 39 +++++++------------ 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index c73c3866f..e5d9242be 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -1,6 +1,8 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; @@ -11,11 +13,10 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysConfigBo; import org.dromara.system.domain.vo.SysConfigVo; import org.dromara.system.service.ISysConfigService; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; /** @@ -120,7 +121,7 @@ public class SysConfigController extends BaseController { @Log(title = "参数管理", businessType = BusinessType.DELETE) @DeleteMapping("/{configIds}") public R remove(@PathVariable Long[] configIds) { - configService.deleteConfigByIds(configIds); + configService.deleteConfigByIds(Arrays.asList(configIds)); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java index f7efda7af..60863b8d3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -69,7 +69,7 @@ public interface ISysConfigService { * * @param configIds 需要删除的参数ID */ - void deleteConfigByIds(Long[] configIds); + void deleteConfigByIds(List configIds); /** * 重置参数缓存数据 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index d92647c44..ed65ae45c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -2,10 +2,10 @@ package org.dromara.system.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; -import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; @@ -23,12 +23,10 @@ import org.dromara.system.domain.bo.SysConfigBo; import org.dromara.system.domain.vo.SysConfigVo; import org.dromara.system.mapper.SysConfigMapper; import org.dromara.system.service.ISysConfigService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -57,7 +55,6 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService { * @return 参数配置信息 */ @Override - @DS("master") public SysConfigVo selectConfigById(Long configId) { return baseMapper.selectVoById(configId); } @@ -83,14 +80,10 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService { */ @Override public boolean selectRegisterEnabled(String tenantId) { - SysConfig retConfig = TenantHelper.dynamic(tenantId, () -> { - return baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, "sys.account.registerUser")); - }); - if (ObjectUtil.isNull(retConfig)) { - return false; - } - return Convert.toBool(retConfig.getConfigValue()); + String configValue = TenantHelper.dynamic(tenantId, () -> + this.selectConfigByKey("sys.account.registerUser") + ); + return Convert.toBool(configValue); } /** @@ -168,15 +161,15 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService { * @param configIds 需要删除的参数ID */ @Override - public void deleteConfigByIds(Long[] configIds) { - for (Long configId : configIds) { - SysConfig config = baseMapper.selectById(configId); + public void deleteConfigByIds(List configIds) { + List list = baseMapper.selectByIds(configIds); + list.forEach(config -> { if (StringUtils.equals(SystemConstants.YES, config.getConfigType())) { - throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + throw new ServiceException(String.format("内置参数【%s】不能删除", config.getConfigKey())); } CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); - } - baseMapper.deleteByIds(Arrays.asList(configIds)); + }); + baseMapper.deleteByIds(configIds); } /** @@ -195,12 +188,10 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService { */ @Override public boolean checkConfigKeyUnique(SysConfigBo config) { - long configId = ObjectUtils.notNull(config.getConfigId(), -1L); - SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); - if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { - return false; - } - return true; + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, config.getConfigKey()) + .ne(ObjectUtil.isNotNull(config.getConfigId()), SysConfig::getConfigId, config.getConfigId())); + return !exist; } /** From 682d8b00998bcc901f543fbe025b65d4ceb97443 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 27 Jun 2025 01:32:55 +0000 Subject: [PATCH 49/54] =?UTF-8?q?!705=20update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=86=99=E6=B3=95=20*=20update=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=86=E9=A1=B5=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/controller/GenController.java | 17 +++++++---------- .../service/impl/FlwDefinitionServiceImpl.java | 12 ++++-------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java index e3d4c087a..64ea78bac 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/controller/GenController.java @@ -3,21 +3,21 @@ package org.dromara.generator.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.mybatis.helper.DataBaseHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.common.web.core.BaseController; import org.dromara.generator.domain.GenTable; import org.dromara.generator.domain.GenTableColumn; import org.dromara.generator.service.IGenTableService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -80,11 +80,8 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:list") @GetMapping(value = "/column/{tableId}") public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { - TableDataInfo dataInfo = new TableDataInfo<>(); List list = genTableService.selectGenTableColumnListByTableId(tableId); - dataInfo.setRows(list); - dataInfo.setTotal(list.size()); - return dataInfo; + return TableDataInfo.build(list); } /** 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 7936210d0..026f9ae8e 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 @@ -78,10 +78,8 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { LambdaQueryWrapper wrapper = buildQueryWrapper(flowDefinition); wrapper.eq(FlowDefinition::getIsPublish, PublishStatus.PUBLISHED.getKey()); Page page = flowDefinitionMapper.selectPage(pageQuery.build(), wrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); - build.setTotal(page.getTotal()); - return build; + List list = BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class); + return new TableDataInfo<>(list, page.getTotal()); } /** @@ -96,10 +94,8 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService { LambdaQueryWrapper wrapper = buildQueryWrapper(flowDefinition); wrapper.in(FlowDefinition::getIsPublish, Arrays.asList(PublishStatus.UNPUBLISHED.getKey(), PublishStatus.EXPIRED.getKey())); Page page = flowDefinitionMapper.selectPage(pageQuery.build(), wrapper); - TableDataInfo build = TableDataInfo.build(); - build.setRows(BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class)); - build.setTotal(page.getTotal()); - return build; + List list = BeanUtil.copyToList(page.getRecords(), FlowDefinitionVo.class); + return new TableDataInfo<>(list, page.getTotal()); } private LambdaQueryWrapper buildQueryWrapper(FlowDefinition flowDefinition) { From 3f9919fbeea0e3424ad9d6037c292ac1ad170339 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, 27 Jun 2025 10:19:10 +0800 Subject: [PATCH 50/54] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20Redis?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=9B=91=E6=8E=A7=E6=8E=A5=E5=8F=A3=20?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=BD=92=E8=BF=98=E8=BF=9E=E6=8E=A5=E7=BB=99?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=B1=A0=20=E6=8F=90=E9=AB=98=E6=95=88?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/monitor/CacheController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java index 1e9c6558b..5767c8df0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/CacheController.java @@ -6,6 +6,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; import org.redisson.spring.data.connection.RedissonConnectionFactory; import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisConnectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -31,9 +32,9 @@ public class CacheController { @GetMapping() public R getInfo() throws Exception { RedisConnection connection = connectionFactory.getConnection(); - Properties commandStats = connection.commands().info("commandstats"); - - List> pieList = new ArrayList<>(); + try { + Properties commandStats = connection.commands().info("commandstats"); + List> pieList = new ArrayList<>(); if (commandStats != null) { commandStats.stringPropertyNames().forEach(key -> { Map data = new HashMap<>(2); @@ -43,10 +44,13 @@ public class CacheController { pieList.add(data); }); } - return R.ok(new CacheListInfoVo( connection.commands().info(), connection.commands().dbSize(), pieList)); + } finally { + // 归还连接给连接池 + RedisConnectionUtils.releaseConnection(connection, connectionFactory); + } } public record CacheListInfoVo(Properties info, Long dbSize, List> commandStats) {} From 5baf34247886151e1e48064084feed5b23f8851a Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Fri, 27 Jun 2025 05:34:43 +0000 Subject: [PATCH 51/54] =?UTF-8?q?!708=20update=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=B0=8F=E6=94=B9=E5=8A=A8=20*=20update=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E5=B0=8F=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=E6=80=A7=E9=94=99=E8=AF=AF=20*=20up?= =?UTF-8?q?date=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E5=B0=8F=E6=94=B9?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysDictDataController.java | 17 +++++----- .../system/SysDictTypeController.java | 7 ++-- .../system/service/ISysDictDataService.java | 2 +- .../system/service/ISysDictTypeService.java | 2 +- .../service/impl/SysDictDataServiceImpl.java | 33 ++++++++----------- .../service/impl/SysDictTypeServiceImpl.java | 28 ++++++++-------- .../service/impl/SysMenuServiceImpl.java | 9 ++--- 7 files changed, 48 insertions(+), 50 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index 57527511e..6235f8d86 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -2,23 +2,24 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +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.system.domain.bo.SysDictDataBo; import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.service.ISysDictDataService; import org.dromara.system.service.ISysDictTypeService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -117,7 +118,7 @@ public class SysDictDataController extends BaseController { @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictCodes}") public R remove(@PathVariable Long[] dictCodes) { - dictDataService.deleteDictDataByIds(dictCodes); + dictDataService.deleteDictDataByIds(Arrays.asList(dictCodes)); return R.ok(); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index 67c1f5133..4b91e1ba5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -1,6 +1,8 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; @@ -11,11 +13,10 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysDictTypeBo; import org.dromara.system.domain.vo.SysDictTypeVo; import org.dromara.system.service.ISysDictTypeService; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; /** @@ -99,7 +100,7 @@ public class SysDictTypeController extends BaseController { @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictIds}") public R remove(@PathVariable Long[] dictIds) { - dictTypeService.deleteDictTypeByIds(dictIds); + dictTypeService.deleteDictTypeByIds(Arrays.asList(dictIds)); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java index 0e697db60..2ff49bc77 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -47,7 +47,7 @@ public interface ISysDictDataService { * * @param dictCodes 需要删除的字典数据ID */ - void deleteDictDataByIds(Long[] dictCodes); + void deleteDictDataByIds(List dictCodes); /** * 新增保存字典数据信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java index 3b32d6cbb..c2704db09 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -62,7 +62,7 @@ public interface ISysDictTypeService { * * @param dictIds 需要删除的字典ID */ - void deleteDictTypeByIds(Long[] dictIds); + void deleteDictTypeByIds(List dictIds); /** * 重置字典缓存数据 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java index da4394756..baf1bba99 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -4,20 +4,19 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.utils.MapstructUtils; -import org.dromara.common.core.utils.ObjectUtils; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.system.domain.SysDictData; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.domain.SysDictData; import org.dromara.system.domain.bo.SysDictDataBo; import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.mapper.SysDictDataMapper; import org.dromara.system.service.ISysDictDataService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CachePut; import org.springframework.stereotype.Service; @@ -95,12 +94,10 @@ public class SysDictDataServiceImpl implements ISysDictDataService { * @param dictCodes 需要删除的字典数据ID */ @Override - public void deleteDictDataByIds(Long[] dictCodes) { - for (Long dictCode : dictCodes) { - SysDictData data = baseMapper.selectById(dictCode); - baseMapper.deleteById(dictCode); - CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); - } + public void deleteDictDataByIds(List dictCodes) { + List list = baseMapper.selectByIds(dictCodes); + baseMapper.deleteByIds(dictCodes); + list.forEach(x -> CacheUtils.evict(CacheNames.SYS_DICT, x.getDictType())); } /** @@ -145,13 +142,11 @@ public class SysDictDataServiceImpl implements ISysDictDataService { */ @Override public boolean checkDictDataUnique(SysDictDataBo dict) { - Long dictCode = ObjectUtils.notNull(dict.getDictCode(), -1L); - SysDictData entity = baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dict.getDictType()).eq(SysDictData::getDictValue, dict.getDictValue())); - if (ObjectUtil.isNotNull(entity) && !dictCode.equals(entity.getDictCode())) { - return false; - } - return true; + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dict.getDictType()) + .eq(SysDictData::getDictValue, dict.getDictValue()) + .ne(ObjectUtil.isNotNull(dict.getDictCode()), SysDictData::getDictCode, dict.getDictCode())); + return !exist; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index c417b42ca..3491e887e 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 @@ -98,10 +98,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public List selectDictDataByType(String dictType) { List dictDatas = dictDataMapper.selectDictDataByType(dictType); - if (CollUtil.isNotEmpty(dictDatas)) { - return dictDatas; - } - return null; + return CollUtil.isNotEmpty(dictDatas) ? dictDatas : null; } /** @@ -133,17 +130,20 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService * @param dictIds 需要删除的字典ID */ @Override - public void deleteDictTypeByIds(Long[] dictIds) { - for (Long dictId : dictIds) { - SysDictType dictType = baseMapper.selectById(dictId); - if (dictDataMapper.exists(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dictType.getDictType()))) { - throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + public void deleteDictTypeByIds(List dictIds) { + List list = baseMapper.selectByIds(dictIds); + list.forEach(x -> { + boolean assigned = dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, x.getDictType())); + if (assigned) { + throw new ServiceException(String.format("%1$s已分配,不能删除", x.getDictName())); } - CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); - CacheUtils.evict(CacheNames.SYS_DICT_TYPE, dictType.getDictType()); - } - baseMapper.deleteByIds(Arrays.asList(dictIds)); + }); + baseMapper.deleteByIds(dictIds); + list.forEach(x -> { + CacheUtils.evict(CacheNames.SYS_DICT, x.getDictType()); + CacheUtils.evict(CacheNames.SYS_DICT_TYPE, x.getDictType()); + }); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 692b3ce00..10c3a9aeb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; @@ -142,7 +143,7 @@ public class SysMenuServiceImpl implements ISysMenuService { } else { menus = baseMapper.selectMenuTreeByUserId(userId); } - return getChildPerms(menus, 0); + return getChildPerms(menus, Constants.TOP_PARENT_ID); } /** @@ -221,7 +222,7 @@ public class SysMenuServiceImpl implements ISysMenuService { children.setQuery(menu.getQueryParam()); childrenList.add(children); router.setChildren(childrenList); - } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { + } else if (menu.getParentId().equals(Constants.TOP_PARENT_ID) && menu.isInnerLink()) { router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setPath("/"); List childrenList = new ArrayList<>(); @@ -375,11 +376,11 @@ public class SysMenuServiceImpl implements ISysMenuService { * @param parentId 传入的父节点ID * @return String */ - private List getChildPerms(List list, int parentId) { + private List getChildPerms(List list, Long parentId) { List returnList = new ArrayList<>(); for (SysMenu t : list) { // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 - if (t.getParentId() == parentId) { + if (t.getParentId().equals(parentId)) { recursionFn(list, t); returnList.add(t); } From 60aca2eef35027b7343f7151273286a91024f2a0 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Mon, 30 Jun 2025 01:42:51 +0000 Subject: [PATCH 52/54] =?UTF-8?q?!710=20update=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=96=B0=E7=89=88=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=20*=20up?= =?UTF-8?q?date=20=E4=BD=BF=E7=94=A8=E6=96=B0=E7=89=88=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/mapper/SysDeptMapper.java | 14 ++++++--- .../dromara/system/mapper/SysPostMapper.java | 6 ++-- .../system/mapper/SysRoleMenuMapper.java | 5 ++- .../dromara/system/mapper/SysUserMapper.java | 18 ++++++++--- .../resources/mapper/system/SysDeptMapper.xml | 26 ---------------- .../resources/mapper/system/SysPostMapper.xml | 11 ------- .../resources/mapper/system/SysUserMapper.xml | 31 ------------------- .../workflow/mapper/FlwCategoryMapper.java | 4 ++- .../mapper/workflow/FlwCategoryMapper.xml | 4 --- 9 files changed, 31 insertions(+), 88 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index b69624cf0..e29942058 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -2,7 +2,6 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; @@ -30,18 +29,23 @@ public interface SysDeptMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id") }) - List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + default List selectDeptList(Wrapper queryWrapper) { + return this.selectVoList(queryWrapper); + } /** * 分页查询部门管理数据 * + * @param page 分页信息 * @param queryWrapper 查询条件 * @return 部门信息集合 */ @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), }) - Page selectPageDeptList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectPageDeptList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } /** * 统计指定部门ID的部门数量 @@ -52,7 +56,9 @@ public interface SysDeptMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id") }) - long countDeptById(Long deptId); + default long countDeptById(Long deptId) { + return this.selectCount(new LambdaQueryWrapper().eq(SysDept::getDeptId, deptId)); + } /** * 根据父部门ID查询其所有子部门的列表 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index 60da074c7..dfe9f2c2f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -1,9 +1,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -30,7 +28,9 @@ public interface SysPostMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "create_by") }) - Page selectPagePostList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectPagePostList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } /** * 查询用户所属岗位组 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java index d754303d3..8aa9dd3ea 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -16,12 +16,11 @@ public interface SysRoleMenuMapper extends BaseMapperPlus menuIds) { - LambdaUpdateWrapper lqw = new LambdaUpdateWrapper() - .in(SysRoleMenu::getMenuId, menuIds); - return this.delete(lqw); + return this.delete(new LambdaUpdateWrapper().in(SysRoleMenu::getMenuId, menuIds)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index 46695aa4c..ddea2e2ac 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -1,6 +1,7 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; @@ -28,10 +29,12 @@ public interface SysUserMapper extends BaseMapperPlus { * @return 分页的用户信息 */ @DataPermission({ - @DataColumn(key = "deptName", value = "u.dept_id"), - @DataColumn(key = "userName", value = "u.user_id") + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") }) - Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + default Page selectPageUserList(Page page, Wrapper queryWrapper) { + return this.selectVoPage(page, queryWrapper); + } /** * 查询用户列表,并进行数据权限控制 @@ -43,7 +46,9 @@ public interface SysUserMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + default List selectUserList(Wrapper queryWrapper) { + return this.selectVoList(queryWrapper); + } /** * 根据条件分页查询用户列表 @@ -60,6 +65,7 @@ public interface SysUserMapper extends BaseMapperPlus { /** * 根据条件分页查询已配用户角色列表 * + * @param page 分页信息 * @param queryWrapper 查询条件 * @return 用户信息集合信息 */ @@ -91,7 +97,9 @@ public interface SysUserMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - long countUserById(Long userId); + default long countUserById(Long userId) { + return this.selectCount(new LambdaQueryWrapper().eq(SysUser::getUserId, userId)); + } /** * 根据条件更新用户数据 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 9057a0e22..6c5d89d92 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -7,32 +7,6 @@ - - - - - - - select - - ${ew.getSqlSelect} - - - * - - from sys_post ${ew.getCustomSqlSegment} - - - select - - ${ew.getSqlSelect} - - - u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, - u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark - - from sys_user u - ${ew.getCustomSqlSegment} - - - - - - - diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java index d2c0b3a4d..4a59f258a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwCategoryMapper.java @@ -29,7 +29,9 @@ public interface FlwCategoryMapper extends BaseMapperPlus().eq(FlowCategory::getCategoryId, categoryId)); + } /** * 根据父流程分类ID查询其所有子流程分类的列表 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml index e9918f1f2..10c948d85 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwCategoryMapper.xml @@ -4,8 +4,4 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - From 3002585e630b8a53ba69dc9381f75c4feec6a633 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, 30 Jun 2025 16:31:58 +0800 Subject: [PATCH 53/54] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E6=BC=8F=E6=94=B9?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) 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 2cfe7b30a..d673a2159 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 @@ -69,15 +69,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService { */ @Override public List selectUserExportList(SysUserBo user) { - return baseMapper.selectUserExportList(this.buildQueryWrapper(user)); - } - - private Wrapper buildQueryWrapper(SysUserBo user) { Map params = user.getParams(); 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()) .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName()) .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) @@ -90,8 +84,29 @@ public class SysUserServiceImpl implements ISysUserService, UserService { ids.add(user.getDeptId()); w.in("u.dept_id", ids); }).orderByAsc("u.user_id"); + return baseMapper.selectUserExportList(wrapper); + } + + private Wrapper buildQueryWrapper(SysUserBo user) { + Map params = user.getParams(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SysUser::getDelFlag, SystemConstants.NORMAL) + .eq(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()) + .in(StringUtils.isNotBlank(user.getUserIds()), SysUser::getUserId, StringUtils.splitTo(user.getUserIds(), Convert::toLong)) + .like(StringUtils.isNotBlank(user.getUserName()), SysUser::getUserName, user.getUserName()) + .like(StringUtils.isNotBlank(user.getNickName()), SysUser::getNickName, user.getNickName()) + .eq(StringUtils.isNotBlank(user.getStatus()), SysUser::getStatus, user.getStatus()) + .like(StringUtils.isNotBlank(user.getPhonenumber()), SysUser::getPhonenumber, user.getPhonenumber()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + SysUser::getCreateTime, params.get("beginTime"), params.get("endTime")) + .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { + List deptList = deptMapper.selectListByParentId(user.getDeptId()); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(user.getDeptId()); + w.in(SysUser::getDeptId, ids); + }).orderByAsc(SysUser::getUserId); if (StringUtils.isNotBlank(user.getExcludeUserIds())) { - wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong)); + wrapper.notIn(SysUser::getUserId, StringUtils.splitList(user.getExcludeUserIds())); } return wrapper; } From d501e825419dff398f723492c3500ade8907b44d 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, 1 Jul 2025 09:11:10 +0800 Subject: [PATCH 54/54] =?UTF-8?q?=F0=9F=90=B3=F0=9F=90=B3=F0=9F=90=B3?= =?UTF-8?q?=E5=8F=91=E5=B8=83=205.4.1=20=E5=B0=8F=E6=AD=A5=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= 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 7b68f1dd3..beaf7c8fb 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 80474893b..10116af1e 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 343f6e1c1..38ab7745f 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 5d6dc9c0a..bd86ca5e6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.4.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.4.1-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.4-blue.svg)]() [![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() [![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]() diff --git a/pom.xml b/pom.xml index 5d5fe84ca..f8dab42db 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ Dromara RuoYi-Vue-Plus多租户管理系统 - 5.4.0 + 5.4.1 3.4.7 UTF-8 UTF-8 diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index e4f9d30dc..474ce28e2 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 5.4.0 + 5.4.1 diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index 20529dd6c..98be9e149 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -99,7 +99,7 @@ services: network_mode: "host" ruoyi-server1: - image: ruoyi/ruoyi-server:5.4.0 + image: ruoyi/ruoyi-server:5.4.1 container_name: ruoyi-server1 environment: # 时区上海 @@ -115,7 +115,7 @@ services: network_mode: "host" ruoyi-server2: - image: ruoyi/ruoyi-server:5.4.0 + image: ruoyi/ruoyi-server:5.4.1 container_name: ruoyi-server2 environment: # 时区上海 @@ -131,7 +131,7 @@ services: network_mode: "host" ruoyi-monitor-admin: - image: ruoyi/ruoyi-monitor-admin:5.4.0 + image: ruoyi/ruoyi-monitor-admin:5.4.1 container_name: ruoyi-monitor-admin environment: # 时区上海 @@ -143,7 +143,7 @@ services: network_mode: "host" ruoyi-snailjob-server: - image: ruoyi/ruoyi-snailjob-server:5.4.0 + image: ruoyi/ruoyi-snailjob-server:5.4.1 container_name: ruoyi-snailjob-server environment: # 时区上海