diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index b6bdfa268..a46cbc5b3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -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.orm.entity.FlowTask; 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.service.IFlwCommonService; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; import org.springframework.stereotype.Component; @@ -37,6 +40,7 @@ public class WorkflowGlobalListener implements GlobalListener { private final IFlwTaskService taskService; private final IFlwInstanceService instanceService; private final FlowProcessEventHandler flowProcessEventHandler; + private final IFlwCommonService flwCommonService; /** * 创建监听器,任务创建时执行 @@ -70,6 +74,32 @@ public class WorkflowGlobalListener implements GlobalListener { */ @Override public void assignment(ListenerVariable listenerVariable) { + Map variable = listenerVariable.getVariable(); + List 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 permissionList = flowTask.getPermissionList(); + if (CollUtil.isNotEmpty(permissionList)) { + List 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)) { 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 variable = listenerVariable.getVariable(); + List flowCopyList = (List) variable.get("flowCopyList"); + List messageType = (List) 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"); + } + } } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java index 26997fa9b..662d599eb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwCommonService.java @@ -1,10 +1,6 @@ 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; /** * 通用 工作流服务 @@ -13,30 +9,13 @@ import java.util.Set; */ public interface IFlwCommonService { - /** - * 获取工作流用户service - * - * @return 工作流用户service - */ - UserService getFlowUserService(); - /** * 构建工作流用户 * - * @param userList 办理用户 - * @param taskId 任务ID + * @param permissionList 办理用户 * @return 用户 */ - Set buildUser(List userList, Long taskId); - - /** - * 构建工作流用户 - * - * @param userIdList 办理用户 - * @param taskId 任务ID - * @return 用户 - */ - Set buildFlowUser(List userIdList, Long taskId); + List buildUser(List permissionList); /** * 发送消息 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index fcb078295..e172c001a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -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.TableDataInfo; 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.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; @@ -38,6 +39,14 @@ public interface IFlwTaskService { */ boolean completeTask(CompleteTaskBo completeTaskBo); + /** + * 添加抄送人 + * + * @param task 任务信息 + * @param flowCopyList 抄送人 + */ + void setCopy(Task task, List flowCopyList); + /** * 查询当前用户的待办任务 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java index 878d4f4cc..e6dc8155d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwCommonServiceImpl.java @@ -13,21 +13,18 @@ import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.utils.SseMessageUtils; 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.SkipType; 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.FlowUser; 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.*; +import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; @@ -41,82 +38,27 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Service public class FlwCommonServiceImpl implements IFlwCommonService { - private final UserService userService; private final NodeService nodeService; - /** - * 获取工作流用户service - */ - @Override - public UserService getFlowUserService() { - return userService; - } - /** * 构建工作流用户 * - * @param userList 办理用户 - * @param taskId 任务ID + * @param permissionList 办理用户 * @return 用户 */ @Override - public Set buildUser(List userList, Long taskId) { - if (CollUtil.isEmpty(userList)) { - return Set.of(); + public List buildUser(List permissionList) { + if (CollUtil.isEmpty(permissionList)) { + return List.of(); } - Set list = new HashSet<>(); - Set processedBySet = new HashSet<>(); IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class); - Map> userListMap = StreamUtils.groupByKey(userList, User::getType); - for (Map.Entry> entry : userListMap.entrySet()) { - List entryValue = entry.getValue(); - String processedBys = StreamUtils.join(entryValue, User::getProcessedBy); - // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 - List 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; + String processedBys = CollUtil.join(permissionList, StringUtils.SEPARATOR); + // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 + List users = taskAssigneeService.fetchUsersByStorageIds(processedBys); + + return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId())); } - /** - * 构建工作流用户 - * - * @param userIdList 办理用户 - * @param taskId 任务ID - * @return 用户 - */ - @Override - public Set buildFlowUser(List userIdList, Long taskId) { - if (CollUtil.isEmpty(userIdList)) { - return Set.of(); - } - Set list = new HashSet<>(); - Set 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; - } /** * 发送消息 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index be64dcbbc..1457f1d71 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -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.TableDataInfo; 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.entity.*; import org.dromara.warm.flow.core.enums.NodeType; @@ -155,6 +156,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { String notice = completeTaskBo.getNotice(); // 获取抄送人 List flowCopyList = completeTaskBo.getFlowCopyList(); + // 设置抄送人 + completeTaskBo.getVariables().put("flowCopyList", flowCopyList); + // 消息类型 + completeTaskBo.getVariables().put("messageType", messageType); + // 消息通知 + completeTaskBo.getVariables().put("notice", notice); + + FlowTask flowTask = flowTaskMapper.selectById(taskId); if (ObjectUtil.isNull(flowTask)) { throw new ServiceException("流程任务不存在或任务已审批!"); @@ -180,12 +189,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { .hisStatus(TaskStatusEnum.PASS.getStatus()) .hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 - Instance instance = taskService.skip(taskId, flowParams); - this.setHandler(instance, flowTask, flowCopyList); - // 消息通知 - flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); - //设置下一环节处理人 - setNextHandler(ins.getId(), completeTaskBo.getAssigneeMap()); + taskService.skip(taskId, flowParams); return true; } catch (Exception 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 assigneeMap) { - if (CollUtil.isEmpty(assigneeMap)) { - return; - } - Instance inst = insService.getById(instanceId); - List flowTaskList = selectByInstId(instanceId); - Map 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 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; } - /** - * 设置办理人 - * - * @param instance 实例 - * @param task (当前任务)未办理的任务 - * @param flowCopyList 抄送人 - */ - private void setHandler(Instance instance, FlowTask task, List flowCopyList) { - if (ObjectUtil.isNull(instance)) { - return; - } - // 添加抄送人 - this.setCopy(task, flowCopyList); - // 根据流程实例ID查询所有关联的任务 - List flowTasks = this.selectByInstId(instance.getId()); - if (CollUtil.isEmpty(flowTasks)) { - return; - } - List taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId); - // 获取与当前任务关联的用户列表 - List associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList); - if (CollUtil.isEmpty(associatedUsers)) { - return; - } - List userList = new ArrayList<>(); - // 遍历任务列表,处理每个任务的办理人 - for (FlowTask flowTask : flowTasks) { - List 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 flowCopyList 抄送人 */ - public void setCopy(FlowTask task, List flowCopyList) { + @Override + public void setCopy(Task task, List flowCopyList) { if (CollUtil.isEmpty(flowCopyList)) { return; } @@ -329,7 +266,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { return flowUser; }).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()); BusinessStatusEnum.checkBackStatus(inst.getFlowStatus()); Long definitionId = task.getDefinitionId(); - Definition definition = defService.getById(definitionId); String applyNodeCode = flwCommonService.applyNodeCode(definitionId); + + Map variable = new HashMap<>(); + // 设置抄送人 + variable.put("flowCopyList", bo.getMessageType()); + // 消息类型 + variable.put("messageType", messageType); + // 消息通知 + variable.put("notice", notice); + FlowParams flowParams = FlowParams.build() .nodeCode(bo.getNodeCode()) + .variable(variable) .message(message) .skipType(SkipType.REJECT.getKey()) .flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus()) .hisStatus(TaskStatusEnum.BACK.getStatus()) .hisTaskExt(bo.getFileId()); 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; } catch (Exception e) { log.error(e.getMessage(), e); @@ -745,7 +686,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List flowTasks = this.selectByIdList(taskIdList); // 批量删除现有任务的办理人记录 if (CollUtil.isNotEmpty(flowTasks)) { - flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); + FlowEngine.userService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); List userList = flowTasks.stream() .map(flowTask -> { FlowUser flowUser = new FlowUser(); @@ -756,7 +697,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { }) .collect(Collectors.toList()); if (CollUtil.isNotEmpty(userList)) { - flwCommonService.getFlowUserService().saveBatch(userList); + FlowEngine.userService().saveBatch(userList); } } } catch (Exception e) { @@ -775,13 +716,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { public Map> currentTaskAllUser(List taskIdList) { Map> map = new HashMap<>(); // 获取与当前任务关联的用户列表 - List associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList); + List associatedUsers = FlowEngine.userService().getByAssociateds(taskIdList); Map> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); for (Map.Entry> entry : listMap.entrySet()) { List value = entry.getValue(); if (CollUtil.isNotEmpty(value)) { - List userDTOS = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); - map.put(entry.getKey(), userDTOS); + List userDtoList = userService.selectListByIds(StreamUtils.toList(value, e -> Long.valueOf(e.getProcessedBy()))); + map.put(entry.getKey(), userDtoList); } } return map; @@ -795,7 +736,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public List currentTaskAllUser(Long taskId) { // 获取与当前任务关联的用户列表 - List userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId)); + List userList = FlowEngine.userService().getByAssociateds(Collections.singletonList(taskId)); if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); }