From 17187f647ce0e8818da5fbaf46f91445fbaeca1f Mon Sep 17 00:00:00 2001 From: warm <290631660@qq.com> Date: Fri, 16 May 2025 10:40:39 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E6=A8=A1=E5=9D=97=E4=B8=8B=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E6=8C=87=E5=AE=9A=E5=8A=9E=E7=90=86=E4=BA=BA?= =?UTF-8?q?=E3=80=81=E8=A7=92=E8=89=B2=E5=92=8C=E9=83=A8=E9=97=A8=E8=BD=AC?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E7=94=A8=E6=88=B7=E3=80=81=E6=8A=84=E9=80=81?= =?UTF-8?q?=E4=BA=BA=E5=92=8C=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E5=88=B0=E9=80=9A=E8=BF=87=E5=85=A8=E5=B1=80=E5=88=86?= =?UTF-8?q?=E6=B4=BE=E7=9B=91=E5=90=AC=E5=99=A8=E5=92=8C=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/WorkflowGlobalListener.java | 47 +++++++- .../workflow/service/IFlwCommonService.java | 16 +-- .../workflow/service/IFlwTaskService.java | 9 ++ .../service/impl/FlwCommonServiceImpl.java | 66 ++--------- .../service/impl/FlwTaskServiceImpl.java | 106 ++++-------------- 5 files changed, 86 insertions(+), 158 deletions(-) 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..5934a3c1a 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,14 +14,15 @@ 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; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 全局任务办理监听 @@ -37,6 +38,7 @@ public class WorkflowGlobalListener implements GlobalListener { private final IFlwTaskService taskService; private final IFlwInstanceService instanceService; private final FlowProcessEventHandler flowProcessEventHandler; + private final IFlwCommonService flwCommonService; /** * 创建监听器,任务创建时执行 @@ -70,6 +72,26 @@ public class WorkflowGlobalListener implements GlobalListener { */ @Override public void assignment(ListenerVariable listenerVariable) { + Map variable = listenerVariable.getVariable(); + List nextTasks = listenerVariable.getNextTasks(); + FlowParams flowParams = listenerVariable.getFlowParams(); + + 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); + } + } + } } /** @@ -96,6 +118,25 @@ 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); + // 消息通知 + flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + variable.remove("flowCopyList"); + 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 4d3540b91..4f5ef6bce 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,12 +1,10 @@ package org.dromara.workflow.service; import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.core.service.UserService; import java.util.List; import java.util.Map; -import java.util.Set; /** * 通用 工作流服务 @@ -25,20 +23,10 @@ public interface IFlwCommonService { /** * 构建工作流用户 * - * @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 8e9c5096c..282ff9752 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 @@ -15,16 +15,13 @@ import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.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.core.utils.MapUtil; 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; @@ -58,67 +55,20 @@ public class FlwCommonServiceImpl implements IFlwCommonService { /** * 构建工作流用户 * - * @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); - /** - * 构建工作流用户 - * - * @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; + return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId())); } /** 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 0cdabbf4a..2ea66d256 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 @@ -155,6 +155,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 +188,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 +196,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()); - } - } - flwCommonService.mergeVariable(inst, variableMap); - } - /** * 设置弹窗处理人 * @@ -251,54 +227,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; } @@ -456,21 +392,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); @@ -780,8 +720,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { 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;