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