From b4781dcc5a4954effefc402ac24b09d0b76107ef Mon Sep 17 00:00:00 2001 From: chen zida Date: Tue, 5 Dec 2023 15:47:29 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E4=BC=9A=E8=AF=9D=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/controller/MessageController.java | 19 ++- .../dao/mapper/ImMessageHistoryMapper.java | 2 +- .../model/resp/ImMessageHistoryVo.java | 1 + .../message/service/MessageSyncService.java | 123 +++++++++--------- 4 files changed, 70 insertions(+), 75 deletions(-) diff --git a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/controller/MessageController.java b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/controller/MessageController.java index bca58b0..4e5437c 100644 --- a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/controller/MessageController.java +++ b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/controller/MessageController.java @@ -6,7 +6,6 @@ import com.lld.im.common.model.SyncReq; import com.lld.im.common.model.message.CheckSendMessageReq; import com.lld.im.service.message.model.req.SendMessageReq; import com.lld.im.service.message.model.resp.ImMessageHistoryVo; -import com.lld.im.service.message.model.resp.SendMessageResp; import com.lld.im.service.message.service.MessageService; import com.lld.im.service.message.service.MessageSyncService; import com.lld.im.service.message.service.P2PMessageService; @@ -38,11 +37,11 @@ public class MessageController { @Autowired MessageService messageService; - @RequestMapping("/queryMsgDetailsByMessageKey") - public ResponseVO queryMsgDetailsByMessageKey(@RequestBody @Validated SendMessageResp req, Integer appId) { - req.setAppId(appId); - return ResponseVO.successResponse(messageService.queryMsgDetailsByMessageKey(req.getMessageKey())); - } +// @RequestMapping("/queryMsgDetailsByMessageKey") +// public ResponseVO queryMsgDetailsByMessageKey(@RequestBody @Validated SendMessageResp req, Integer appId) { +// req.setAppId(appId); +// return ResponseVO.successResponse(messageService.queryMsgDetailsByMessageKey(req.getMessageKey())); +// } @RequestMapping("/send") public ResponseVO send(@RequestBody @Validated SendMessageReq req, Integer appId) { @@ -73,12 +72,12 @@ public class MessageController { public ResponseVO listMessage(@RequestBody @Validated SyncReq req, Integer appId) { req.setAppId(appId); - List objects = messageSyncService.listSession(req); - return null; + List objects = messageSyncService.listSession(req); + return ResponseVO.successResponse(objects); } /** - * 获取会话列表 + * 获取历史记录 * @param chatHistoryReq * @param appId * @return @@ -87,8 +86,6 @@ public class MessageController { public ResponseVO chatHistory(@RequestBody @Validated ChatHistoryReq chatHistoryReq, Integer appId) { - - chatHistoryReq.setAppId(appId); List imMessageHistoryVos = messageSyncService.chatHistory(chatHistoryReq); return ResponseVO.successResponse(imMessageHistoryVos); diff --git a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/dao/mapper/ImMessageHistoryMapper.java b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/dao/mapper/ImMessageHistoryMapper.java index ae23ab1..39f96f4 100644 --- a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/dao/mapper/ImMessageHistoryMapper.java +++ b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/dao/mapper/ImMessageHistoryMapper.java @@ -19,6 +19,6 @@ public interface ImMessageHistoryMapper extends BaseMapper entityList); - @Select("select from_id,to_id,max(message_key) messageKey from im_message_history where owner_id = #{operater} group by from_id,to_id") + @Select("select from_id,to_id,max(message_key) message_key from im_message_history where owner_id = #{operater} group by from_id,to_id") List selectMessageByOwnId(String operater); } diff --git a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/model/resp/ImMessageHistoryVo.java b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/model/resp/ImMessageHistoryVo.java index c30664f..a664d32 100644 --- a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/model/resp/ImMessageHistoryVo.java +++ b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/model/resp/ImMessageHistoryVo.java @@ -11,5 +11,6 @@ import lombok.Data; public class ImMessageHistoryVo extends ImMessageHistoryEntity { private String messageBody; + private Long num = 0L; } diff --git a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/service/MessageSyncService.java b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/service/MessageSyncService.java index be6744a..81c1477 100644 --- a/hs-im-server/im-service/src/main/java/com/lld/im/service/message/service/MessageSyncService.java +++ b/hs-im-server/im-service/src/main/java/com/lld/im/service/message/service/MessageSyncService.java @@ -1,5 +1,6 @@ package com.lld.im.service.message.service; +import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -40,10 +41,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -163,13 +161,9 @@ public class MessageSyncService { return ResponseVO.successResponse(resp); } - public List listSession(SyncReq req){ - List listOfflineMessage = listOfflineMessage(req); - - List listReadMessage = listReadMessage(req); - Map collect = listReadMessage.stream().collect(Collectors.toMap(ImMessageHistoryEntity::getOwnerId, ImMessageHistoryEntity::getMessageKey)); - - return null; + public List listSession(SyncReq req){ + List listReadMessage = listReadMessage(req); + return listReadMessage; } public List chatHistory(ChatHistoryReq chatHistoryReq){ @@ -208,73 +202,76 @@ public class MessageSyncService { } - /** - * 获取离线消息 - * @param req - * @return - */ - public List listOfflineMessage(SyncReq req) { - String key = req.getAppId() + ":" + Constants.RedisConstants.OfflineMessage + ":" + req.getOperater(); - //获取最大的seq - Long maxSeq = 0L; - ZSetOperations zSetOperations = redisTemplate.opsForZSet(); - Set set = zSetOperations.reverseRangeWithScores(key, 0, 0); - if(!CollectionUtils.isEmpty(set)){ - List list = new ArrayList(set); - DefaultTypedTuple o = (DefaultTypedTuple) list.get(0); - maxSeq = o.getScore().longValue(); - } - - List respList = new ArrayList<>(); - - Set querySet = zSetOperations.rangeByScoreWithScores(key, - req.getLastSequence(), maxSeq, 0, -1); - for (ZSetOperations.TypedTuple typedTuple : querySet) { - String value = typedTuple.getValue(); - OfflineMessageContent offlineMessageContent = JSONObject.parseObject(value, OfflineMessageContent.class); - respList.add(offlineMessageContent); - } - -// -// List imMessageBodyIds = new ArrayList<>(); -// Map toIdMap = respList.stream().collect(Collectors.toMap(OfflineMessageContent::getToId, x -> x)); -// Map> toIdMap2 = respList.stream(). -// collect(Collectors.groupingBy(x -> x.getFromId() + "-"+ x.getToId(),Collectors.maxBy(Comparator.comparingLong(OfflineMessageContent::getMessageKey)))); -// for (OfflineMessageContent offlineMessageContent : respList) { -// OfflineMessageContent messageKey1 = toIdMap.get(offlineMessageContent.getToId()); -// if (messageKey1 != null){ -// imMessageBodyIds.add(messageKey1.getMessageKey() > offlineMessageContent.getMessageKey() ? messageKey1 : offlineMessageContent); -// } -// } - - return respList; - } - /** * 获取已读消息 * @param req * @return */ - public List listReadMessage(SyncReq req) { - List imMessageHistoryEntities = imMessageHistoryMapper.selectMessageByOwnId(req.getOperater()); - List imMessageBodyIds = new ArrayList<>(); + public List listReadMessage(SyncReq req) { + List sessionVos = new ArrayList<>(); - Map fromIdMap = imMessageHistoryEntities.stream() + List imMessageHistoryEntities = imMessageHistoryMapper.selectMessageByOwnId(req.getOperater()); + // map fromId去除本人 + Map fromIdMap = imMessageHistoryEntities.stream() .filter(x -> !StringUtils.equals(x.getFromId(),req.getOperater())) - .collect(Collectors.toMap(ImMessageHistoryEntity::getFromId, ImMessageHistoryEntity::getMessageKey)); - Map toIdMap = imMessageHistoryEntities.stream() + .collect(Collectors.toMap(ImMessageHistoryEntity::getFromId, x -> x)); + // map toId去除本人 + Map toIdMap = imMessageHistoryEntities.stream() .filter(x -> !StringUtils.equals(x.getToId(),req.getOperater())) - .collect(Collectors.toMap(ImMessageHistoryEntity::getToId, ImMessageHistoryEntity::getMessageKey)); + .collect(Collectors.toMap(ImMessageHistoryEntity::getToId, x -> x)); + // 合并map到toId fromIdMap.forEach((key,value) -> { toIdMap.merge(key,value,(x,y) -> { - if (value > y) return value; + if (value.getMessageKey() > y.getMessageKey()) return value; return y; }); }); - List imMessageBodyEntities = imMessageBodyMapper.selectList(new LambdaQueryWrapper().in(ImMessageBodyEntity::getMessageKey, imMessageBodyIds)); - return null; + Collection messageKeys = toIdMap.values().stream().map(ImMessageHistoryEntity::getMessageKey).collect(Collectors.toList()); + if (CollUtil.isEmpty(messageKeys)){ + return sessionVos; + } + List imMessageBodyEntities = imMessageBodyMapper.selectList( + new LambdaQueryWrapper().in(ImMessageBodyEntity::getMessageKey, messageKeys)); + Map collect = imMessageBodyEntities.stream() + .collect(Collectors.toMap(ImMessageBodyEntity::getMessageKey, ImMessageBodyEntity::getMessageBody)); + + // 设置消息体 + List collect1 = toIdMap.values().stream().collect(Collectors.toList()); + for (ImMessageHistoryEntity imMessageHistoryEntity : collect1) { + ImMessageHistoryEntity imMessageHistoryEntity1 = imMessageHistoryMapper.selectOne(new LambdaQueryWrapper() + .eq(ImMessageHistoryEntity::getMessageKey, imMessageHistoryEntity.getMessageKey()) + .eq(ImMessageHistoryEntity::getOwnerId,req.getOperater())); + ImMessageHistoryVo imMessageHistoryVo = BeanCopyUtils.copy(imMessageHistoryEntity1,ImMessageHistoryVo.class); + String s = collect.get(imMessageHistoryEntity.getMessageKey()); + imMessageHistoryVo.setMessageBody(s); + sessionVos.add(imMessageHistoryVo); + } + + // 设置未读数量(未读消息都是fromId为别人的) + String key = req.getAppId() + ":" + Constants.RedisConstants.OfflineMessage + ":" + req.getOperater(); + ZSetOperations zSetOperations = redisTemplate.opsForZSet(); + Set querySet = zSetOperations.range(key, 0, -1); + + for (ImMessageHistoryVo sessionVo : sessionVos) { + for (String value : querySet) { + OfflineMessageContent offlineMessageContent = JSONObject.parseObject(value, OfflineMessageContent.class); + if ((StringUtils.equals(sessionVo.getFromId(),offlineMessageContent.getFromId()) && + StringUtils.equals(sessionVo.getToId(),offlineMessageContent.getToId())) || + (StringUtils.equals(sessionVo.getFromId(),offlineMessageContent.getToId()) && + StringUtils.equals(sessionVo.getToId(),offlineMessageContent.getFromId()))){ + sessionVo.setNum(sessionVo.getNum() + 1); + } + } + } + sessionVos.sort(new Comparator() { + @Override + public int compare(ImMessageHistoryVo o1, ImMessageHistoryVo o2) { + return o1.getCreateTime().compareTo(o2.getCreateTime()); + } + }); + return sessionVos; } //修改历史消息的状态