!182 发布 2.2.0

Merge pull request !182 from 疯狂的狮子Li/dev
This commit is contained in:
疯狂的狮子Li
2024-07-09 02:00:21 +00:00
committed by Gitee
60 changed files with 457 additions and 170 deletions

View File

@@ -100,8 +100,8 @@ spring:
redis:
host: localhost
port: 6379
# 密码(如没有密码请注释掉)
# password:
# redis 密码必须配置
password: ruoyi123
database: 0
timeout: 10s
ssl.enabled: false

View File

@@ -92,6 +92,8 @@ spring:
server-addr: ${spring.cloud.nacos.server-addr}
dataId: sentinel-${spring.application.name}.json
groupId: ${spring.cloud.nacos.config.group}
username: ${spring.cloud.nacos.username}
password: ${spring.cloud.nacos.password}
namespace: ${spring.profiles.active}
data-type: json
rule-type: gw-flow

View File

@@ -1,6 +1,6 @@
FROM rabbitmq:3.13.3-management
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
ADD ./rabbitmq_delayed_message_exchange-3.13.0.ez /plugins

View File

@@ -13,7 +13,7 @@
<description>RuoYi-Cloud-Plus微服务系统</description>
<properties>
<revision>2.2.0-BETA2</revision>
<revision>2.2.0</revision>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>

View File

@@ -15,7 +15,7 @@
</description>
<properties>
<revision>2.2.0-BETA2</revision>
<revision>2.2.0</revision>
</properties>
<dependencyManagement>

View File

@@ -20,6 +20,7 @@ public class RemoteFileServiceMock implements RemoteFileService {
* @param file 文件信息
* @return 结果
*/
@Override
public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) {
log.warn("服务调用异常 -> 降级处理");
return null;
@@ -31,11 +32,18 @@ public class RemoteFileServiceMock implements RemoteFileService {
* @param ossIds ossId串逗号分隔
* @return url串逗号分隔
*/
@Override
public String selectUrlByIds(String ossIds) {
log.warn("服务调用异常 -> 降级处理");
return StringUtils.EMPTY;
}
/**
* 通过ossId查询列表
*
* @param ossIds ossId串逗号分隔
* @return 列表
*/
@Override
public List<RemoteFile> selectByIds(String ossIds) {
log.warn("服务调用异常 -> 降级处理");

View File

@@ -15,5 +15,10 @@ public interface RemoteMessageService {
*/
void publishMessage(Long sessionKey, String message);
/**
* 发布订阅的消息(群发)
*
* @param message 消息内容
*/
void publishAll(String message);
}

View File

@@ -20,6 +20,7 @@ public class RemoteMessageServiceStub implements RemoteMessageService {
* @param sessionKey session主键 一般为用户id
* @param message 消息文本
*/
@Override
public void publishMessage(Long sessionKey, String message) {
try {
remoteMessageService.publishMessage(sessionKey, message);
@@ -28,6 +29,12 @@ public class RemoteMessageServiceStub implements RemoteMessageService {
}
}
/**
* 发布订阅的消息(群发)
*
* @param message 消息内容
*/
@Override
public void publishAll(String message) {
try {
remoteMessageService.publishAll(message);

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/auth/logs \
/ruoyi/auth/temp \
@@ -9,6 +11,10 @@ RUN mkdir -p /ruoyi/auth/logs \
WORKDIR /ruoyi/auth
# 补全alpine镜像缺失字体问题
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
ENV SERVER_PORT=9210 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}

View File

@@ -14,8 +14,8 @@ import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.auth.domain.vo.LoginVo;
import org.dromara.auth.form.SocialLoginBody;
import org.dromara.auth.service.IAuthStrategy;
import org.dromara.auth.service.SysLoginService;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper;
@@ -43,7 +43,6 @@ import java.util.Optional;
public class SocialAuthStrategy implements IAuthStrategy {
private final SocialProperties socialProperties;
private final SysLoginService loginService;
@DubboReference
private RemoteSocialService remoteSocialService;
@@ -83,7 +82,7 @@ public class SocialAuthStrategy implements IAuthStrategy {
}
RemoteSocialVo socialVo;
if (TenantHelper.isEnable()) {
Optional<RemoteSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
Optional<RemoteSocialVo> opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId()));
if (opt.isEmpty()) {
throw new ServiceException("对不起,你没有权限登录当前租户!");
}

View File

@@ -14,7 +14,7 @@
</description>
<properties>
<revision>2.2.0-BETA2</revision>
<revision>2.2.0</revision>
<spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
<sentinel.version>1.8.8</sentinel.version>
<seata.version>1.7.1</seata.version>

View File

@@ -14,7 +14,7 @@
</description>
<properties>
<revision>2.2.0-BETA2</revision>
<revision>2.2.0</revision>
</properties>
<dependencyManagement>
@@ -40,6 +40,7 @@
<version>${revision}</version>
</dependency>
<!-- 权限认证服务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-satoken</artifactId>
@@ -88,91 +89,105 @@
<version>${revision}</version>
</dependency>
<!-- 定时任务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-job</artifactId>
<version>${revision}</version>
</dependency>
<!-- RPC服务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-dubbo</artifactId>
<version>${revision}</version>
</dependency>
<!-- 分布式事务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-seata</artifactId>
<version>${revision}</version>
</dependency>
<!-- 自定义负载均衡 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-loadbalancer</artifactId>
<version>${revision}</version>
</dependency>
<!-- oss服务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-oss</artifactId>
<version>${revision}</version>
</dependency>
<!-- 限流 -->
<!-- 限流功能 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ratelimiter</artifactId>
<version>${revision}</version>
</dependency>
<!-- 幂等功能 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-idempotent</artifactId>
<version>${revision}</version>
</dependency>
<!-- 邮件模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mail</artifactId>
<version>${revision}</version>
</dependency>
<!-- 短信模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-sms</artifactId>
<version>${revision}</version>
</dependency>
<!-- logstash日志推送模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-logstash</artifactId>
<version>${revision}</version>
</dependency>
<!-- ES搜索引擎服务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-elasticsearch</artifactId>
<version>${revision}</version>
</dependency>
<!-- 限流模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-sentinel</artifactId>
<version>${revision}</version>
</dependency>
<!-- skywalking日志收集模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-skylog</artifactId>
<version>${revision}</version>
</dependency>
<!-- prometheus监控 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-prometheus</artifactId>
<version>${revision}</version>
</dependency>
<!-- 通用翻译功能 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-translation</artifactId>
@@ -193,6 +208,7 @@
<version>${revision}</version>
</dependency>
<!-- 数据加解密模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-encrypt</artifactId>
@@ -206,24 +222,28 @@
<version>${revision}</version>
</dependency>
<!-- websocket模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-websocket</artifactId>
<version>${revision}</version>
</dependency>
<!-- 授权认证 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-social</artifactId>
<version>${revision}</version>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-nacos</artifactId>
<version>${revision}</version>
</dependency>
<!-- 消息总线模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-bus</artifactId>

View File

@@ -12,7 +12,7 @@
<artifactId>ruoyi-common-bus</artifactId>
<description>
ruoyi-common-bus 模块
ruoyi-common-bus 消息总线模块
</description>
<dependencies>
@@ -25,6 +25,11 @@
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-bus-kafka</artifactId>-->
<!-- </dependency>-->
<!-- rocketmq -->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-bus-rocketmq</artifactId>-->
<!-- </dependency>-->
</dependencies>
</project>

View File

@@ -34,6 +34,34 @@ public class StreamUtils {
return collection.stream().filter(function).collect(Collectors.toList());
}
/**
* 找到流中满足条件的第一个元素
*
* @param collection 需要查询的集合
* @param function 过滤方法
* @return 找到符合条件的第一个元素没有则返回null
*/
public static <E> E findFirst(Collection<E> collection, Predicate<E> function) {
if (CollUtil.isEmpty(collection)) {
return null;
}
return collection.stream().filter(function).findFirst().orElse(null);
}
/**
* 找到流中任意一个满足条件的元素
*
* @param collection 需要查询的集合
* @param function 过滤方法
* @return 找到符合条件的任意一个元素没有则返回null
*/
public static <E> Optional<E> findAny(Collection<E> collection, Predicate<E> function) {
if (CollUtil.isEmpty(collection)) {
return Optional.empty();
}
return collection.stream().filter(function).findAny();
}
/**
* 将collection拼接
*

View File

@@ -18,6 +18,13 @@ public class ValidatorUtils {
private static final Validator VALID = SpringUtils.getBean(Validator.class);
/**
* 对给定对象进行参数校验,并根据指定的校验组进行校验
*
* @param object 要进行校验的对象
* @param groups 校验组
* @throws ConstraintViolationException 如果校验不通过,则抛出参数校验异常
*/
public static <T> void validate(T object, Class<?>... groups) {
Set<ConstraintViolation<T>> validate = VALID.validate(object, groups);
if (!validate.isEmpty()) {

View File

@@ -12,7 +12,7 @@
<artifactId>ruoyi-common-dubbo</artifactId>
<description>
ruoyi-common-dubbo
ruoyi-common-dubbo RPC服务
</description>
<dependencies>

View File

@@ -7,10 +7,10 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import java.io.IOException;
import java.util.ArrayList;
@@ -30,6 +30,13 @@ public class JsonUtils {
return OBJECT_MAPPER;
}
/**
* 将对象转换为JSON格式的字符串
*
* @param object 要转换的对象
* @return JSON格式的字符串如果对象为null则返回null
* @throws RuntimeException 如果转换过程中发生JSON处理异常则抛出运行时异常
*/
public static String toJsonString(Object object) {
if (ObjectUtil.isNull(object)) {
return null;
@@ -41,6 +48,15 @@ public class JsonUtils {
}
}
/**
* 将JSON格式的字符串转换为指定类型的对象
*
* @param text JSON格式的字符串
* @param clazz 要转换的目标对象类型
* @param <T> 目标对象的泛型类型
* @return 转换后的对象如果字符串为空则返回null
* @throws RuntimeException 如果转换过程中发生IO异常则抛出运行时异常
*/
public static <T> T parseObject(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text)) {
return null;
@@ -52,6 +68,15 @@ public class JsonUtils {
}
}
/**
* 将字节数组转换为指定类型的对象
*
* @param bytes 字节数组
* @param clazz 要转换的目标对象类型
* @param <T> 目标对象的泛型类型
* @return 转换后的对象如果字节数组为空则返回null
* @throws RuntimeException 如果转换过程中发生IO异常则抛出运行时异常
*/
public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
if (ArrayUtil.isEmpty(bytes)) {
return null;
@@ -63,6 +88,15 @@ public class JsonUtils {
}
}
/**
* 将JSON格式的字符串转换为指定类型的对象支持复杂类型
*
* @param text JSON格式的字符串
* @param typeReference 指定类型的TypeReference对象
* @param <T> 目标对象的泛型类型
* @return 转换后的对象如果字符串为空则返回null
* @throws RuntimeException 如果转换过程中发生IO异常则抛出运行时异常
*/
public static <T> T parseObject(String text, TypeReference<T> typeReference) {
if (StringUtils.isBlank(text)) {
return null;
@@ -74,6 +108,13 @@ public class JsonUtils {
}
}
/**
* 将JSON格式的字符串转换为Dict对象
*
* @param text JSON格式的字符串
* @return 转换后的Dict对象如果字符串为空或者不是JSON格式则返回null
* @throws RuntimeException 如果转换过程中发生IO异常则抛出运行时异常
*/
public static Dict parseMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
@@ -88,6 +129,13 @@ public class JsonUtils {
}
}
/**
* 将JSON格式的字符串转换为Dict对象的列表
*
* @param text JSON格式的字符串
* @return 转换后的Dict对象的列表如果字符串为空则返回null
* @throws RuntimeException 如果转换过程中发生IO异常则抛出运行时异常
*/
public static List<Dict> parseArrayMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
@@ -99,6 +147,15 @@ public class JsonUtils {
}
}
/**
* 将JSON格式的字符串转换为指定类型对象的列表
*
* @param text JSON格式的字符串
* @param clazz 要转换的目标对象类型
* @param <T> 目标对象的泛型类型
* @return 转换后的对象的列表,如果字符串为空则返回空列表
* @throws RuntimeException 如果转换过程中发生IO异常则抛出运行时异常
*/
public static <T> List<T> parseArray(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text)) {
return new ArrayList<>();

View File

@@ -1,37 +0,0 @@
package org.dromara.common.mail.config;
import org.dromara.common.mail.config.properties.MailProperties;
import org.dromara.common.mail.utils.MailAccount;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
/**
* JavaMail 配置
*
* @author Michelle.Chung
*/
@AutoConfiguration
@EnableConfigurationProperties(MailProperties.class)
public class MailConfig {
@Bean
@ConditionalOnProperty(value = "mail.enabled", havingValue = "true")
public MailAccount mailAccount(MailProperties mailProperties) {
MailAccount account = new MailAccount();
account.setHost(mailProperties.getHost());
account.setPort(mailProperties.getPort());
account.setAuth(mailProperties.getAuth());
account.setFrom(mailProperties.getFrom());
account.setUser(mailProperties.getUser());
account.setPass(mailProperties.getPass());
account.setSocketFactoryPort(mailProperties.getPort());
account.setStarttlsEnable(mailProperties.getStarttlsEnable());
account.setSslEnable(mailProperties.getSslEnable());
account.setTimeout(mailProperties.getTimeout());
account.setConnectionTimeout(mailProperties.getConnectionTimeout());
return account;
}
}

View File

@@ -11,7 +11,7 @@
<artifactId>ruoyi-common-nacos</artifactId>
<description>
ruoyi-common-nacos
ruoyi-common-nacos 配置中心
</description>
<dependencies>

View File

@@ -65,6 +65,12 @@ public class RedisUtils {
consumer.accept(msg);
}
/**
* 发布消息到指定的频道
*
* @param channelKey 通道key
* @param msg 发送数据
*/
public static <T> void publish(String channelKey, T msg) {
RTopic topic = CLIENT.getTopic(channelKey);
topic.publish(msg);

View File

@@ -12,7 +12,7 @@
<artifactId>ruoyi-common-satoken</artifactId>
<description>
ruoyi-common-satoken
ruoyi-common-satoken 权限认证服务
</description>
<dependencies>

View File

@@ -193,7 +193,11 @@ public class LoginHelper {
* @return 结果
*/
public static boolean isLogin() {
return getLoginUser() != null;
try {
return getLoginUser() != null;
} catch (Exception e) {
return false;
}
}
}

View File

@@ -16,15 +16,12 @@ import org.springframework.core.task.VirtualThreadTaskExecutor;
@AutoConfiguration
public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
/**
* 设置 Undertow 的 websocket 缓冲池
*/
@Override
public void customize(UndertowServletWebServerFactory factory) {
// 默认不直接分配内存 如果项目中使用了 websocket 建议直接分配
factory.addDeploymentInfoCustomizers(deploymentInfo -> {
WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 512));
webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 1024));
deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
// 使用虚拟线程
if (SpringUtils.isVirtual()) {

View File

@@ -1,5 +1,6 @@
package org.dromara.common.websocket.interceptor;
import cn.dev33.satoken.exception.NotLoginException;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.model.LoginUser;
@@ -31,9 +32,14 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
*/
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
LoginUser loginUser = LoginHelper.getLoginUser();
attributes.put(LOGIN_USER_KEY, loginUser);
return true;
try {
LoginUser loginUser = LoginHelper.getLoginUser();
attributes.put(LOGIN_USER_KEY, loginUser);
return true;
} catch (NotLoginException e) {
log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());
return false;
}
}
/**

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/gateway/logs \
/ruoyi/gateway/temp \

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/gen/logs

View File

@@ -21,33 +21,53 @@ public interface I${ClassName}Service {
/**
* 查询${functionName}
*
* @param ${pkColumn.javaField} 主键
* @return ${functionName}
*/
${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField});
#if($table.crud)
/**
* 查询${functionName}列表
* 分页查询${functionName}列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return ${functionName}分页列表
*/
TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery);
#end
/**
* 查询${functionName}列表
* 查询符合条件的${functionName}列表
*
* @param bo 查询条件
* @return ${functionName}列表
*/
List<${ClassName}Vo> queryList(${ClassName}Bo bo);
/**
* 新增${functionName}
*
* @param bo ${functionName}
* @return 是否新增成功
*/
Boolean insertByBo(${ClassName}Bo bo);
/**
* 修改${functionName}
*
* @param bo ${functionName}
* @return 是否修改成功
*/
Boolean updateByBo(${ClassName}Bo bo);
/**
* 校验并批量删除${functionName}信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid);
}

View File

@@ -35,6 +35,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
/**
* 查询${functionName}
*
* @param ${pkColumn.javaField} 主键
* @return ${functionName}
*/
@Override
public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){
@@ -43,7 +46,11 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
#if($table.crud)
/**
* 查询${functionName}列表
* 分页查询${functionName}列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return ${functionName}分页列表
*/
@Override
public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) {
@@ -54,7 +61,10 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
#end
/**
* 查询${functionName}列表
* 查询符合条件的${functionName}列表
*
* @param bo 查询条件
* @return ${functionName}列表
*/
@Override
public List<${ClassName}Vo> queryList(${ClassName}Bo bo) {
@@ -91,6 +101,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
/**
* 新增${functionName}
*
* @param bo ${functionName}
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(${ClassName}Bo bo) {
@@ -106,6 +119,9 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
/**
* 修改${functionName}
*
* @param bo ${functionName}
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(${ClassName}Bo bo) {
@@ -122,7 +138,11 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
}
/**
* 批量删除${functionName}
* 校验并批量删除${functionName}信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<${pkColumn.javaType}> ids, Boolean isValid) {

View File

@@ -1,6 +1,6 @@
export interface ${BusinessName}VO {
#foreach ($column in $columns)
#if($column.insert || $column.edit)
#if($column.list)
/**
* $column.columnComment
*/
@@ -35,6 +35,7 @@ export interface ${BusinessName}Form extends BaseEntity {
}
export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{
#foreach ($column in $columns)
#if($column.query)
/**
@@ -47,4 +48,11 @@ export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{
#end
#end
#end
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/job/logs \
/ruoyi/job/temp \

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/resource/logs \
/ruoyi/resource/temp \

View File

@@ -81,6 +81,7 @@ public class RemoteFileServiceImpl implements RemoteFileService {
* @param ossIds ossId串逗号分隔
* @return 列表
*/
@Override
public List<RemoteFile> selectByIds(String ossIds){
List<SysOssVo> sysOssVos = sysOssService.listByIds(StringUtils.splitTo(ossIds, Convert::toLong));
return MapstructUtils.convert(sysOssVos, RemoteFile.class);

View File

@@ -26,6 +26,7 @@ public class RemoteMailServiceImpl implements RemoteMailService {
* @param subject 标题
* @param text 内容
*/
@Override
public void send(String to, String subject, String text) throws ServiceException {
MailUtils.sendText(to, subject, text);
}

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/system/logs \
/ruoyi/system/temp \

View File

@@ -75,8 +75,6 @@ public class SysDeptController extends BaseController {
public R<Void> add(@Validated @RequestBody SysDeptBo dept) {
if (!deptService.checkDeptNameUnique(dept)) {
return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
} else if (StringUtils.isNotBlank(dept.getDeptCategory()) && !deptService.checkDeptCategoryUnique(dept)) {
return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门类别编码已存在");
}
return toAjax(deptService.insertDept(dept));
}
@@ -92,8 +90,6 @@ public class SysDeptController extends BaseController {
deptService.checkDeptDataScope(deptId);
if (!deptService.checkDeptNameUnique(dept)) {
return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
} else if (StringUtils.isNotBlank(dept.getDeptCategory()) && !deptService.checkDeptCategoryUnique(dept)) {
return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门类别编码已存在");
} else if (dept.getParentId().equals(deptId)) {
return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
} else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())) {

View File

@@ -103,6 +103,11 @@ public class SysUserBo extends BaseEntity {
*/
private Long roleId;
/**
* 排除不查询的用户(工作流用)
*/
private String excludeUserIds;
public SysUserBo(Long userId) {
this.userId = userId;
}

View File

@@ -18,6 +18,12 @@ public class RemoteDeptServiceImpl implements RemoteDeptService {
private final ISysDeptService sysDeptService;
/**
* 通过部门ID查询部门名称
*
* @param deptIds 部门ID串逗号分隔
* @return 部门名称串逗号分隔
*/
@Override
public String selectDeptNameByIds(String deptIds) {
return sysDeptService.selectDeptNameByIds(deptIds);

View File

@@ -23,7 +23,12 @@ public class RemoteDictServiceImpl implements RemoteDictService {
private final ISysDictTypeService sysDictTypeService;
/**
* 根据字典类型查询字典数据
*
* @param dictType 字典类型
* @return 字典数据集合信息
*/
@Override
public List<RemoteDictDataVo> selectDictDataByType(String dictType) {
List<SysDictDataVo> list = sysDictTypeService.selectDictDataByType(dictType);

View File

@@ -26,6 +26,11 @@ public class RemoteLogServiceImpl implements RemoteLogService {
private final ISysOperLogService operLogService;
private final ISysLogininforService logininforService;
/**
* 保存系统日志
*
* @param remoteOperLogBo 日志实体
*/
@Async
@Override
public void saveLog(RemoteOperLogBo remoteOperLogBo) {
@@ -33,6 +38,11 @@ public class RemoteLogServiceImpl implements RemoteLogService {
operLogService.insertOperlog(sysOperLogBo);
}
/**
* 保存访问记录
*
* @param remoteLogininforBo 访问实体
*/
@Async
@Override
public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) {

View File

@@ -26,7 +26,10 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
private final ISysSocialService sysSocialService;
/**
* 根据 authId 查询用户信息
* 根据 authId 查询用户授权信息
*
* @param authId 认证id
* @return 授权信息
*/
@Override
public List<RemoteSocialVo> selectByAuthId(String authId) {
@@ -34,6 +37,11 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
return MapstructUtils.convert(list, RemoteSocialVo.class);
}
/**
* 查询列表
*
* @param bo 社会化关系业务对象
*/
@Override
public List<RemoteSocialVo> queryList(RemoteSocialBo bo) {
SysSocialBo params = MapstructUtils.convert(bo, SysSocialBo.class);
@@ -43,6 +51,8 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
/**
* 保存社会化关系
*
* @param bo 社会化关系业务对象
*/
@Override
public void insertByBo(RemoteSocialBo bo) {
@@ -51,6 +61,8 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
/**
* 更新社会化关系
*
* @param bo 社会化关系业务对象
*/
@Override
public void updateByBo(RemoteSocialBo bo) {
@@ -59,6 +71,9 @@ public class RemoteSocialServiceImpl implements RemoteSocialService {
/**
* 删除社会化关系
*
* @param socialId 社会化关系ID
* @return 结果
*/
@Override
public Boolean deleteWithValidById(Long socialId) {

View File

@@ -46,6 +46,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
private final ISysDeptService deptService;
private final SysUserMapper userMapper;
/**
* 通过用户名查询用户信息
*
* @param username 用户名
* @param tenantId 租户id
* @return 结果
*/
@Override
public LoginUser getUserInfo(String username, String tenantId) throws UserException {
return TenantHelper.dynamic(tenantId, () -> {
@@ -62,6 +69,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
});
}
/**
* 通过用户id查询用户信息
*
* @param userId 用户id
* @param tenantId 租户id
* @return 结果
*/
@Override
public LoginUser getUserInfo(Long userId, String tenantId) throws UserException {
return TenantHelper.dynamic(tenantId, () -> {
@@ -78,6 +92,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
});
}
/**
* 通过手机号查询用户信息
*
* @param phonenumber 手机号
* @param tenantId 租户id
* @return 结果
*/
@Override
public LoginUser getUserInfoByPhonenumber(String phonenumber, String tenantId) throws UserException {
return TenantHelper.dynamic(tenantId, () -> {
@@ -94,6 +115,13 @@ public class RemoteUserServiceImpl implements RemoteUserService {
});
}
/**
* 通过邮箱查询用户信息
*
* @param email 邮箱
* @param tenantId 租户id
* @return 结果
*/
@Override
public LoginUser getUserInfoByEmail(String email, String tenantId) throws UserException {
return TenantHelper.dynamic(tenantId, () -> {
@@ -110,6 +138,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
});
}
/**
* 通过openid查询用户信息
*
* @param openid openid
* @return 结果
*/
@Override
public XcxLoginUser getUserInfoByOpenid(String openid) throws UserException {
// todo 自行实现 userService.selectUserByOpenid(openid);
@@ -131,6 +165,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
return loginUser;
}
/**
* 注册用户信息
*
* @param remoteUserBo 用户信息
* @return 结果
*/
@Override
public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException {
SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class);
@@ -219,7 +259,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId()));
TenantHelper.dynamic(userVo.getTenantId(), () -> {
SysDeptVo dept = null;
if (ObjectUtil.isNotNull(userVo.getUserId())) {
if (ObjectUtil.isNotNull(userVo.getDeptId())) {
dept = deptService.selectDeptById(userVo.getDeptId());
}
loginUser.setDeptName(ObjectUtil.isNull(dept) ? "" : dept.getDeptName());
@@ -246,12 +286,24 @@ public class RemoteUserServiceImpl implements RemoteUserService {
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
}
/**
* 通过用户ID查询用户列表
*
* @param userIds 用户ids
* @return 用户列表
*/
@Override
public List<RemoteUserVo> selectListByIds(List<Long> userIds) {
List<SysUserVo> sysUserVos = userService.selectUserByIds(userIds, null);
return MapstructUtils.convert(sysUserVos, RemoteUserVo.class);
}
/**
* 通过角色ID查询用户ID
*
* @param roleIds 角色ids
* @return 用户ids
*/
@Override
public List<Long> selectUserIdsByRoleIds(List<Long> roleIds) {
return userService.selectUserIdsByRoleIds(roleIds);

View File

@@ -100,13 +100,6 @@ public interface ISysDeptService {
*/
boolean checkDeptNameUnique(SysDeptBo dept);
/**
* 校验部门类别编码是否唯一
*
* @param dept 部门信息
* @return 结果
*/
boolean checkDeptCategoryUnique(SysDeptBo dept);
/**
* 校验部门是否有数据权限

View File

@@ -12,45 +12,60 @@ import java.util.List;
*/
public interface ISysSocialService {
/**
* 查询社会化关系
* 根据ID查询社会化关系
*
* @param id 社会化关系的唯一标识符
* @return 返回与给定ID对应的SysSocialVo对象如果未找到则返回null
*/
SysSocialVo queryById(String id);
/**
* 查询社会化关系列表
*
* @param bo 用于过滤查询条件的SysSocialBo对象
* @return 返回符合条件的SysSocialVo对象列表
*/
List<SysSocialVo> queryList(SysSocialBo bo);
/**
* 查询社会化关系列表
* 根据用户ID查询社会化关系列表
*
* @param userId 用户的唯一标识符
* @return 返回与给定用户ID相关联的SysSocialVo对象列表
*/
List<SysSocialVo> queryListByUserId(Long userId);
/**
* 新增授权关系
*
* @param bo 包含新增授权关系信息的SysSocialBo对象
* @return 返回新增操作的结果成功返回true失败返回false
*/
Boolean insertByBo(SysSocialBo bo);
/**
* 更新社会化关系
*
* @param bo 包含更新信息的SysSocialBo对象
* @return 返回更新操作的结果成功返回true失败返回false
*/
Boolean updateByBo(SysSocialBo bo);
/**
* 删除社会化关系信息
*
* @param id 要删除的社会化关系的唯一标识符
* @return 返回删除操作的结果成功返回true失败返回false
*/
Boolean deleteWithValidById(Long id);
/**
* 根据 authId 查询 SysSocial 表和 SysUser 表,返回 SysSocialAuthResult 映射的对象
* 根据认证ID查询社会化关系和用户信息
*
* @param authId 认证ID
* @return SysSocial
* @return 返回包含SysSocial和用户信息的SysSocialVo对象列表
*/
List<SysSocialVo> selectByAuthId(String authId);
}

View File

@@ -223,20 +223,6 @@ public class SysDeptServiceImpl implements ISysDeptService {
return !exist;
}
/**
* 校验部门类别编码是否唯一
*
* @param dept 部门信息
* @return 结果
*/
@Override
public boolean checkDeptCategoryUnique(SysDeptBo dept) {
boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getDeptCategory, dept.getDeptCategory())
.ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId()));
return !exist;
}
/**
* 校验部门是否有数据权限
*

View File

@@ -37,7 +37,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 角色 业务层处理
@@ -106,7 +105,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
List<SysRoleVo> userRoles = baseMapper.selectRolesByUserId(userId);
List<SysRoleVo> roles = selectRoleAll();
// 使用HashSet提高查找效率
Set<Long> userRoleIds = userRoles.stream().map(SysRoleVo::getRoleId).collect(Collectors.toSet());
Set<Long> userRoleIds = StreamUtils.toSet(userRoles, SysRoleVo::getRoleId);
for (SysRoleVo role : roles) {
if (userRoleIds.contains(role.getRoleId())) {
role.setFlag(true);

View File

@@ -26,9 +26,11 @@ public class SysSocialServiceImpl implements ISysSocialService {
private final SysSocialMapper baseMapper;
/**
* 查询社会化关系
* 根据ID查询社会化关系
*
* @param id 社会化关系的唯一标识符
* @return 返回与给定ID对应的SysSocialVo对象如果未找到则返回null
*/
@Override
public SysSocialVo queryById(String id) {
@@ -36,7 +38,10 @@ public class SysSocialServiceImpl implements ISysSocialService {
}
/**
* 授权列表
* 查询社会化关系列表
*
* @param bo 用于过滤查询条件的SysSocialBo对象
* @return 返回符合条件的SysSocialVo对象列表
*/
@Override
public List<SysSocialVo> queryList(SysSocialBo bo) {
@@ -47,14 +52,22 @@ public class SysSocialServiceImpl implements ISysSocialService {
return baseMapper.selectVoList(lqw);
}
/**
* 根据用户ID查询社会化关系列表
*
* @param userId 用户的唯一标识符
* @return 返回与给定用户ID相关联的SysSocialVo对象列表
*/
@Override
public List<SysSocialVo> queryListByUserId(Long userId) {
return baseMapper.selectVoList(new LambdaQueryWrapper<SysSocial>().eq(SysSocial::getUserId, userId));
}
/**
* 新增社会化关系
* 新增授权关系
*
* @param bo 包含新增授权关系信息的SysSocialBo对象
* @return 返回新增操作的结果成功返回true失败返回false
*/
@Override
public Boolean insertByBo(SysSocialBo bo) {
@@ -73,6 +86,9 @@ public class SysSocialServiceImpl implements ISysSocialService {
/**
* 更新社会化关系
*
* @param bo 包含更新信息的SysSocialBo对象
* @return 返回更新操作的结果成功返回true失败返回false
*/
@Override
public Boolean updateByBo(SysSocialBo bo) {
@@ -81,7 +97,6 @@ public class SysSocialServiceImpl implements ISysSocialService {
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
@@ -89,21 +104,22 @@ public class SysSocialServiceImpl implements ISysSocialService {
//TODO 做一些数据校验,如唯一约束
}
/**
* 删除社会化关系
* 删除社会化关系信息
*
* @param id 要删除的社会化关系的唯一标识符
* @return 返回删除操作的结果成功返回true失败返回false
*/
@Override
public Boolean deleteWithValidById(Long id) {
return baseMapper.deleteById(id) > 0;
}
/**
* 根据 authId 查询用户信息
* 根据认证ID查询社会化关系和用户信息
*
* @param authId 认证id
* @return 授权信息
* @param authId 认证ID
* @return 返回包含SysSocial和用户信息的SysSocialVo对象列表
*/
@Override
public List<SysSocialVo> selectByAuthId(String authId) {

View File

@@ -95,6 +95,9 @@ public class SysUserServiceImpl implements ISysUserService {
ids.add(user.getDeptId());
w.in("u.dept_id", ids);
}).orderByAsc("u.user_id");
if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
wrapper.notIn("u.user_id", StringUtils.splitList(user.getExcludeUserIds()));
}
return wrapper;
}

View File

@@ -12,7 +12,7 @@
m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_role r on sur.role_id = r.role_id
left join sys_role r on rm.role_id = r.role_id
${ew.getCustomSqlSegment}
</select>

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/workflow/logs \
/ruoyi/workflow/temp \
@@ -9,6 +11,10 @@ RUN mkdir -p /ruoyi/workflow/logs \
WORKDIR /ruoyi/workflow
# 补全alpine镜像缺失字体问题
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
ENV SERVER_PORT=9205 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}

View File

@@ -2,6 +2,7 @@ package org.dromara.workflow.flowable.cmd;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import org.dromara.common.core.utils.StreamUtils;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
@@ -59,7 +60,7 @@ public class DeleteSequenceMultiInstanceCmd implements Command<Void> {
}
List<Long> userIdList = new ArrayList<>();
userIds.forEach(e -> {
Long userId = assignees.stream().filter(id -> ObjectUtil.equals(id, e)).findFirst().orElse(null);
Long userId = StreamUtils.findFirst(assignees, id -> ObjectUtil.equals(id, e));
if (userId == null) {
userIdList.add(e);
}

View File

@@ -259,23 +259,23 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
List<HistoricActivityInstance> highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
for (HistoricActivityInstance tempActivity : highLightedFlowList) {
Map<String, Object> task = new HashMap<>();
if (!FlowConstant.SEQUENCE_FLOW.equals(tempActivity.getActivityType()) &&
!FlowConstant.PARALLEL_GATEWAY.equals(tempActivity.getActivityType()) &&
!FlowConstant.EXCLUSIVE_GATEWAY.equals(tempActivity.getActivityType()) &&
!FlowConstant.INCLUSIVE_GATEWAY.equals(tempActivity.getActivityType())
) {
task.put("key", tempActivity.getActivityId());
task.put("completed", tempActivity.getEndTime() != null);
task.put("activityType", tempActivity.getActivityType());
taskList.add(task);
switch (tempActivity.getActivityType()) {
case FlowConstant.SEQUENCE_FLOW, FlowConstant.PARALLEL_GATEWAY,
FlowConstant.EXCLUSIVE_GATEWAY, FlowConstant.INCLUSIVE_GATEWAY -> {}
default -> {
task.put("key", tempActivity.getActivityId());
task.put("completed", tempActivity.getEndTime() != null);
task.put("activityType", tempActivity.getActivityType());
taskList.add(task);
}
}
}
ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult();
if (processInstance != null) {
taskList = taskList.stream().filter(e -> !e.get("activityType").equals(FlowConstant.END_EVENT)).collect(Collectors.toList());
taskList = StreamUtils.filter(taskList, e -> !e.get("activityType").equals(FlowConstant.END_EVENT));
}
//查询出运行中节点
List<Map<String, Object>> runtimeNodeList = taskList.stream().filter(e -> !(Boolean) e.get("completed")).collect(Collectors.toList());
List<Map<String, Object>> runtimeNodeList = StreamUtils.filter(taskList, e -> !(Boolean) e.get("completed"));
if (CollUtil.isNotEmpty(runtimeNodeList)) {
Iterator<Map<String, Object>> iterator = taskList.iterator();
while (iterator.hasNext()) {

View File

@@ -263,7 +263,8 @@ public class ActTaskServiceImpl implements IActTaskService {
String userId = String.valueOf(LoginHelper.getUserId());
queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus());
queryWrapper.eq(TenantHelper.isEnable(), "t.tenant_id_", TenantHelper.getTenantId());
queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' " + "and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN " + getInParam(roleIds) + " ) ))", userId)));
String ids = StreamUtils.join(roleIds, x -> "'" + x + "'");
queryWrapper.and(w1 -> w1.eq("t.assignee_", userId).or(w2 -> w2.isNull("t.assignee_").apply("exists ( select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TASK_ID_ = t.ID_ and LINK.TYPE_ = 'candidate' and (LINK.USER_ID_ = {0} or ( LINK.GROUP_ID_ IN ({1}) ) ))", userId, ids)));
if (StringUtils.isNotBlank(taskBo.getName())) {
queryWrapper.like("t.name_", taskBo.getName());
}
@@ -292,19 +293,6 @@ public class ActTaskServiceImpl implements IActTaskService {
return TableDataInfo.build(page);
}
private String getInParam(List<String> param) {
StringBuilder sb = new StringBuilder();
sb.append("(");
for (int i = 0; i < param.size(); i++) {
sb.append("'").append(param.get(i)).append("'");
if (i != param.size() - 1) {
sb.append(",");
}
}
sb.append(")");
return sb.toString();
}
/**
* 查询当前租户所有待办任务
*

View File

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.workflow.domain.WfTaskBackNode;
@@ -56,7 +57,7 @@ public class WfTaskBackNodeServiceImpl implements IWfTaskBackNodeService {
wfTaskBackNode.setOrderNo(0);
wfTaskBackNodeMapper.insert(wfTaskBackNode);
} else {
WfTaskBackNode taskNode = list.stream().filter(e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0).findFirst().orElse(null);
WfTaskBackNode taskNode = StreamUtils.findFirst(list, e -> e.getNodeId().equals(wfTaskBackNode.getNodeId()) && e.getOrderNo() == 0);
if (ObjectUtil.isEmpty(taskNode)) {
wfTaskBackNode.setOrderNo(list.get(0).getOrderNo() + 1);
WfTaskBackNode node = getListByInstanceIdAndNodeId(wfTaskBackNode.getInstanceId(), wfTaskBackNode.getNodeId());

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/monitor/logs

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/nacos

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/seata-server/logs \
/ruoyi/skywalking/agent

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/sentinel-dashboard/logs \
/ruoyi/skywalking/agent

View File

@@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-alpine:17.0.11-cds
#FROM bellsoft/liberica-openjdk-alpine:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/snailjob/logs