From a2bf33874db0fe9badc774dcc6e3a00256b3d031 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 6 Jan 2026 14:36:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bx/imclient/sender/IMSender.java | 52 +++++++++---------- .../com/bx/implatform/contant/Constant.java | 20 +++++++ .../impl/ThirdPrivateMsgServiceImpl.java | 7 ++- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java index 1ced811..e036e5e 100644 --- a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java +++ b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java @@ -29,13 +29,13 @@ public class IMSender { private final MessageListenerMulticaster listenerMulticaster; - public void sendSystemMessage(IMSystemMessage message){ + public void sendSystemMessage(IMSystemMessage message) { // 根据群聊每个成员所连的IM-server,进行分组 Map sendMap = new HashMap<>(); for (Integer terminal : message.getRecvTerminals()) { message.getRecvIds().forEach(id -> { String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, id.toString(), terminal.toString()); - sendMap.put(key,new IMUserInfo(id, terminal)); + sendMap.put(key, new IMUserInfo(id, terminal)); }); } // 批量拉取 @@ -44,8 +44,8 @@ public class IMSender { Map> serverMap = new HashMap<>(); List offLineUsers = new LinkedList<>(); int idx = 0; - for (Map.Entry entry : sendMap.entrySet()) { - Integer serverId = (Integer)serverIds.get(idx++); + for (Map.Entry entry : sendMap.entrySet()) { + Integer serverId = (Integer) serverIds.get(idx++); if (!Objects.isNull(serverId)) { List list = serverMap.computeIfAbsent(serverId, o -> new LinkedList<>()); list.add(entry.getValue()); @@ -67,7 +67,7 @@ public class IMSender { redisMQTemplate.opsForList().rightPush(key, recvInfo); } // 对离线用户回复消息状态 - if(message.getSendResult() && !offLineUsers.isEmpty()){ + if (message.getSendResult() && !offLineUsers.isEmpty()) { List results = new LinkedList<>(); for (IMUserInfo offLineUser : offLineUsers) { IMSendResult result = new IMSendResult(); @@ -81,13 +81,13 @@ public class IMSender { } - public void sendPrivateMessage(IMPrivateMessage message) { + public void sendPrivateMessage(IMPrivateMessage message) { List results = new LinkedList<>(); - if(!Objects.isNull(message.getRecvId())){ + if (!Objects.isNull(message.getRecvId())) { for (Integer terminal : message.getRecvTerminals()) { // 获取对方连接的channelId String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString()); - Integer serverId = (Integer)redisMQTemplate.opsForValue().get(key); + Integer serverId = (Integer) redisMQTemplate.opsForValue().get(key); // 如果对方在线,将数据存储至redis,等待拉取推送 if (serverId != null) { String sendKey = String.join(":", IMRedisKey.IM_MESSAGE_PRIVATE_QUEUE, serverId.toString()); @@ -111,14 +111,14 @@ public class IMSender { } // 推送给自己的其他终端 - if(message.getSendToSelf()){ + if (message.getSendToSelf()) { for (Integer terminal : IMTerminalType.codes()) { if (message.getSender().getTerminal().equals(terminal)) { continue; } // 获取终端连接的channelId String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getSender().getId().toString(), terminal.toString()); - Integer serverId = (Integer)redisMQTemplate.opsForValue().get(key); + Integer serverId = (Integer) redisMQTemplate.opsForValue().get(key); // 如果终端在线,将数据存储至redis,等待拉取推送 if (serverId != null) { String sendKey = String.join(":", IMRedisKey.IM_MESSAGE_PRIVATE_QUEUE, serverId.toString()); @@ -134,19 +134,19 @@ public class IMSender { } } // 对离线用户回复消息状态 - if(message.getSendResult() && !results.isEmpty()){ + if (message.getSendResult() && !results.isEmpty()) { listenerMulticaster.multicast(IMListenerType.PRIVATE_MESSAGE, results); } } - public void sendGroupMessage(IMGroupMessage message) { + public void sendGroupMessage(IMGroupMessage message) { // 根据群聊每个成员所连的IM-server,进行分组 Map sendMap = new HashMap<>(); for (Integer terminal : message.getRecvTerminals()) { message.getRecvIds().forEach(id -> { String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, id.toString(), terminal.toString()); - sendMap.put(key,new IMUserInfo(id, terminal)); + sendMap.put(key, new IMUserInfo(id, terminal)); }); } // 批量拉取 @@ -155,8 +155,8 @@ public class IMSender { Map> serverMap = new HashMap<>(); List offLineUsers = new LinkedList<>(); int idx = 0; - for (Map.Entry entry : sendMap.entrySet()) { - Integer serverId = (Integer)serverIds.get(idx++); + for (Map.Entry entry : sendMap.entrySet()) { + Integer serverId = (Integer) serverIds.get(idx++); if (!Objects.isNull(serverId)) { List list = serverMap.computeIfAbsent(serverId, o -> new LinkedList<>()); list.add(entry.getValue()); @@ -187,7 +187,7 @@ public class IMSender { } // 获取终端连接的channelId String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getSender().getId().toString(), terminal.toString()); - Integer serverId = (Integer)redisMQTemplate.opsForValue().get(key); + Integer serverId = (Integer) redisMQTemplate.opsForValue().get(key); // 如果终端在线,将数据存储至redis,等待拉取推送 if (!Objects.isNull(serverId)) { IMRecvInfo recvInfo = new IMRecvInfo(); @@ -203,7 +203,7 @@ public class IMSender { } } // 对离线用户回复消息状态 - if(message.getSendResult() && !offLineUsers.isEmpty()){ + if (message.getSendResult() && !offLineUsers.isEmpty()) { List results = new LinkedList<>(); for (IMUserInfo offLineUser : offLineUsers) { IMSendResult result = new IMSendResult(); @@ -218,25 +218,25 @@ public class IMSender { } - public Map> getOnlineTerminal(List userIds){ - if(CollUtil.isEmpty(userIds)){ + public Map> getOnlineTerminal(List userIds) { + if (CollUtil.isEmpty(userIds)) { return Collections.emptyMap(); } // 把所有用户的key都存起来 - Map userMap = new HashMap<>(); - for(Long id:userIds){ + Map userMap = new HashMap<>(); + for (Long id : userIds) { for (Integer terminal : IMTerminalType.codes()) { String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, id.toString(), terminal.toString()); - userMap.put(key,new IMUserInfo(id,terminal)); + userMap.put(key, new IMUserInfo(id, terminal)); } } // 批量拉取 List serverIds = redisMQTemplate.opsForValue().multiGet(userMap.keySet()); int idx = 0; - Map> onlineMap = new HashMap<>(); - for (Map.Entry entry : userMap.entrySet()) { + Map> onlineMap = new HashMap<>(); + for (Map.Entry entry : userMap.entrySet()) { // serverid有值表示用户在线 - if(serverIds.get(idx++) != null){ + if (serverIds.get(idx++) != null) { IMUserInfo userInfo = entry.getValue(); List terminals = onlineMap.computeIfAbsent(userInfo.getId(), o -> new LinkedList<>()); terminals.add(IMTerminalType.fromCode(userInfo.getTerminal())); @@ -256,7 +256,7 @@ public class IMSender { return !Objects.requireNonNull(redisMQTemplate.keys(key)).isEmpty(); } - public List getOnlineUser(List userIds){ + public List getOnlineUser(List userIds) { return new LinkedList<>(getOnlineTerminal(userIds).keySet()); } } diff --git a/im-platform/src/main/java/com/bx/implatform/contant/Constant.java b/im-platform/src/main/java/com/bx/implatform/contant/Constant.java index d255ba3..51ca31d 100644 --- a/im-platform/src/main/java/com/bx/implatform/contant/Constant.java +++ b/im-platform/src/main/java/com/bx/implatform/contant/Constant.java @@ -1,5 +1,7 @@ package com.bx.implatform.contant; +import java.util.List; + public final class Constant { /** @@ -30,4 +32,22 @@ public final class Constant { */ public static final Long MAX_NORMAL_GROUP_MEMBER = 500L; + /** + * 消息通知用户id + */ + public static final Long COM_MESSAGE_USER_ID = -100L; + public static final String COM_MESSAGE_USER_NAME = "消息通知"; + public static final String COM_MESSAGE_USER_AVATAR = "https://chatapi.zianxin.com/admin-api/infra/file/4/get/3dab7a0921d4d2ea6f7daee399114e9241145e754f7a1e4e1a955fada4542116.png"; + + /** + * 客服用户id + */ + public static final Long COM_SERVICE_USER_ID = -200L; + public static final String COM_SERVICE_USER_NAME = "荷塘月色客服"; + public static final String COM_SERVICE_USER_AVATAR = "https://chatapi.zianxin.com/admin-api/infra/file/4/get/b85e0bc2e4338c9919ac13e1f12cb3ac40dc7ba807a0e65ef83c822ef7d2f1a2.png"; + + /** + * 忽略的用户id + */ + public static final List IGNORE_USER_IDS = List.of(SYS_USER_ID, COM_MESSAGE_USER_ID, COM_SERVICE_USER_ID); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdPrivateMsgServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdPrivateMsgServiceImpl.java index 5fb2665..efd2090 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdPrivateMsgServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/third/impl/ThirdPrivateMsgServiceImpl.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.imclient.IMClient; import com.bx.imcommon.model.IMPrivateMessage; import com.bx.imcommon.model.IMUserInfo; +import com.bx.implatform.contant.Constant; import com.bx.implatform.dto.MessageTotalDto; import com.bx.implatform.dto.third.privatemsg.ThirdPrivateMessageCountDTO; import com.bx.implatform.dto.third.privatemsg.ThirdPrivateMessageDTO; @@ -70,8 +71,10 @@ public class ThirdPrivateMsgServiceImpl extends ServiceImpl