diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java index 59b435d..c778a31 100644 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java +++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java @@ -26,10 +26,14 @@ public enum ImMessageTypeEnum implements ArrayValuable { RECEIPT(12, "回执"), // 暂无 TIP_TEXT(21, "提示文本"), // 对应 TextMessage 类 - RECALL(10, "撤回"), - READ(11, "已读"), - RECEIPT(12, "回执"), - TIP_TEXT(21, "提示文本"); + // ==================== 非单聊、群聊存储的类型,100 开始 ==================== + + FRIEND_ADD(100, "好友添加"), // 暂无 + FRIEND_DELETE(101, "好友删除"), // 暂无 + FRIEND_UPDATE(102, "好友更新"), // 对应 FriendUpdateMessage 类 + + GROUP_CREATE(200, "群创建"), // 暂无 + GROUP_UPDATE(201, "群信息变更"); // 暂无 public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImMessageTypeEnum::getType).toArray(Integer[]::new); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/message/GroupMessageReadRedisDAO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/message/GroupMessageReadRedisDAO.java index 3bc2159..4ef7dc3 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/message/GroupMessageReadRedisDAO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/message/GroupMessageReadRedisDAO.java @@ -61,6 +61,27 @@ public class GroupMessageReadRedisDAO { return result; } + /** + * 删除用户在某群的已读位置 + * + * @param groupId 群编号 + * @param userId 用户编号 + */ + public void deleteReadMaxMessageId(Long groupId, Long userId) { + String key = formatKey(groupId); + stringRedisTemplate.opsForHash().delete(key, userId.toString()); + } + + /** + * 删除某群所有用户的已读位置(整个 Hash Key) + * + * @param groupId 群编号 + */ + public void deleteReadMaxMessageIdMap(Long groupId) { + String key = formatKey(groupId); + stringRedisTemplate.delete(key); + } + private static String formatKey(Long groupId) { return String.format(GROUP_MESSAGE_READ, groupId); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java index f38e546..33cc814 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java @@ -73,7 +73,6 @@ public class ImGroupMemberServiceImpl implements ImGroupMemberService { return imGroupMemberMapper.selectById(id); } - @Override public List getGroupMemberListByGroupId(Long groupId) { return imGroupMemberMapper.selectListByGroupId(groupId); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java index 359907d..e64a68a 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupUpdateReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import cn.iocoder.yudao.module.im.dal.mysql.group.ImGroupMapper; +import cn.iocoder.yudao.module.im.service.message.ImGroupMessageService; import cn.iocoder.yudao.module.im.service.websocket.ImWebSocketService; import cn.iocoder.yudao.module.im.service.websocket.dto.ImGroupMessageDTO; import jakarta.annotation.Resource; @@ -33,7 +34,6 @@ import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.GROUP; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; // TODO @芋艿:群主的调整,暂时不考虑。后续在弄; -// DONE @AI:groupdo 增加一个缓存;spring cache 实现; /** * 群 Service 实现类 * @@ -50,6 +50,9 @@ public class ImGroupServiceImpl implements ImGroupService { @Lazy // 避免循环依赖 private ImGroupMemberService groupMemberService; @Resource + @Lazy // 避免循环依赖 + private ImGroupMessageService groupMessageService; + @Resource private ImWebSocketService webSocketService; @Override @@ -125,7 +128,8 @@ public class ImGroupServiceImpl implements ImGroupService { updateObj.setDissolvedTime(LocalDateTime.now()); groupMapper.updateById(updateObj); - // TODO @AI:清理已读缓存; + // 4. 清理已读缓存 + groupMessageService.deleteReadMaxMessageIdMap(id); // TODO @AI:推送群解散的提示; // TODO @AI:推送群信息变化; } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java index 4cac3e8..0b6e53f 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageService.java @@ -69,4 +69,24 @@ public interface ImGroupMessageService { */ List getGroupMessageList(Long userId, ImGroupMessageListReqVO reqVO); + /** + * 清理用户在某群的已读位置缓存 + *

+ * 用于成员退群场景 + * + * @param groupId 群编号 + * @param userId 用户编号 + */ + void deleteReadMaxMessageId(Long groupId, Long userId); + + /** + * 清理某群所有用户的已读位置缓存 + *

+ * 用于群解散场景 + * + * @param groupId 群编号 + */ + void deleteReadMaxMessageIdMap(Long groupId); + } + diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java index 6efc128..43b3998 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java @@ -471,9 +471,18 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { member -> isMessageVisible(msg, member, member.getUserId())); } + @Override + public void deleteReadMaxMessageId(Long groupId, Long userId) { + groupMessageReadRedisDAO.deleteReadMaxMessageId(groupId, userId); + } + + @Override + public void deleteReadMaxMessageIdMap(Long groupId) { + groupMessageReadRedisDAO.deleteReadMaxMessageIdMap(groupId); + } private ImGroupMessageServiceImpl getSelf() { return SpringUtil.getBean(getClass()); } -} +} \ No newline at end of file