Jelajahi Sumber

update 优化 重构将 WorkflowUtils 工具类改为 FlwCommonService 更通用的业务处理

疯狂的狮子Li 3 bulan lalu
induk
melakukan
b7517cbbd4

+ 73 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java

@@ -0,0 +1,73 @@
+package org.dromara.workflow.service;
+
+import org.dromara.warm.flow.core.entity.User;
+import org.dromara.warm.flow.core.service.UserService;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 通用 工作流服务
+ *
+ * @author LionLi
+ */
+public interface IFlwCommonService {
+
+    /**
+     * 获取工作流用户service
+     */
+    UserService getFlowUserService();
+
+    /**
+     * 构建工作流用户
+     *
+     * @param userList 办理用户
+     * @param taskId   任务ID
+     * @return 用户
+     */
+    Set<User> buildUser(List<User> userList, Long taskId);
+
+    /**
+     * 构建工作流用户
+     *
+     * @param userIdList 办理用户
+     * @param taskId     任务ID
+     * @return 用户
+     */
+    Set<User> buildFlowUser(List<String> userIdList, Long taskId);
+
+    /**
+     * 发送消息
+     *
+     * @param flowName    流程定义名称
+     * @param messageType 消息类型
+     * @param message     消息内容,为空则发送默认配置的消息内容
+     */
+    void sendMessage(String flowName, Long instId, List<String> messageType, String message);
+
+    /**
+     * 驳回
+     *
+     * @param message        审批意见
+     * @param instanceId     流程实例id
+     * @param targetNodeCode 目标节点
+     * @param flowStatus     流程状态
+     * @param flowHisStatus  节点操作状态
+     */
+    void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus);
+
+    /**
+     * 申请人节点编码
+     *
+     * @param definitionId 流程定义id
+     * @return 申请人节点编码
+     */
+    String applyNodeCode(Long definitionId);
+
+    /**
+     * 删除运行中的任务
+     *
+     * @param taskIds 任务id
+     */
+    void deleteRunTask(List<Long> taskIds);
+}

+ 95 - 28
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java → ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java

@@ -1,15 +1,21 @@
-package org.dromara.workflow.utils;
+package org.dromara.workflow.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.dto.UserDTO;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mail.utils.MailUtils;
+import org.dromara.common.sse.dto.SseMessageDto;
+import org.dromara.common.sse.utils.SseMessageUtils;
 import org.dromara.warm.flow.core.constant.ExceptionCons;
 import org.dromara.warm.flow.core.dto.FlowParams;
 import org.dromara.warm.flow.core.entity.Node;
+import org.dromara.warm.flow.core.entity.Task;
 import org.dromara.warm.flow.core.entity.User;
 import org.dromara.warm.flow.core.enums.NodeType;
 import org.dromara.warm.flow.core.enums.SkipType;
@@ -22,36 +28,44 @@ import org.dromara.warm.flow.orm.entity.FlowTask;
 import org.dromara.warm.flow.orm.entity.FlowUser;
 import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
 import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.dromara.workflow.common.enums.MessageTypeEnum;
 import org.dromara.workflow.common.enums.TaskAssigneeType;
+import org.dromara.workflow.service.IFlwCommonService;
 import org.dromara.workflow.service.IFlwTaskAssigneeService;
 import org.dromara.workflow.service.IFlwTaskService;
+import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 
 /**
  * 工作流工具
  *
- * @author may
+ * @author LionLi
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class WorkflowUtils {
+@ConditionalOnEnable
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class FlwCommonServiceImpl implements IFlwCommonService {
 
-    private static final IFlwTaskAssigneeService TASK_ASSIGNEE_SERVICE = SpringUtils.getBean(IFlwTaskAssigneeService.class);
-    private static final IFlwTaskService FLW_TASK_SERVICE = SpringUtils.getBean(IFlwTaskService.class);
-    private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class);
-    private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class);
-    private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class);
-    private static final TaskService TASK_SERVICE = SpringUtils.getBean(TaskService.class);
-    private static final NodeService NODE_SERVICE = SpringUtils.getBean(NodeService.class);
+    private final FlowNodeMapper flowNodeMapper;
+    private final FlowTaskMapper flowTaskMapper;
+    private final UserService userService;
+    private final TaskService taskService;
+    private final NodeService nodeService;
 
     /**
      * 获取工作流用户service
      */
-    public static UserService getFlowUserService() {
-        return USER_SERVICE;
+    @Override
+    public UserService getFlowUserService() {
+        return userService;
     }
 
     /**
@@ -61,15 +75,17 @@ public class WorkflowUtils {
      * @param taskId   任务ID
      * @return 用户
      */
-    public static Set<User> buildUser(List<User> userList, Long taskId) {
+    @Override
+    public Set<User> buildUser(List<User> userList, Long taskId) {
         if (CollUtil.isEmpty(userList)) {
             return Set.of();
         }
         Set<User> list = new HashSet<>();
         Set<String> processedBySet = new HashSet<>();
+        IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
         for (User user : userList) {
             // 根据 processedBy 前缀判断处理人类型,分别获取用户列表
-            List<UserDTO> users = TASK_ASSIGNEE_SERVICE.fetchUsersByStorageId(user.getProcessedBy());
+            List<UserDTO> users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy());
             // 转换为 FlowUser 并添加到结果集合
             if (CollUtil.isNotEmpty(users)) {
                 users.forEach(dto -> {
@@ -95,7 +111,8 @@ public class WorkflowUtils {
      * @param taskId     任务ID
      * @return 用户
      */
-    public static Set<User> buildFlowUser(List<String> userIdList, Long taskId) {
+    @Override
+    public Set<User> buildFlowUser(List<String> userIdList, Long taskId) {
         if (CollUtil.isEmpty(userIdList)) {
             return Set.of();
         }
@@ -114,6 +131,52 @@ public class WorkflowUtils {
         return list;
     }
 
+    /**
+     * 发送消息
+     *
+     * @param flowName    流程定义名称
+     * @param messageType 消息类型
+     * @param message     消息内容,为空则发送默认配置的消息内容
+     */
+    @Override
+    public void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
+        IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
+        List<UserDTO> userList = new ArrayList<>();
+        List<FlowTask> list = flwTaskService.selectByInstId(instId);
+        if (StringUtils.isBlank(message)) {
+            message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
+        }
+        for (Task task : list) {
+            List<UserDTO> users = flwTaskService.currentTaskAllUser(task.getId());
+            if (CollUtil.isNotEmpty(users)) {
+                userList.addAll(users);
+            }
+        }
+        if (CollUtil.isNotEmpty(userList)) {
+            for (String code : messageType) {
+                MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
+                if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
+                    switch (messageTypeEnum) {
+                        case SYSTEM_MESSAGE:
+                            SseMessageDto dto = new SseMessageDto();
+                            dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList()));
+                            dto.setMessage(message);
+                            SseMessageUtils.publishMessage(dto);
+                            break;
+                        case EMAIL_MESSAGE:
+                            MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message);
+                            break;
+                        case SMS_MESSAGE:
+                            //todo 短信发送
+                            break;
+                        default:
+                            throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * 驳回
      *
@@ -123,8 +186,10 @@ public class WorkflowUtils {
      * @param flowStatus     流程状态
      * @param flowHisStatus  节点操作状态
      */
-    public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
-        List<FlowTask> list = FLW_TASK_SERVICE.selectByInstId(instanceId);
+    @Override
+    public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
+        IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
+        List<FlowTask> list = flwTaskService.selectByInstId(instanceId);
         if (CollUtil.isNotEmpty(list)) {
             List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
             if (list.size() == tasks.size()) {
@@ -132,7 +197,7 @@ public class WorkflowUtils {
             }
         }
         for (FlowTask task : list) {
-            List<UserDTO> userList = FLW_TASK_SERVICE.currentTaskAllUser(task.getId());
+            List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
             FlowParams flowParams = FlowParams.build();
             flowParams.nodeCode(targetNodeCode);
             flowParams.message(message);
@@ -143,7 +208,7 @@ public class WorkflowUtils {
             if (CollUtil.isNotEmpty(userList)) {
                 flowParams.handler(userList.get(0).getUserId().toString());
             }
-            TASK_SERVICE.skip(task.getId(), flowParams);
+            taskService.skip(task.getId(), flowParams);
         }
         //解决会签多人审批问题
         backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
@@ -155,13 +220,14 @@ public class WorkflowUtils {
      * @param definitionId 流程定义id
      * @return 申请人节点编码
      */
-    public static String applyNodeCode(Long definitionId) {
+    @Override
+    public String applyNodeCode(Long definitionId) {
         //获取已发布的流程节点
-        List<FlowNode> flowNodes = FLOW_NODE_MAPPER.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
+        List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
         AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
         Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
         AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
-        Node nextNode = NODE_SERVICE.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
+        Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
         return nextNode.getNodeCode();
     }
 
@@ -170,11 +236,12 @@ public class WorkflowUtils {
      *
      * @param taskIds 任务id
      */
-    public static void deleteRunTask(List<Long> taskIds) {
+    @Override
+    public void deleteRunTask(List<Long> taskIds) {
         if (CollUtil.isEmpty(taskIds)) {
             return;
         }
-        USER_SERVICE.deleteByTaskIds(taskIds);
-        FLOW_TASK_MAPPER.deleteByIds(taskIds);
+        userService.deleteByTaskIds(taskIds);
+        flowTaskMapper.deleteByIds(taskIds);
     }
 }

+ 3 - 2
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwDefinitionServiceImpl.java

@@ -33,8 +33,8 @@ import org.dromara.workflow.common.constant.FlowConstant;
 import org.dromara.workflow.domain.FlowCategory;
 import org.dromara.workflow.domain.vo.FlowDefinitionVo;
 import org.dromara.workflow.mapper.FlwCategoryMapper;
+import org.dromara.workflow.service.IFlwCommonService;
 import org.dromara.workflow.service.IFlwDefinitionService;
-import org.dromara.workflow.utils.WorkflowUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -64,6 +64,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
     private final FlowNodeMapper flowNodeMapper;
     private final FlowSkipMapper flowSkipMapper;
     private final FlwCategoryMapper flwCategoryMapper;
+    private final IFlwCommonService flwCommonService;
 
     /**
      * 查询流程定义列表
@@ -125,7 +126,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
         List<String> errorMsg = new ArrayList<>();
         if (CollUtil.isNotEmpty(flowNodes)) {
             for (FlowNode flowNode : flowNodes) {
-                String applyNodeCode = WorkflowUtils.applyNodeCode(id);
+                String applyNodeCode = flwCommonService.applyNodeCode(id);
                 if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) {
                     errorMsg.add(flowNode.getNodeName());
                 }

+ 5 - 4
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java

@@ -46,9 +46,9 @@ import org.dromara.workflow.domain.vo.FlowVariableVo;
 import org.dromara.workflow.handler.FlowProcessEventHandler;
 import org.dromara.workflow.mapper.FlwCategoryMapper;
 import org.dromara.workflow.mapper.FlwInstanceMapper;
+import org.dromara.workflow.service.IFlwCommonService;
 import org.dromara.workflow.service.IFlwInstanceService;
 import org.dromara.workflow.service.IFlwTaskService;
-import org.dromara.workflow.utils.WorkflowUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -76,6 +76,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     private final IFlwTaskService flwTaskService;
     private final FlwInstanceMapper flwInstanceMapper;
     private final FlwCategoryMapper flwCategoryMapper;
+    private final IFlwCommonService flwCommonService;
 
     /**
      * 分页查询正在运行的流程实例
@@ -245,15 +246,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
             }
             String message = bo.getMessage();
             BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
-            String applyNodeCode = WorkflowUtils.applyNodeCode(definition.getId());
+            String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
             //撤销
-            WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
+            flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
             //判断或签节点是否有多个,只保留一个
             List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
             if (CollUtil.isNotEmpty(currentTaskList)) {
                 if (currentTaskList.size() > 1) {
                     currentTaskList.remove(0);
-                    WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
+                    flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
                 }
             }
 

+ 18 - 65
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -22,12 +22,9 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.mail.utils.MailUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.common.sse.dto.SseMessageDto;
-import org.dromara.common.sse.utils.SseMessageUtils;
 import org.dromara.warm.flow.core.dto.FlowParams;
 import org.dromara.warm.flow.core.entity.*;
 import org.dromara.warm.flow.core.enums.NodeType;
@@ -41,7 +38,6 @@ import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
 import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
 import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
 import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.MessageTypeEnum;
 import org.dromara.workflow.common.enums.TaskAssigneeType;
 import org.dromara.workflow.common.enums.TaskStatusEnum;
 import org.dromara.workflow.domain.bo.*;
@@ -51,9 +47,9 @@ import org.dromara.workflow.handler.FlowProcessEventHandler;
 import org.dromara.workflow.handler.WorkflowPermissionHandler;
 import org.dromara.workflow.mapper.FlwCategoryMapper;
 import org.dromara.workflow.mapper.FlwTaskMapper;
+import org.dromara.workflow.service.IFlwCommonService;
 import org.dromara.workflow.service.IFlwTaskAssigneeService;
 import org.dromara.workflow.service.IFlwTaskService;
-import org.dromara.workflow.utils.WorkflowUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -89,6 +85,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     private final FlwCategoryMapper flwCategoryMapper;
     private final FlowNodeMapper flowNodeMapper;
     private final IFlwTaskAssigneeService flwTaskAssigneeService;
+    private final IFlwCommonService flwCommonService;
 
     /**
      * 启动任务
@@ -182,7 +179,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             Instance instance = taskService.skip(taskId, flowParams);
             this.setHandler(instance, flowTask, flowCopyList);
             // 消息通知
-            this.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
+            flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
             //设置下一环节处理人
             setNextHandler(ins.getId());
             return true;
@@ -205,10 +202,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             if (variableMap != null && variableMap.containsKey(task.getNodeCode())) {
                 String userIds = variableMap.get(task.getNodeCode()).toString();
                 // 批量删除现有任务的办理人记录
-                WorkflowUtils.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
+                flwCommonService.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
                 // 批量新增任务办理人记录
-                Set<User> users = WorkflowUtils.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
-                WorkflowUtils.getFlowUserService().saveBatch(new ArrayList<>(users));
+                Set<User> users = flwCommonService.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
+                flwCommonService.getFlowUserService().saveBatch(new ArrayList<>(users));
                 variableMap.remove(task.getNodeCode());
             }
         }
@@ -266,7 +263,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         }
         List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId);
         // 获取与当前任务关联的用户列表
-        List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
+        List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
         if (CollUtil.isEmpty(associatedUsers)) {
             return;
         }
@@ -275,16 +272,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         for (FlowTask flowTask : flowTasks) {
             List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId()));
             if (CollUtil.isNotEmpty(users)) {
-                userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId()));
+                userList.addAll(flwCommonService.buildUser(users, flowTask.getId()));
             }
         }
         // 批量删除现有任务的办理人记录
-        WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList);
+        flwCommonService.getFlowUserService().deleteByTaskIds(taskIdList);
         // 确保要保存的 userList 不为空
         if (CollUtil.isEmpty(userList)) {
             return;
         }
-        WorkflowUtils.getFlowUserService().saveBatch(userList);
+        flwCommonService.getFlowUserService().saveBatch(userList);
     }
 
     /**
@@ -324,7 +321,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
                 return flowUser;
             }).collect(Collectors.toList());
         // 批量保存抄送人员
-        WorkflowUtils.getFlowUserService().saveBatch(userList);
+        flwCommonService.getFlowUserService().saveBatch(userList);
     }
 
     /**
@@ -452,7 +449,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
             Long definitionId = task.getDefinitionId();
             Definition definition = defService.getById(definitionId);
-            String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId);
+            String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
             FlowParams flowParams = FlowParams.build();
             flowParams.nodeCode(bo.getNodeCode());
             flowParams.message(message);
@@ -465,7 +462,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             Instance instance = insService.getById(inst.getId());
             this.setHandler(instance, task, null);
             // 消息通知
-            this.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
+            flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
             return true;
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -565,7 +562,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         }
         flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
         flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
-        flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(WorkflowUtils.applyNodeCode(task.getDefinitionId())));
+        flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId())));
         return flowTaskVo;
     }
 
@@ -737,7 +734,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
             // 批量删除现有任务的办理人记录
             if (CollUtil.isNotEmpty(flowTasks)) {
-                WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
+                flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
                 List<User> userList = flowTasks.stream()
                     .map(flowTask -> {
                         FlowUser flowUser = new FlowUser();
@@ -748,7 +745,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
                     })
                     .collect(Collectors.toList());
                 if (CollUtil.isNotEmpty(userList)) {
-                    WorkflowUtils.getFlowUserService().saveBatch(userList);
+                    flwCommonService.getFlowUserService().saveBatch(userList);
                 }
             }
         } catch (Exception e) {
@@ -767,7 +764,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
         Map<Long, List<UserDTO>> map = new HashMap<>();
         // 获取与当前任务关联的用户列表
-        List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
+        List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
         Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
         for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
             List<User> value = entry.getValue();
@@ -787,7 +784,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     @Override
     public List<UserDTO> currentTaskAllUser(Long taskId) {
         // 获取与当前任务关联的用户列表
-        List<User> userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
+        List<User> userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
         if (CollUtil.isEmpty(userList)) {
             return Collections.emptyList();
         }
@@ -807,48 +804,4 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
             .eq(FlowNode::getDefinitionId, definitionId));
     }
 
-    /**
-     * 发送消息
-     *
-     * @param flowName    流程定义名称
-     * @param messageType 消息类型
-     * @param message     消息内容,为空则发送默认配置的消息内容
-     */
-    public void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
-        List<UserDTO> userList = new ArrayList<>();
-        List<FlowTask> list = this.selectByInstId(instId);
-        if (StringUtils.isBlank(message)) {
-            message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
-        }
-        for (Task task : list) {
-            List<UserDTO> users = this.currentTaskAllUser(task.getId());
-            if (CollUtil.isNotEmpty(users)) {
-                userList.addAll(users);
-            }
-        }
-        if (CollUtil.isNotEmpty(userList)) {
-            for (String code : messageType) {
-                MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
-                if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
-                    switch (messageTypeEnum) {
-                        case SYSTEM_MESSAGE:
-                            SseMessageDto dto = new SseMessageDto();
-                            dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList()));
-                            dto.setMessage(message);
-                            SseMessageUtils.publishMessage(dto);
-                            break;
-                        case EMAIL_MESSAGE:
-                            MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message);
-                            break;
-                        case SMS_MESSAGE:
-                            //todo 短信发送
-                            break;
-                        default:
-                            throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
-                    }
-                }
-            }
-        }
-    }
-
 }