mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	update 优化 重构将 WorkflowUtils 工具类改为 FlwCommonService 更通用的业务处理
This commit is contained in:
		@@ -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);
 | 
			
		||||
}
 | 
			
		||||
@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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());
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user