Commit 773d0941441fcdcb93aaeb97097f152515649c7e
1 parent
a0be8e29
fix(im): 修复群备注首屏展示和聊天列表名称覆盖
- 后端群 VO 返回当前用户维度的 groupRemark 和 silent - 群列表构建时通过成员关系回填个人群设置,并继续仅对有效成员回填置顶消息 - Vue3 群列表同步时以接口返回的个人群设置为准,只保留成员缓存 - 会话名写入入口统一使用 getGroupDisplayName,避免群备注被原群名覆盖 - 空群头像且成员未加载时异步预拉群成员,用于合成群头像 - 启用 IM Maven 模块和 yudao-server 对 IM 模块的依赖
Showing
2 changed files
with
14 additions
and
3 deletions
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 | +} |