Commit ab35a13fc40560623f5c523d8f182a9cfc3ffe3e

Authored by YunaiV
1 parent 4ab95695

📝 docs(diff): 更新私聊已读位置文档,明确不再通过 HTTP 读取 maxReadId

yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java
@@ -105,8 +105,9 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { @@ -105,8 +105,9 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService {
105 privateMessageMapper.updateByIdsAndStatus(messageIds, ImMessageStatusEnum.UNREAD.getStatus(), 105 privateMessageMapper.updateByIdsAndStatus(messageIds, ImMessageStatusEnum.UNREAD.getStatus(),
106 new ImPrivateMessageDO().setStatus(ImMessageStatusEnum.READ.getStatus())); 106 new ImPrivateMessageDO().setStatus(ImMessageStatusEnum.READ.getStatus()));
107 107
108 - // 2. 异步发送 READ + RECEIPT 事件  
109 - getSelf().readPrivateMessageEvent(userId, receiverId); 108 + // 2. 异步发送 READ + RECEIPT 事件(携带已读位置)
  109 + Long maxReadId = CollUtil.max(messageIds);
  110 + getSelf().readPrivateMessageEvent(userId, receiverId, maxReadId);
110 } 111 }
111 112
112 @Override 113 @Override
@@ -134,8 +135,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { @@ -134,8 +135,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService {
134 .setStatus(ImMessageStatusEnum.RECALL.getStatus())); 135 .setStatus(ImMessageStatusEnum.RECALL.getStatus()));
135 136
136 // 3. 插入一条 TIP_TEXT 消息作为撤回提示 137 // 3. 插入一条 TIP_TEXT 消息作为撤回提示
137 - RecallMessage recallContent = new RecallMessage()  
138 - .setMessageId(messageId); 138 + RecallMessage recallContent = new RecallMessage().setMessageId(messageId);
139 ImPrivateMessageDO tipMessage = new ImPrivateMessageDO().setClientMessageId(IdUtil.fastSimpleUUID()) 139 ImPrivateMessageDO tipMessage = new ImPrivateMessageDO().setClientMessageId(IdUtil.fastSimpleUUID())
140 .setSenderId(userId).setReceiverId(message.getReceiverId()) 140 .setSenderId(userId).setReceiverId(message.getReceiverId())
141 .setType(ImMessageTypeEnum.TIP_TEXT.getType()).setContent(JsonUtils.toJsonString(recallContent)) 141 .setType(ImMessageTypeEnum.TIP_TEXT.getType()).setContent(JsonUtils.toJsonString(recallContent))
@@ -152,14 +152,14 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { @@ -152,14 +152,14 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService {
152 */ 152 */
153 @Async 153 @Async
154 public void sendPrivateMessageEvent(ImPrivateMessageDO message) { 154 public void sendPrivateMessageEvent(ImPrivateMessageDO message) {
155 - ImPrivateMessageSendMessage websocketMessage = BeanUtils.toBean(message, ImPrivateMessageSendMessage.class); 155 + ImPrivateMessageDTO dto = ImPrivateMessageDTO.ofSend(message);
156 // 推送给接收方 156 // 推送给接收方
157 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), message.getReceiverId(), 157 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), message.getReceiverId(),
158 - ImPrivateMessageSendMessage.TYPE, websocketMessage); 158 + ImPrivateMessageDTO.TYPE, dto);
159 159
160 // 推送给发送方自己的其他终端(多端同步) 160 // 推送给发送方自己的其他终端(多端同步)
161 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), message.getSenderId(), 161 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), message.getSenderId(),
162 - ImPrivateMessageSendMessage.TYPE, websocketMessage); 162 + ImPrivateMessageDTO.TYPE, dto);
163 } 163 }
164 164
165 /** 165 /**
@@ -167,18 +167,17 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { @@ -167,18 +167,17 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService {
167 * 167 *
168 * @param userId 当前用户编号 168 * @param userId 当前用户编号
169 * @param receiverId 对方用户编号 169 * @param receiverId 对方用户编号
  170 + * @param maxReadId 已读位置(最大已读消息编号)
170 */ 171 */
171 @Async 172 @Async
172 - public void readPrivateMessageEvent(Long userId, Long receiverId) { 173 + public void readPrivateMessageEvent(Long userId, Long receiverId, Long maxReadId) {
173 // 1. 发送 READ 事件给自己的其他终端(多端同步) 174 // 1. 发送 READ 事件给自己的其他终端(多端同步)
174 - ImMessageReadMessage readMessage = new ImMessageReadMessage()  
175 - .setReceiverId(receiverId).setScene(ImMessageSceneEnum.PRIVATE.getScene()); 175 + ImPrivateMessageDTO readDto = ImPrivateMessageDTO.ofRead(userId, receiverId, maxReadId);
176 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, 176 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId,
177 - ImMessageReadMessage.TYPE, readMessage); 177 + ImPrivateMessageDTO.TYPE, readDto);
178 178
179 // 2. 发送 RECEIPT 事件给对方(已读回执) 179 // 2. 发送 RECEIPT 事件给对方(已读回执)
180 - ImMessageReceiptMessage receiptMessage = new ImMessageReceiptMessage()  
181 - .setReceiverId(userId).setScene(ImMessageSceneEnum.PRIVATE.getScene()); 180 + ImPrivateMessageDTO receiptDto = ImPrivateMessageDTO.ofReceipt(userId, receiverId, maxReadId);
182 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), receiverId, 181 webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), receiverId,
183 ImPrivateMessageDTO.TYPE, receiptDto); 182 ImPrivateMessageDTO.TYPE, receiptDto);
184 } 183 }