mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-18 17:38:48 +08:00
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:
commit
4b2afa5a5f
2
pom.xml
2
pom.xml
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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());
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user