Browse Source

优化流程消息提示推送

hubin 9 months ago
parent
commit
16f90aed43

+ 12 - 2
src/main/java/com/aizuda/boot/modules/flw/flow/FlowTaskListener.java

@@ -5,6 +5,7 @@ import com.aizuda.boot.modules.flw.entity.ApprovalContent;
 import com.aizuda.boot.modules.flw.entity.FlwProcessApproval;
 import com.aizuda.boot.modules.flw.service.IFlwProcessApprovalService;
 import com.aizuda.boot.modules.system.entity.enums.BusinessType;
+import com.aizuda.boot.modules.system.service.ISysUserRoleService;
 import com.aizuda.bpm.engine.FlowLongEngine;
 import com.aizuda.bpm.engine.core.FlowCreator;
 import com.aizuda.bpm.engine.core.enums.*;
@@ -31,6 +32,8 @@ public class FlowTaskListener implements TaskListener {
     private FlowLongEngine flowLongEngine;
     @Resource
     private ApplicationEventPublisher applicationEventPublisher;
+    @Resource
+    private ISysUserRoleService userRoleService;
 
 
     @Override
@@ -197,16 +200,23 @@ public class FlowTaskListener implements TaskListener {
     public void sendMessage(FlwTask flwTask, FlowCreator flowCreator) {
         Optional<List<FlwTaskActor>> taskActorsOptional = flowLongEngine.queryService().getActiveTaskActorsByTaskId(flwTask.getId());
         if (taskActorsOptional.isPresent()) {
+            List<FlwTaskActor> flwTaskActors = taskActorsOptional.get();
+            List<Long> actorIds = flwTaskActors.stream().map(t -> Long.valueOf(t.getActorId())).toList();
+            FlwTaskActor fta = flwTaskActors.get(0);
+            if (ActorType.role.eq(fta.getActorType())) {
+                // 流程任务处理者为角色情况,查询对应用户ID列表
+                actorIds = userRoleService.listUserIdsByRoleIds(actorIds);
+            }
             // 发送消息
             MessageEvent messageEvent = new MessageEvent();
             messageEvent.setTitle("待处理任务:" + flwTask.getTaskName());
-            messageEvent.setContent(messageEvent.getTitle());
+            messageEvent.setContent(messageEvent.getTitle() + " 发起人:" + flowCreator.getCreateBy());
             messageEvent.setCreateId(Long.valueOf(flowCreator.getCreateId()));
             messageEvent.setCreateBy(flowCreator.getCreateBy());
             messageEvent.setCategory(2);
             messageEvent.setBusinessId(flwTask.getId());
             messageEvent.setBusinessType(BusinessType.flowTask.name());
-            messageEvent.setUserIds(taskActorsOptional.get().stream().map(t -> Long.valueOf(t.getActorId())).toList());
+            messageEvent.setUserIds(actorIds);
             applicationEventPublisher.publishEvent(messageEvent);
         }
     }

+ 9 - 0
src/main/java/com/aizuda/boot/modules/system/service/ISysSSEService.java

@@ -28,4 +28,13 @@ public interface ISysSSEService {
      * @param message   消息内容
      */
     boolean send(Long userId, String eventName, String message);
+
+    /**
+     * 指定用户ID SSE 推送提醒消息
+     *
+     * @param userId  用户ID
+     * @param title   消息标题
+     * @param content 消息内容
+     */
+    boolean sendRemind(Long userId, String title, String content);
 }

+ 7 - 0
src/main/java/com/aizuda/boot/modules/system/service/ISysUserRoleService.java

@@ -33,6 +33,13 @@ public interface ISysUserRoleService extends IBaseService<SysUserRole> {
      */
     List<Long> listRoleIdsByUserId(Long userId);
 
+    /**
+     * 根据角色ID列表查询关联用户ID列表
+     *
+     * @param roleIds 角色ID列表
+     */
+    List<Long> listUserIdsByRoleIds(List<Long> roleIds);
+
     /**
      * 判断是否存在关联角色
      *

+ 2 - 1
src/main/java/com/aizuda/boot/modules/system/service/impl/SysMessageServiceImpl.java

@@ -9,6 +9,7 @@ import com.aizuda.boot.modules.system.mapper.SysMessageMapper;
 import com.aizuda.boot.modules.system.service.ISysMessageReceiverService;
 import com.aizuda.boot.modules.system.service.ISysMessageService;
 import com.aizuda.boot.modules.system.service.ISysSSEService;
+import com.aizuda.boot.modules.system.service.ISysUserRoleService;
 import com.aizuda.core.api.ApiAssert;
 import com.aizuda.service.service.BaseServiceImpl;
 import com.aizuda.service.web.UserSession;
@@ -99,7 +100,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<SysMessageMapper, Sys
                 receiver.setMessageId(message.getId());
                 receiver.setUserId(userId);
                 // 发送消息
-                if (sseService.send(userId, event.getTitle(), event.getContent())) {
+                if (sseService.sendRemind(userId, event.getTitle(), event.getContent())) {
                     receiver.setSendStatus(1);
                 } else {
                     receiver.setSendStatus(2);

+ 21 - 0
src/main/java/com/aizuda/boot/modules/system/service/impl/SysSSEServiceImpl.java

@@ -6,11 +6,13 @@
 package com.aizuda.boot.modules.system.service.impl;
 
 import com.aizuda.boot.modules.system.service.ISysSSEService;
+import com.aizuda.common.toolkit.JacksonUtils;
 import com.aizuda.service.web.UserSession;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -76,4 +78,23 @@ public class SysSSEServiceImpl implements ISysSSEService {
         }
         return result;
     }
+
+    @Override
+    public boolean sendRemind(Long userId, String title, String content) {
+        return this.send(userId, "remind", this.toMessage(title, content));
+    }
+
+    /**
+     * 组装消息
+     *
+     * @param title   消息标题
+     * @param content 消息内容
+     * @return 实际发送消息内容
+     */
+    private String toMessage(String title, String content) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("title", title);
+        map.put("content", content);
+        return JacksonUtils.toJson(map);
+    }
 }

+ 7 - 0
src/main/java/com/aizuda/boot/modules/system/service/impl/SysUserRoleServiceImpl.java

@@ -68,6 +68,13 @@ public class SysUserRoleServiceImpl extends BaseServiceImpl<SysUserRoleMapper, S
         return CollectionUtils.isEmpty(sysUserRoleList) ? null : sysUserRoleList.stream().map(SysUserRole::getRoleId).toList();
     }
 
+    @Override
+    public List<Long> listUserIdsByRoleIds(List<Long> roleIds) {
+        List<SysUserRole> sysUserRoleList = super.list(Wrappers.<SysUserRole>lambdaQuery()
+                .select(SysUserRole::getUserId).in(SysUserRole::getRoleId, roleIds));
+        return CollectionUtils.isEmpty(sysUserRoleList) ? null : sysUserRoleList.stream().map(SysUserRole::getUserId).toList();
+    }
+
     @Override
     public boolean existRelByRoleId(Long roleId) {
         return lambdaQuery().eq(SysUserRole::getRoleId, roleId).count() > 0;