From f789ecf41863d6bb6f8d19186cbd18513fe67021 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 14 Dec 2024 00:30:41 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwTaskController.java | 3 +- .../workflow/domain/bo/BackProcessBo.java | 5 ++ .../workflow/domain/bo/CompleteTaskBo.java | 5 ++ .../handler/FlowProcessEventHandler.java | 1 + .../listener/WorkflowGlobalListener.java | 1 + .../workflow/service/IFlwTaskService.java | 2 +- .../service/impl/FlwTaskServiceImpl.java | 23 ++++++-- .../dromara/workflow/utils/WorkflowUtils.java | 58 ++++++++++++++++++- 8 files changed, 89 insertions(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 7c430788f..1e14130ec 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -11,6 +11,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.warm.flow.core.entity.HisTask; +import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; @@ -182,7 +183,7 @@ public class FlwTaskController extends BaseController { * @param instanceId 实例id */ @GetMapping("/getBackTaskNode/{instanceId}") - public R> getBackTaskNode(@PathVariable String instanceId) { + public R> getBackTaskNode(@PathVariable String instanceId) { return R.ok(flwTaskService.getBackTaskNode(instanceId)); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index 60bd30feb..80b9691d9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -46,6 +46,11 @@ public class BackProcessBo implements Serializable { */ private String message; + /** + * 通知 + */ + private String notice; + /** * 流程变量 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index b6d4cce1e..255ee54a0 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -49,6 +49,11 @@ public class CompleteTaskBo implements Serializable { */ private String message; + /** + * 消息通知 + */ + private String notice; + /** * 流程变量 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java index 16592ceee..f0ae46d20 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/FlowProcessEventHandler.java @@ -43,6 +43,7 @@ public class FlowProcessEventHandler { * @param businessKey 业务id */ public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessKey) { + log.info("发布流程任务事件, 流程编码: {}, 业务ID: {}", flowCode, businessKey); ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); processTaskEvent.setFlowCode(flowCode); processTaskEvent.setNodeCode(nodeCode); 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 58bd348a0..c4b8a4db6 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,6 +14,7 @@ import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.handler.FlowProcessEventHandler; import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwTaskService; +import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Component; import java.util.List; 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 ba0436a44..7d9e08bea 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 @@ -105,7 +105,7 @@ public interface IFlwTaskService { * @param instanceId 实例id * @return 结果 */ - List getBackTaskNode(String instanceId); + List getBackTaskNode(String instanceId); /** * 终止任务 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 21c901a88..43061e30d 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 @@ -130,6 +130,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { try { // 获取任务ID并查询对应的流程任务和实例信息 Long taskId = completeTaskBo.getTaskId(); + List messageType = completeTaskBo.getMessageType(); + String notice = completeTaskBo.getNotice(); // 获取抄送人 List wfCopyList = completeTaskBo.getWfCopyList(); FlowTask flowTask = flowTaskMapper.selectById(taskId); @@ -150,6 +152,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.hisTaskExt(completeTaskBo.getFileId()); // 执行任务跳转,并根据返回的处理人设置下一步处理人 setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList); + //消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -323,11 +327,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { public boolean backProcess(BackProcessBo bo) { try { Long taskId = bo.getTaskId(); + String notice = bo.getNotice(); + List messageType = bo.getMessageType(); List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); if (CollUtil.isEmpty(flowTasks)) { throw new ServiceException("任务不存在!"); } Long definitionId = flowTasks.get(0).getDefinitionId(); + Definition definition = defService.getById(definitionId); List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); //开始节点的下一节点 @@ -347,6 +354,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { flowParams.nodeCode(bo.getNodeCode()); Instance instance = taskService.skip(taskId, flowParams); setHandler(instance, flowTasks.get(0), null); + //消息通知 + WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -360,20 +369,24 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService { * @param instanceId 实例id */ @Override - public List getBackTaskNode(String instanceId) { + public List getBackTaskNode(String instanceId) { // 创建查询条件,查询历史任务记录 LambdaQueryWrapper lw = new LambdaQueryWrapper<>(FlowHisTask.class) + .select(FlowHisTask::getNodeCode, FlowHisTask::getNodeName) .eq(FlowHisTask::getInstanceId, instanceId) .eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey()) .orderByDesc(FlowHisTask::getCreateTime); + List flowHisTasks = flowHisTaskMapper.selectList(lw); if (CollUtil.isEmpty(flowHisTasks)) { return Collections.emptyList(); } - // 直接返回去重后的列表 - return flowHisTasks.stream() - .distinct() - .collect(Collectors.toList()); + return new ArrayList<>(flowHisTasks.stream() + .collect(Collectors.toMap( + FlowHisTask::getNodeCode, + task -> task, + (existing, replacement) -> existing + )).values()); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 4d47eeee3..1452d82f7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -1,12 +1,22 @@ package org.dromara.workflow.utils; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; 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.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.User; +import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; +import org.dromara.workflow.common.enums.MessageTypeEnum; +import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IWfTaskAssigneeService; import java.util.*; @@ -20,6 +30,8 @@ import java.util.stream.Collectors; */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WorkflowUtils { + public static final IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); + public static final IFlwTaskService iFlwTaskService = SpringUtils.getBean(IFlwTaskService.class); /** * 获取办理人 @@ -31,7 +43,6 @@ public class WorkflowUtils { if (CollUtil.isEmpty(userList)) { return Collections.emptyList(); } - IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); // 获取所有用户的 UserDTO 列表 return userList.stream() .map(User::getProcessedBy) @@ -52,7 +63,6 @@ public class WorkflowUtils { return Set.of(); } Set list = new HashSet<>(); - IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class); for (User user : userList) { // 根据 processedBy 前缀判断处理人类型,分别获取用户列表 List users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy()); @@ -70,4 +80,48 @@ public class WorkflowUtils { return list; } + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public static void sendMessage(String flowName, Long instId, List messageType, String message) { + List userList = new ArrayList<>(); + List list = iFlwTaskService.selectByInstId(instId); + if (StringUtils.isBlank(message)) { + message = "有新的【" + flowName + "】单据已经提交至您的待办,请您及时处理。"; + } + for (Task task : list) { + List users = iFlwTaskService.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: + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(new ArrayList<>(StreamUtils.toList(userList, UserDTO::getUserId))); + dto.setMessage(message); + WebSocketUtils.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); + } + } + } + } + } + }