mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	update 手动合并冲突 优化 工作流模块下一个节点指定办理人、角色和部门转具体用户、抄送人和消息推送,改到通过全局分派监听器和完成监听器处理
update 修复退回申请人无法发送消息问题
This commit is contained in:
		@@ -14,7 +14,10 @@ import org.dromara.warm.flow.core.listener.GlobalListener;
 | 
				
			|||||||
import org.dromara.warm.flow.core.listener.ListenerVariable;
 | 
					import org.dromara.warm.flow.core.listener.ListenerVariable;
 | 
				
			||||||
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.TaskStatusEnum;
 | 
				
			||||||
 | 
					import org.dromara.workflow.domain.bo.FlowCopyBo;
 | 
				
			||||||
import org.dromara.workflow.handler.FlowProcessEventHandler;
 | 
					import org.dromara.workflow.handler.FlowProcessEventHandler;
 | 
				
			||||||
 | 
					import org.dromara.workflow.service.IFlwCommonService;
 | 
				
			||||||
import org.dromara.workflow.service.IFlwInstanceService;
 | 
					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;
 | 
				
			||||||
@@ -37,6 +40,7 @@ public class WorkflowGlobalListener implements GlobalListener {
 | 
				
			|||||||
    private final IFlwTaskService taskService;
 | 
					    private final IFlwTaskService taskService;
 | 
				
			||||||
    private final IFlwInstanceService instanceService;
 | 
					    private final IFlwInstanceService instanceService;
 | 
				
			||||||
    private final FlowProcessEventHandler flowProcessEventHandler;
 | 
					    private final FlowProcessEventHandler flowProcessEventHandler;
 | 
				
			||||||
 | 
					    private final IFlwCommonService flwCommonService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 创建监听器,任务创建时执行
 | 
					     * 创建监听器,任务创建时执行
 | 
				
			||||||
@@ -70,6 +74,32 @@ public class WorkflowGlobalListener implements GlobalListener {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void assignment(ListenerVariable listenerVariable) {
 | 
					    public void assignment(ListenerVariable listenerVariable) {
 | 
				
			||||||
 | 
					        Map<String, Object> variable = listenerVariable.getVariable();
 | 
				
			||||||
 | 
					        List<Task> nextTasks = listenerVariable.getNextTasks();
 | 
				
			||||||
 | 
					        FlowParams flowParams = listenerVariable.getFlowParams();
 | 
				
			||||||
 | 
					        Definition definition = listenerVariable.getDefinition();
 | 
				
			||||||
 | 
					        Instance instance = listenerVariable.getInstance();
 | 
				
			||||||
 | 
					        String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
 | 
				
			||||||
 | 
					        for (Task flowTask : nextTasks) {
 | 
				
			||||||
 | 
					            // 如果办理或者退回并行存在需要指定办理人,则直接覆盖办理人
 | 
				
			||||||
 | 
					            if (variable.containsKey(flowTask.getNodeCode()) && (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus())
 | 
				
			||||||
 | 
					                || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus()))) {
 | 
				
			||||||
 | 
					                String userIds = variable.get(flowTask.getNodeCode()).toString();
 | 
				
			||||||
 | 
					                flowTask.setPermissionList(List.of(userIds.split(StringUtils.SEPARATOR)));
 | 
				
			||||||
 | 
					                variable.remove(flowTask.getNodeCode());
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // 否则把所有的角色或者部门转成对应的用户
 | 
				
			||||||
 | 
					                List<String> permissionList = flowTask.getPermissionList();
 | 
				
			||||||
 | 
					                if (CollUtil.isNotEmpty(permissionList)) {
 | 
				
			||||||
 | 
					                    List<String> newUserList = flwCommonService.buildUser(permissionList);
 | 
				
			||||||
 | 
					                    flowTask.setPermissionList(newUserList);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 如果是申请节点,则把启动人添加到办理人
 | 
				
			||||||
 | 
					            if (flowTask.getNodeCode().equals(applyNodeCode)) {
 | 
				
			||||||
 | 
					                flowTask.setPermissionList(List.of(instance.getCreateBy()));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -96,6 +126,27 @@ public class WorkflowGlobalListener implements GlobalListener {
 | 
				
			|||||||
        if (StringUtils.isNotBlank(status)) {
 | 
					        if (StringUtils.isNotBlank(status)) {
 | 
				
			||||||
            flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, status, params, false);
 | 
					            flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, status, params, false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 只有办理或者退回的时候才执行消息通知和抄送
 | 
				
			||||||
 | 
					        if (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus())
 | 
				
			||||||
 | 
					            || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) {
 | 
				
			||||||
 | 
					            Task task = listenerVariable.getTask();
 | 
				
			||||||
 | 
					            Map<String, Object> variable = listenerVariable.getVariable();
 | 
				
			||||||
 | 
					            List<FlowCopyBo> flowCopyList = (List<FlowCopyBo>) variable.get("flowCopyList");
 | 
				
			||||||
 | 
					            List<String> messageType = (List<String>) variable.get("messageType");
 | 
				
			||||||
 | 
					            String notice = (String) variable.get("notice");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 添加抄送人
 | 
				
			||||||
 | 
					            taskService.setCopy(task, flowCopyList);
 | 
				
			||||||
 | 
					            variable.remove("flowCopyList");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 消息通知
 | 
				
			||||||
 | 
					            if (CollUtil.isNotEmpty(messageType)) {
 | 
				
			||||||
 | 
					                flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
 | 
				
			||||||
 | 
					                variable.remove("messageType");
 | 
				
			||||||
 | 
					                variable.remove("notice");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,6 @@
 | 
				
			|||||||
package org.dromara.workflow.service;
 | 
					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.List;
 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 通用 工作流服务
 | 
					 * 通用 工作流服务
 | 
				
			||||||
@@ -13,30 +9,13 @@ import java.util.Set;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
public interface IFlwCommonService {
 | 
					public interface IFlwCommonService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获取工作流用户service
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return 工作流用户service
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    UserService getFlowUserService();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 构建工作流用户
 | 
					     * 构建工作流用户
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param userList 办理用户
 | 
					     * @param permissionList 办理用户
 | 
				
			||||||
     * @param taskId   任务ID
 | 
					 | 
				
			||||||
     * @return 用户
 | 
					     * @return 用户
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    Set<User> buildUser(List<User> userList, Long taskId);
 | 
					    List<String> buildUser(List<String> permissionList);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 构建工作流用户
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param userIdList 办理用户
 | 
					 | 
				
			||||||
     * @param taskId     任务ID
 | 
					 | 
				
			||||||
     * @return 用户
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    Set<User> buildFlowUser(List<String> userIdList, Long taskId);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 发送消息
 | 
					     * 发送消息
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ import org.dromara.common.core.domain.dto.UserDTO;
 | 
				
			|||||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
					import org.dromara.common.mybatis.core.page.PageQuery;
 | 
				
			||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
					import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
				
			||||||
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.orm.entity.FlowHisTask;
 | 
					import org.dromara.warm.flow.orm.entity.FlowHisTask;
 | 
				
			||||||
import org.dromara.warm.flow.orm.entity.FlowNode;
 | 
					import org.dromara.warm.flow.orm.entity.FlowNode;
 | 
				
			||||||
import org.dromara.warm.flow.orm.entity.FlowTask;
 | 
					import org.dromara.warm.flow.orm.entity.FlowTask;
 | 
				
			||||||
@@ -38,6 +39,14 @@ public interface IFlwTaskService {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    boolean completeTask(CompleteTaskBo completeTaskBo);
 | 
					    boolean completeTask(CompleteTaskBo completeTaskBo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加抄送人
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param task         任务信息
 | 
				
			||||||
 | 
					     * @param flowCopyList 抄送人
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setCopy(Task task, List<FlowCopyBo> flowCopyList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 查询当前用户的待办任务
 | 
					     * 查询当前用户的待办任务
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,21 +13,18 @@ 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.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.entity.User;
 | 
					 | 
				
			||||||
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.service.UserService;
 | 
					 | 
				
			||||||
import org.dromara.warm.flow.orm.entity.FlowTask;
 | 
					import org.dromara.warm.flow.orm.entity.FlowTask;
 | 
				
			||||||
import org.dromara.warm.flow.orm.entity.FlowUser;
 | 
					 | 
				
			||||||
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;
 | 
				
			||||||
import org.dromara.workflow.common.enums.TaskAssigneeType;
 | 
					 | 
				
			||||||
import org.dromara.workflow.service.IFlwCommonService;
 | 
					import org.dromara.workflow.service.IFlwCommonService;
 | 
				
			||||||
import org.dromara.workflow.service.IFlwTaskAssigneeService;
 | 
					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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,82 +38,27 @@ import java.util.stream.Collectors;
 | 
				
			|||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
@Service
 | 
					@Service
 | 
				
			||||||
public class FlwCommonServiceImpl implements IFlwCommonService {
 | 
					public class FlwCommonServiceImpl implements IFlwCommonService {
 | 
				
			||||||
    private final UserService userService;
 | 
					 | 
				
			||||||
    private final NodeService nodeService;
 | 
					    private final NodeService nodeService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获取工作流用户service
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public UserService getFlowUserService() {
 | 
					 | 
				
			||||||
        return userService;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 构建工作流用户
 | 
					     * 构建工作流用户
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param userList 办理用户
 | 
					     * @param permissionList 办理用户
 | 
				
			||||||
     * @param taskId   任务ID
 | 
					 | 
				
			||||||
     * @return 用户
 | 
					     * @return 用户
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public Set<User> buildUser(List<User> userList, Long taskId) {
 | 
					    public List<String> buildUser(List<String> permissionList) {
 | 
				
			||||||
        if (CollUtil.isEmpty(userList)) {
 | 
					        if (CollUtil.isEmpty(permissionList)) {
 | 
				
			||||||
            return Set.of();
 | 
					            return List.of();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Set<User> list = new HashSet<>();
 | 
					 | 
				
			||||||
        Set<String> processedBySet = new HashSet<>();
 | 
					 | 
				
			||||||
        IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
 | 
					        IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
 | 
				
			||||||
        Map<String, List<User>> userListMap = StreamUtils.groupByKey(userList, User::getType);
 | 
					        String processedBys = CollUtil.join(permissionList,  StringUtils.SEPARATOR);
 | 
				
			||||||
        for (Map.Entry<String, List<User>> entry : userListMap.entrySet()) {
 | 
					        // 根据 processedBy 前缀判断处理人类型,分别获取用户列表
 | 
				
			||||||
            List<User> entryValue = entry.getValue();
 | 
					        List<UserDTO> users = taskAssigneeService.fetchUsersByStorageIds(processedBys);
 | 
				
			||||||
            String processedBys = StreamUtils.join(entryValue, User::getProcessedBy);
 | 
					
 | 
				
			||||||
            // 根据 processedBy 前缀判断处理人类型,分别获取用户列表
 | 
					        return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId()));
 | 
				
			||||||
            List<UserDTO> users = taskAssigneeService.fetchUsersByStorageIds(processedBys);
 | 
					 | 
				
			||||||
            // 转换为 FlowUser 并添加到结果集合
 | 
					 | 
				
			||||||
            if (CollUtil.isNotEmpty(users)) {
 | 
					 | 
				
			||||||
                users.forEach(dto -> {
 | 
					 | 
				
			||||||
                    String processedBy = String.valueOf(dto.getUserId());
 | 
					 | 
				
			||||||
                    if (!processedBySet.contains(processedBy)) {
 | 
					 | 
				
			||||||
                        FlowUser flowUser = new FlowUser();
 | 
					 | 
				
			||||||
                        flowUser.setType(entry.getKey());
 | 
					 | 
				
			||||||
                        flowUser.setProcessedBy(processedBy);
 | 
					 | 
				
			||||||
                        flowUser.setAssociated(taskId);
 | 
					 | 
				
			||||||
                        list.add(flowUser);
 | 
					 | 
				
			||||||
                        processedBySet.add(processedBy);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return list;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 构建工作流用户
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param userIdList 办理用户
 | 
					 | 
				
			||||||
     * @param taskId     任务ID
 | 
					 | 
				
			||||||
     * @return 用户
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public Set<User> buildFlowUser(List<String> userIdList, Long taskId) {
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(userIdList)) {
 | 
					 | 
				
			||||||
            return Set.of();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Set<User> list = new HashSet<>();
 | 
					 | 
				
			||||||
        Set<String> processedBySet = new HashSet<>();
 | 
					 | 
				
			||||||
        for (String userId : userIdList) {
 | 
					 | 
				
			||||||
            if (!processedBySet.contains(userId)) {
 | 
					 | 
				
			||||||
                FlowUser flowUser = new FlowUser();
 | 
					 | 
				
			||||||
                flowUser.setType(TaskAssigneeType.APPROVER.getCode());
 | 
					 | 
				
			||||||
                flowUser.setProcessedBy(String.valueOf(userId));
 | 
					 | 
				
			||||||
                flowUser.setAssociated(taskId);
 | 
					 | 
				
			||||||
                list.add(flowUser);
 | 
					 | 
				
			||||||
                processedBySet.add(String.valueOf(userId));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return list;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 发送消息
 | 
					     * 发送消息
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ import org.dromara.common.core.validate.EditGroup;
 | 
				
			|||||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
					import org.dromara.common.mybatis.core.page.PageQuery;
 | 
				
			||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
					import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
				
			||||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
					import org.dromara.common.satoken.utils.LoginHelper;
 | 
				
			||||||
 | 
					import org.dromara.warm.flow.core.FlowEngine;
 | 
				
			||||||
import org.dromara.warm.flow.core.dto.FlowParams;
 | 
					import org.dromara.warm.flow.core.dto.FlowParams;
 | 
				
			||||||
import org.dromara.warm.flow.core.entity.*;
 | 
					import org.dromara.warm.flow.core.entity.*;
 | 
				
			||||||
import org.dromara.warm.flow.core.enums.NodeType;
 | 
					import org.dromara.warm.flow.core.enums.NodeType;
 | 
				
			||||||
@@ -155,6 +156,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
            String notice = completeTaskBo.getNotice();
 | 
					            String notice = completeTaskBo.getNotice();
 | 
				
			||||||
            // 获取抄送人
 | 
					            // 获取抄送人
 | 
				
			||||||
            List<FlowCopyBo> flowCopyList = completeTaskBo.getFlowCopyList();
 | 
					            List<FlowCopyBo> flowCopyList = completeTaskBo.getFlowCopyList();
 | 
				
			||||||
 | 
					            // 设置抄送人
 | 
				
			||||||
 | 
					            completeTaskBo.getVariables().put("flowCopyList", flowCopyList);
 | 
				
			||||||
 | 
					            // 消息类型
 | 
				
			||||||
 | 
					            completeTaskBo.getVariables().put("messageType", messageType);
 | 
				
			||||||
 | 
					            // 消息通知
 | 
				
			||||||
 | 
					            completeTaskBo.getVariables().put("notice", notice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            FlowTask flowTask = flowTaskMapper.selectById(taskId);
 | 
					            FlowTask flowTask = flowTaskMapper.selectById(taskId);
 | 
				
			||||||
            if (ObjectUtil.isNull(flowTask)) {
 | 
					            if (ObjectUtil.isNull(flowTask)) {
 | 
				
			||||||
                throw new ServiceException("流程任务不存在或任务已审批!");
 | 
					                throw new ServiceException("流程任务不存在或任务已审批!");
 | 
				
			||||||
@@ -180,12 +189,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
                .hisStatus(TaskStatusEnum.PASS.getStatus())
 | 
					                .hisStatus(TaskStatusEnum.PASS.getStatus())
 | 
				
			||||||
                .hisTaskExt(completeTaskBo.getFileId());
 | 
					                .hisTaskExt(completeTaskBo.getFileId());
 | 
				
			||||||
            // 执行任务跳转,并根据返回的处理人设置下一步处理人
 | 
					            // 执行任务跳转,并根据返回的处理人设置下一步处理人
 | 
				
			||||||
            Instance instance = taskService.skip(taskId, flowParams);
 | 
					            taskService.skip(taskId, flowParams);
 | 
				
			||||||
            this.setHandler(instance, flowTask, flowCopyList);
 | 
					 | 
				
			||||||
            // 消息通知
 | 
					 | 
				
			||||||
            flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
 | 
					 | 
				
			||||||
            //设置下一环节处理人
 | 
					 | 
				
			||||||
            setNextHandler(ins.getId(), completeTaskBo.getAssigneeMap());
 | 
					 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            log.error(e.getMessage(), e);
 | 
					            log.error(e.getMessage(), e);
 | 
				
			||||||
@@ -193,33 +197,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 设置下一环节处理人
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param instanceId  实例ID
 | 
					 | 
				
			||||||
     * @param assigneeMap 办理人
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void setNextHandler(Long instanceId, Map<String, Object> assigneeMap) {
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(assigneeMap)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Instance inst = insService.getById(instanceId);
 | 
					 | 
				
			||||||
        List<FlowTask> flowTaskList = selectByInstId(instanceId);
 | 
					 | 
				
			||||||
        Map<String, Object> variableMap = inst.getVariableMap();
 | 
					 | 
				
			||||||
        for (FlowTask task : flowTaskList) {
 | 
					 | 
				
			||||||
            if (variableMap != null && variableMap.containsKey(task.getNodeCode())) {
 | 
					 | 
				
			||||||
                String userIds = variableMap.get(task.getNodeCode()).toString();
 | 
					 | 
				
			||||||
                // 批量删除现有任务的办理人记录
 | 
					 | 
				
			||||||
                flwCommonService.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
 | 
					 | 
				
			||||||
                // 批量新增任务办理人记录
 | 
					 | 
				
			||||||
                Set<User> users = flwCommonService.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
 | 
					 | 
				
			||||||
                flwCommonService.getFlowUserService().saveBatch(new ArrayList<>(users));
 | 
					 | 
				
			||||||
                variableMap.remove(task.getNodeCode());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        taskService.mergeVariable(inst, variableMap);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 设置弹窗处理人
 | 
					     * 设置弹窗处理人
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -251,54 +228,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
        return map;
 | 
					        return map;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 设置办理人
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param instance     实例
 | 
					 | 
				
			||||||
     * @param task         (当前任务)未办理的任务
 | 
					 | 
				
			||||||
     * @param flowCopyList 抄送人
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void setHandler(Instance instance, FlowTask task, List<FlowCopyBo> flowCopyList) {
 | 
					 | 
				
			||||||
        if (ObjectUtil.isNull(instance)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 添加抄送人
 | 
					 | 
				
			||||||
        this.setCopy(task, flowCopyList);
 | 
					 | 
				
			||||||
        // 根据流程实例ID查询所有关联的任务
 | 
					 | 
				
			||||||
        List<FlowTask> flowTasks = this.selectByInstId(instance.getId());
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(flowTasks)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId);
 | 
					 | 
				
			||||||
        // 获取与当前任务关联的用户列表
 | 
					 | 
				
			||||||
        List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(associatedUsers)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        List<User> userList = new ArrayList<>();
 | 
					 | 
				
			||||||
        // 遍历任务列表,处理每个任务的办理人
 | 
					 | 
				
			||||||
        for (FlowTask flowTask : flowTasks) {
 | 
					 | 
				
			||||||
            List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId()));
 | 
					 | 
				
			||||||
            if (CollUtil.isNotEmpty(users)) {
 | 
					 | 
				
			||||||
                userList.addAll(flwCommonService.buildUser(users, flowTask.getId()));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 批量删除现有任务的办理人记录
 | 
					 | 
				
			||||||
        flwCommonService.getFlowUserService().deleteByTaskIds(taskIdList);
 | 
					 | 
				
			||||||
        // 确保要保存的 userList 不为空
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(userList)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        flwCommonService.getFlowUserService().saveBatch(userList);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 添加抄送人
 | 
					     * 添加抄送人
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param task         任务信息
 | 
					     * @param task         任务信息
 | 
				
			||||||
     * @param flowCopyList 抄送人
 | 
					     * @param flowCopyList 抄送人
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void setCopy(FlowTask task, List<FlowCopyBo> flowCopyList) {
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void setCopy(Task task, List<FlowCopyBo> flowCopyList) {
 | 
				
			||||||
        if (CollUtil.isEmpty(flowCopyList)) {
 | 
					        if (CollUtil.isEmpty(flowCopyList)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -329,7 +266,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
                return flowUser;
 | 
					                return flowUser;
 | 
				
			||||||
            }).collect(Collectors.toList());
 | 
					            }).collect(Collectors.toList());
 | 
				
			||||||
        // 批量保存抄送人员
 | 
					        // 批量保存抄送人员
 | 
				
			||||||
        flwCommonService.getFlowUserService().saveBatch(userList);
 | 
					        FlowEngine.userService().saveBatch(userList);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -456,21 +393,25 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
            Instance inst = insService.getById(task.getInstanceId());
 | 
					            Instance inst = insService.getById(task.getInstanceId());
 | 
				
			||||||
            BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
 | 
					            BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
 | 
				
			||||||
            Long definitionId = task.getDefinitionId();
 | 
					            Long definitionId = task.getDefinitionId();
 | 
				
			||||||
            Definition definition = defService.getById(definitionId);
 | 
					 | 
				
			||||||
            String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
 | 
					            String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Map<String, Object> variable = new HashMap<>();
 | 
				
			||||||
 | 
					            // 设置抄送人
 | 
				
			||||||
 | 
					            variable.put("flowCopyList", bo.getMessageType());
 | 
				
			||||||
 | 
					            // 消息类型
 | 
				
			||||||
 | 
					            variable.put("messageType", messageType);
 | 
				
			||||||
 | 
					            // 消息通知
 | 
				
			||||||
 | 
					            variable.put("notice", notice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            FlowParams flowParams = FlowParams.build()
 | 
					            FlowParams flowParams = FlowParams.build()
 | 
				
			||||||
                .nodeCode(bo.getNodeCode())
 | 
					                .nodeCode(bo.getNodeCode())
 | 
				
			||||||
 | 
					                .variable(variable)
 | 
				
			||||||
                .message(message)
 | 
					                .message(message)
 | 
				
			||||||
                .skipType(SkipType.REJECT.getKey())
 | 
					                .skipType(SkipType.REJECT.getKey())
 | 
				
			||||||
                .flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus())
 | 
					                .flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus())
 | 
				
			||||||
                .hisStatus(TaskStatusEnum.BACK.getStatus())
 | 
					                .hisStatus(TaskStatusEnum.BACK.getStatus())
 | 
				
			||||||
                .hisTaskExt(bo.getFileId());
 | 
					                .hisTaskExt(bo.getFileId());
 | 
				
			||||||
            taskService.skip(task.getId(), flowParams);
 | 
					            taskService.skip(task.getId(), flowParams);
 | 
				
			||||||
 | 
					 | 
				
			||||||
            Instance instance = insService.getById(inst.getId());
 | 
					 | 
				
			||||||
            this.setHandler(instance, task, null);
 | 
					 | 
				
			||||||
            // 消息通知
 | 
					 | 
				
			||||||
            flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
 | 
					 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            log.error(e.getMessage(), e);
 | 
					            log.error(e.getMessage(), e);
 | 
				
			||||||
@@ -745,7 +686,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
            List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
 | 
					            List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
 | 
				
			||||||
            // 批量删除现有任务的办理人记录
 | 
					            // 批量删除现有任务的办理人记录
 | 
				
			||||||
            if (CollUtil.isNotEmpty(flowTasks)) {
 | 
					            if (CollUtil.isNotEmpty(flowTasks)) {
 | 
				
			||||||
                flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
 | 
					                FlowEngine.userService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
 | 
				
			||||||
                List<User> userList = flowTasks.stream()
 | 
					                List<User> userList = flowTasks.stream()
 | 
				
			||||||
                    .map(flowTask -> {
 | 
					                    .map(flowTask -> {
 | 
				
			||||||
                        FlowUser flowUser = new FlowUser();
 | 
					                        FlowUser flowUser = new FlowUser();
 | 
				
			||||||
@@ -756,7 +697,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
                    })
 | 
					                    })
 | 
				
			||||||
                    .collect(Collectors.toList());
 | 
					                    .collect(Collectors.toList());
 | 
				
			||||||
                if (CollUtil.isNotEmpty(userList)) {
 | 
					                if (CollUtil.isNotEmpty(userList)) {
 | 
				
			||||||
                    flwCommonService.getFlowUserService().saveBatch(userList);
 | 
					                    FlowEngine.userService().saveBatch(userList);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
@@ -775,13 +716,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
    public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
 | 
					    public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
 | 
				
			||||||
        Map<Long, List<UserDTO>> map = new HashMap<>();
 | 
					        Map<Long, List<UserDTO>> map = new HashMap<>();
 | 
				
			||||||
        // 获取与当前任务关联的用户列表
 | 
					        // 获取与当前任务关联的用户列表
 | 
				
			||||||
        List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
 | 
					        List<User> associatedUsers = FlowEngine.userService().getByAssociateds(taskIdList);
 | 
				
			||||||
        Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
 | 
					        Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
 | 
				
			||||||
        for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
 | 
					        for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
 | 
				
			||||||
            List<User> value = entry.getValue();
 | 
					            List<User> value = entry.getValue();
 | 
				
			||||||
            if (CollUtil.isNotEmpty(value)) {
 | 
					            if (CollUtil.isNotEmpty(value)) {
 | 
				
			||||||
                List<UserDTO> userDTOS = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy())));
 | 
					                List<UserDTO> userDtoList = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy())));
 | 
				
			||||||
                map.put(entry.getKey(), userDTOS);
 | 
					                map.put(entry.getKey(), userDtoList);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return map;
 | 
					        return map;
 | 
				
			||||||
@@ -795,7 +736,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<UserDTO> currentTaskAllUser(Long taskId) {
 | 
					    public List<UserDTO> currentTaskAllUser(Long taskId) {
 | 
				
			||||||
        // 获取与当前任务关联的用户列表
 | 
					        // 获取与当前任务关联的用户列表
 | 
				
			||||||
        List<User> userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
 | 
					        List<User> userList = FlowEngine.userService().getByAssociateds(Collections.singletonList(taskId));
 | 
				
			||||||
        if (CollUtil.isEmpty(userList)) {
 | 
					        if (CollUtil.isEmpty(userList)) {
 | 
				
			||||||
            return Collections.emptyList();
 | 
					            return Collections.emptyList();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user