diff --git a/yudao-module-im/yudao-module-im-biz/pom.xml b/yudao-module-im/yudao-module-im-biz/pom.xml index 2e71782..4f51712 100644 --- a/yudao-module-im/yudao-module-im-biz/pom.xml +++ b/yudao-module-im/yudao-module-im-biz/pom.xml @@ -23,6 +23,11 @@ yudao-module-im-api ${revision} + + cn.iocoder.boot + yudao-module-system + ${revision} + diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java index eeee448..fdded32 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java @@ -43,9 +43,9 @@ public class ImPrivateMessageController { @Operation(summary = "拉取私聊消息(增量)") @Parameter(name = "minId", description = "最小消息 id", required = true, example = "0") @Parameter(name = "size", description = "拉取数量", required = true, example = "100") - public CommonResult> pullPrivateMessages(@RequestParam("minId") Long minId, - @RequestParam("size") Integer size) { - List messages = privateMessageService.pullPrivateMessages(getLoginUserId(), minId, size); + public CommonResult> pullPrivateMessageList(@RequestParam("minId") Long minId, + @RequestParam("size") Integer size) { + List messages = privateMessageService.pullPrivateMessageList(getLoginUserId(), minId, size); return success(BeanUtils.toBean(messages, ImPrivateMessageRespVO.class)); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImPrivateMessageMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImPrivateMessageMapper.java index 1d63e8f..4628d83 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImPrivateMessageMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImPrivateMessageMapper.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.message; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImPrivateMessageDO; import org.apache.ibatis.annotations.Mapper; @@ -24,18 +25,15 @@ public interface ImPrivateMessageMapper extends BaseMapperX * @return 消息列表 */ default List selectListByMinId(Long userId, Long minId, Integer size) { - return selectList(new LambdaQueryWrapperX() - .and(w -> w.eq(ImPrivateMessageDO::getSenderId, userId) - .or() - .eq(ImPrivateMessageDO::getReceiverId, userId)) - .gt(ImPrivateMessageDO::getId, minId) - .orderByAsc(ImPrivateMessageDO::getId) - .last("LIMIT " + size)); + QueryWrapperX wrapper = new QueryWrapperX<>(); + wrapper.and(w -> w.eq("sender_id", userId) + .or().eq("receiver_id", userId)) + .gt("id", minId) + .orderByAsc("id"); + wrapper.limitN(size); + return selectList(wrapper); } - /** - * 根据 senderId 和 clientMessageId 查询(幂等校验) - */ default ImPrivateMessageDO selectBySenderIdAndClientMessageId(Long senderId, String clientMessageId) { return selectOne(new LambdaQueryWrapperX() .eq(ImPrivateMessageDO::getSenderId, senderId) diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java index c4e5d24..2d2fea3 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageService.java @@ -29,7 +29,7 @@ public interface ImPrivateMessageService { * @param size 拉取数量 * @return 消息列表 */ - List pullPrivateMessages(Long userId, Long minId, Integer size); + List pullPrivateMessageList(Long userId, Long minId, Integer size); /** * 标记私聊消息已读 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java index dc0ba05..8c06c4f 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java @@ -81,29 +81,36 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { } @Override - public List pullPrivateMessages(Long userId, Long minId, Integer size) { + public List pullPrivateMessageList(Long userId, Long minId, Integer size) { if (size > MAX_PULL_SIZE) { throw exception(MESSAGE_PULL_SIZE_EXCEEDED); } - return privateMessageMapper.selectListByMinId(userId, minId, size); + List messages = privateMessageMapper.selectListByMinId(userId, minId, size); + log.info("[pullPrivateMessageList][userId({}) minId({}) size({}) result({})]", + userId, minId, size, messages.size()); + return messages; } - // DONE @芋艿:已 review,逻辑正确 + // TODO @AI:应该是将 friendId 改成 receiverId,毕竟消息是发给对方的 @Override public void readPrivateMessages(Long userId, Long friendId) { // 1. 批量更新消息状态为已读 + // TODO @AI:先查询;然后在 update;避免锁的问题; + // TODO @AI:注意,update 的时候,也要 id in、status =,最后 updateObj 传入;避免并发问题; int updated = privateMessageMapper.updateStatusToRead(userId, friendId); if (updated == 0) { return; // 没有需要更新的消息 } - // 2. 发送 READ 事件给自己的其他终端(多端同步) + + // TODO @AI:继续 async ! + // 2.1 发送 READ 事件给自己的其他终端(多端同步) ImMessageReadMessage readMessage = new ImMessageReadMessage() .setFriendId(friendId.toString()) .setMessageScene("private"); webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, ImMessageReadMessage.TYPE, readMessage); - // 3. 发送 RECEIPT 事件给对方(已读回执) + // 2.2 发送 RECEIPT 事件给对方(已读回执) ImMessageReceiptMessage receiptMessage = new ImMessageReceiptMessage() .setUserId(userId.toString()) .setMessageScene("private");