Commit 773d0941441fcdcb93aaeb97097f152515649c7e

Authored by YunaiV
1 parent a0be8e29

fix(im): 修复群备注首屏展示和聊天列表名称覆盖

- 后端群 VO 返回当前用户维度的 groupRemark 和 silent
- 群列表构建时通过成员关系回填个人群设置,并继续仅对有效成员回填置顶消息
- Vue3 群列表同步时以接口返回的个人群设置为准,只保留成员缓存
- 会话名写入入口统一使用 getGroupDisplayName,避免群备注被原群名覆盖
- 空群头像且成员未加载时异步预拉群成员,用于合成群头像
- 启用 IM Maven 模块和 yudao-server 对 IM 模块的依赖
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.im.controller.admin.group; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.im.controller.admin.group;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; 8 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
8 import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberInviteReqVO; 9 import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberInviteReqVO;
@@ -187,8 +188,10 @@ public class ImGroupController { @@ -187,8 +188,10 @@ public class ImGroupController {
187 return Collections.emptyList(); 188 return Collections.emptyList();
188 } 189 }
189 // 仅当前用户是有效成员的群才允许回填置顶消息 190 // 仅当前用户是有效成员的群才允许回填置顶消息
190 - Set<Long> activeGroupIds = convertSet(  
191 - groupMemberService.getActiveGroupMemberListByUserId(loginUserId), ImGroupMemberDO::getGroupId); 191 + Map<Long, ImGroupMemberDO> memberMap = convertMap(
  192 + groupMemberService.getGroupMemberListByUserId(loginUserId), ImGroupMemberDO::getGroupId);
  193 + Set<Long> activeGroupIds = convertSet(memberMap.values(), ImGroupMemberDO::getGroupId,
  194 + member -> CommonStatusEnum.ENABLE.getStatus().equals(member.getStatus()));
192 Set<Long> allMessageIds = convertSetByFlatMap(groups, group -> activeGroupIds.contains(group.getId()) 195 Set<Long> allMessageIds = convertSetByFlatMap(groups, group -> activeGroupIds.contains(group.getId())
193 ? CollUtil.emptyIfNull(group.getPinnedMessageIds()).stream() : Stream.empty()); 196 ? CollUtil.emptyIfNull(group.getPinnedMessageIds()).stream() : Stream.empty());
194 Map<Long, ImGroupMessageDO> messageMap = groupMessageService.getGroupMessageMap(allMessageIds); 197 Map<Long, ImGroupMessageDO> messageMap = groupMessageService.getGroupMessageMap(allMessageIds);
@@ -198,6 +201,8 @@ public class ImGroupController { @@ -198,6 +201,8 @@ public class ImGroupController {
198 // 标记登录用户在该群的成员状态,供前端区分当前群与历史退群 201 // 标记登录用户在该群的成员状态,供前端区分当前群与历史退群
199 boolean joined = activeGroupIds.contains(group.getId()); 202 boolean joined = activeGroupIds.contains(group.getId());
200 groupVO.setJoinStatus(joined ? CommonStatusEnum.ENABLE.getStatus() : CommonStatusEnum.DISABLE.getStatus()); 203 groupVO.setJoinStatus(joined ? CommonStatusEnum.ENABLE.getStatus() : CommonStatusEnum.DISABLE.getStatus());
  204 + MapUtils.findAndThen(memberMap, group.getId(), member ->
  205 + groupVO.setGroupRemark(member.getGroupRemark()).setSilent(Boolean.TRUE.equals(member.getSilent())));
201 if (!joined || CollUtil.isEmpty(group.getPinnedMessageIds())) { 206 if (!joined || CollUtil.isEmpty(group.getPinnedMessageIds())) {
202 return groupVO; 207 return groupVO;
203 } 208 }
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/ImGroupRespVO.java
@@ -50,7 +50,13 @@ public class ImGroupRespVO { @@ -50,7 +50,13 @@ public class ImGroupRespVO {
50 @Schema(description = "当前登录用户在该群的成员状态:在群 / 已退群(历史退群群仍返回,供前端展示离线消息的群名 / 头像)") 50 @Schema(description = "当前登录用户在该群的成员状态:在群 / 已退群(历史退群群仍返回,供前端展示离线消息的群名 / 头像)")
51 private Integer joinStatus; // 参见 CommonStatusEnum 枚举 51 private Integer joinStatus; // 参见 CommonStatusEnum 枚举
52 52
  53 + @Schema(description = "当前登录用户对该群的备注")
  54 + private String groupRemark;
  55 +
  56 + @Schema(description = "当前登录用户是否免打扰")
  57 + private Boolean silent;
  58 +
53 @Schema(description = "群置顶消息列表,按 pin 顺序(最先置顶的在前);非该群有效成员时为空") 59 @Schema(description = "群置顶消息列表,按 pin 顺序(最先置顶的在前);非该群有效成员时为空")
54 private List<ImGroupMessageRespVO> pinnedMessages; 60 private List<ImGroupMessageRespVO> pinnedMessages;
55 61
56 -}  
57 \ No newline at end of file 62 \ No newline at end of file
  63 +}