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");