Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev-flow

# Conflicts:
#	ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
#	ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java
#	ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java
This commit is contained in:
warm 2025-05-19 15:18:46 +08:00
commit 4b2afa5a5f
8 changed files with 33 additions and 33 deletions

View File

@ -49,7 +49,7 @@
<!-- 面向运行时的D-ORM依赖 --> <!-- 面向运行时的D-ORM依赖 -->
<anyline.version>8.7.2-20250101</anyline.version> <anyline.version>8.7.2-20250101</anyline.version>
<!-- 工作流配置 --> <!-- 工作流配置 -->
<warm-flow.version>1.7.0</warm-flow.version> <warm-flow.version>1.7.2</warm-flow.version>
<!-- 插件版本 --> <!-- 插件版本 -->
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version> <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>

View File

@ -43,7 +43,7 @@ public class SocialUtils {
.redirectUri(obj.getRedirectUri()) .redirectUri(obj.getRedirectUri())
.scopes(obj.getScopes()); .scopes(obj.getScopes());
return switch (source.toLowerCase()) { return switch (source.toLowerCase()) {
case "dingtalk" -> new AuthDingTalkRequest(builder.build(), STATE_CACHE); case "dingtalk" -> new AuthDingTalkV2Request(builder.build(), STATE_CACHE);
case "baidu" -> new AuthBaiduRequest(builder.build(), STATE_CACHE); case "baidu" -> new AuthBaiduRequest(builder.build(), STATE_CACHE);
case "github" -> new AuthGithubRequest(builder.build(), STATE_CACHE); case "github" -> new AuthGithubRequest(builder.build(), STATE_CACHE);
case "gitee" -> new AuthGiteeRequest(builder.build(), STATE_CACHE); case "gitee" -> new AuthGiteeRequest(builder.build(), STATE_CACHE);
@ -61,7 +61,7 @@ public class SocialUtils {
case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE); case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE);
case "stack_overflow" -> new AuthStackOverflowRequest(builder.stackOverflowKey(obj.getStackOverflowKey()).build(), STATE_CACHE); case "stack_overflow" -> new AuthStackOverflowRequest(builder.stackOverflowKey(obj.getStackOverflowKey()).build(), STATE_CACHE);
case "huawei" -> new AuthHuaweiV3Request(builder.build(), STATE_CACHE); case "huawei" -> new AuthHuaweiV3Request(builder.build(), STATE_CACHE);
case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeRequest(builder.agentId(obj.getAgentId()).build(), STATE_CACHE); case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeV2Request(builder.agentId(obj.getAgentId()).build(), STATE_CACHE);
case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE); case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE);
case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE); case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE);
case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE);

View File

@ -7,6 +7,21 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/**
* 自定义条件注解用于基于配置启用或禁用特定功能
* <p>
* 该注解只会在配置文件中 `warm-flow.enabled=true` 标注了此注解的类或方法才会被 Spring 容器加载
* <p>
* 示例配置
* <pre>
* warm-flow:
* enabled: true # 设置为 true 启用工作流功能
* </pre>
* <p>
* 使用此注解时可以动态控制工作流功能是否启用而不需要修改代码逻辑
*
* @author Lion Li
*/
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD }) @Target({ ElementType.TYPE, ElementType.METHOD })
@ConditionalOnProperty(value = "warm-flow.enabled", havingValue = "true") @ConditionalOnProperty(value = "warm-flow.enabled", havingValue = "true")

View File

@ -2,7 +2,6 @@ package org.dromara.workflow.listener;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.enums.BusinessStatusEnum;
@ -23,7 +22,9 @@ import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.*; import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* 全局任务办理监听 * 全局任务办理监听
@ -76,7 +77,9 @@ public class WorkflowGlobalListener implements GlobalListener {
Map<String, Object> variable = listenerVariable.getVariable(); Map<String, Object> variable = listenerVariable.getVariable();
List<Task> nextTasks = listenerVariable.getNextTasks(); List<Task> nextTasks = listenerVariable.getNextTasks();
FlowParams flowParams = listenerVariable.getFlowParams(); FlowParams flowParams = listenerVariable.getFlowParams();
Definition definition = listenerVariable.getDefinition();
Instance instance = listenerVariable.getInstance();
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
for (Task flowTask : nextTasks) { for (Task flowTask : nextTasks) {
// 如果办理或者退回并行存在需要指定办理人则直接覆盖办理人 // 如果办理或者退回并行存在需要指定办理人则直接覆盖办理人
if (variable.containsKey(flowTask.getNodeCode()) && (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus()) if (variable.containsKey(flowTask.getNodeCode()) && (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus())
@ -92,6 +95,10 @@ public class WorkflowGlobalListener implements GlobalListener {
flowTask.setPermissionList(newUserList); flowTask.setPermissionList(newUserList);
} }
} }
// 如果是申请节点则把启动人添加到办理人
if (flowTask.getNodeCode().equals(applyNodeCode)) {
flowTask.setPermissionList(List.of(instance.getCreateBy()));
}
} }
} }

View File

@ -1,9 +1,6 @@
package org.dromara.workflow.service; package org.dromara.workflow.service;
import org.dromara.warm.flow.core.entity.Instance;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 通用 工作流服务 * 通用 工作流服务
@ -37,12 +34,4 @@ public interface IFlwCommonService {
* @return 申请人节点编码 * @return 申请人节点编码
*/ */
String applyNodeCode(Long definitionId); String applyNodeCode(Long definitionId);
/**
* 合并变量
*
* @param instance 流程实例
* @param variable 变量
*/
void mergeVariable(Instance instance, Map<String, Object> variable);
} }

View File

@ -11,13 +11,10 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.mail.utils.MailUtils;
import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.NodeService; import org.dromara.warm.flow.core.service.NodeService;
import org.dromara.warm.flow.core.utils.MapUtil;
import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.common.enums.MessageTypeEnum;
@ -26,7 +23,8 @@ import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -61,6 +59,7 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId())); return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId()));
} }
/** /**
* 发送消息 * 发送消息
* *
@ -120,14 +119,4 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey()); Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
return nextNode.getNodeCode(); return nextNode.getNodeCode();
} }
@Override
public void mergeVariable(Instance instance, Map<String, Object> variable) {
if (MapUtil.isNotEmpty(variable)) {
String variableStr = instance.getVariable();
Map<String, Object> deserialize = FlowEngine.jsonConvert.strToMap(variableStr);
deserialize.putAll(variable);
instance.setVariable(FlowEngine.jsonConvert.objToStr(deserialize));
}
}
} }

View File

@ -360,7 +360,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
public void setVariable(Long instanceId, Map<String, Object> variable) { public void setVariable(Long instanceId, Map<String, Object> variable) {
Instance instance = insService.getById(instanceId); Instance instance = insService.getById(instanceId);
if (instance != null) { if (instance != null) {
flwCommonService.mergeVariable(instance, variable); taskService.mergeVariable(instance, variable);
insService.updateById(instance); insService.updateById(instance);
} }
} }

View File

@ -113,7 +113,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (ObjectUtil.isNotNull(flowInstance)) { if (ObjectUtil.isNotNull(flowInstance)) {
BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus());
List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId()));
flwCommonService.mergeVariable(flowInstance, variables); taskService.mergeVariable(flowInstance, variables);
insService.updateById(flowInstance); insService.updateById(flowInstance);
StartProcessReturnDTO dto = new StartProcessReturnDTO(); StartProcessReturnDTO dto = new StartProcessReturnDTO();
dto.setProcessInstanceId(taskList.get(0).getInstanceId()); dto.setProcessInstanceId(taskList.get(0).getInstanceId());