From 788c24dff4f57baf0743f03519f2f849e3a8c9e1 Mon Sep 17 00:00:00 2001 From: dylanmay <670374839@qq.com> Date: Sat, 26 Oct 2024 19:42:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E5=92=8C=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImConversationController.java | 50 ++++++++++++++++++- .../conversation/vo/ImConversationRespVO.java | 12 +++++ .../admin/message/ImMessageController.java | 14 ++++-- .../message/vo/ImMessageListByNoReqVO.java | 28 +++++++++++ .../admin/message/vo/ImMessageListReqVO.java | 8 +++ .../admin/message/vo/ImMessageSendReqVO.java | 4 ++ .../conversation/ImConversationService.java | 2 +- .../ImConversationServiceImpl.java | 18 ++++++- .../im/service/message/ImMessageService.java | 13 ++++- .../service/message/ImMessageServiceImpl.java | 18 +++++-- 10 files changed, 152 insertions(+), 15 deletions(-) create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListByNoReqVO.java diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java index 112866ec2d..f678038f26 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java @@ -5,8 +5,14 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO; import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListByNoReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum; import cn.iocoder.yudao.module.im.service.conversation.ImConversationService; +import cn.iocoder.yudao.module.im.service.message.ImMessageService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -15,6 +21,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Objects; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -28,11 +35,50 @@ public class ImConversationController { @Resource private ImConversationService imConversationService; + @Resource + private ImMessageService imMessageService; + + @Resource + AdminUserApi adminUserApi; + @GetMapping("/list") @Operation(summary = "获得用户的会话列表") public CommonResult> getConversationList() { - List conversationList = imConversationService.getConversationList(); - return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class)); + List conversationList = imConversationService.getConversationList(getLoginUserId()); + List imConversationRespVOList = BeanUtils.toBean(conversationList, ImConversationRespVO.class); + imConversationRespVOList.forEach(item -> { + // 处理个人图像和昵称 + Long receiverId = item.getTargetId(); + AdminUserRespDTO receiverUser = adminUserApi.getUser(receiverId); + if (receiverUser != null) { + item.setAvatar(receiverUser.getAvatar()); + item.setNickname(receiverUser.getNickname()); + } + + // 处理未读消息条数【TODO:】 + + + // 处理最后一条消息描述 + ImMessageListByNoReqVO imMessageListByNoReqVO = new ImMessageListByNoReqVO(); + imMessageListByNoReqVO.setConversationNo(item.getNo()); + List listMessage = imMessageService.getMessageListByConversationNo(imMessageListByNoReqVO); + + if (!listMessage.isEmpty()) { + ImMessageDO lastMessage = listMessage.get(listMessage.size() - 1); + if (lastMessage != null) { + if (Objects.equals(lastMessage.getContentType(), ImMessageContentTypeEnum.TEXT.getType())) { + item.setLastMessageDescription(lastMessage.getContent()); + } else if (Objects.equals(lastMessage.getContentType(), ImMessageContentTypeEnum.PICTURE.getType())) { + item.setLastMessageDescription("[图片]"); + } else { + item.setLastMessageDescription("[未知类型]"); + } + } + } + + + }); + return success(imConversationRespVOList); } @PostMapping("/update-pinned") diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java index 59341145e0..2c1bea549b 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java @@ -35,4 +35,16 @@ public class ImConversationRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; + @Schema(description = "会话接受者头像", requiredMode = Schema.RequiredMode.REQUIRED) + private String avatar; + + @Schema(description = "会话接受者昵称", requiredMode = Schema.RequiredMode.REQUIRED) + private String nickname; + + @Schema(description = "最后一条消息的描述", requiredMode = Schema.RequiredMode.REQUIRED) + private String lastMessageDescription; + + @Schema(description = "未读消息条数", requiredMode = Schema.RequiredMode.REQUIRED) + private String unreadMessagesCount; + } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java index 96451bf215..c70ac94cfc 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.im.controller.admin.message; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendRespVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.*; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; import cn.iocoder.yudao.module.im.service.message.ImMessageService; import io.swagger.v3.oas.annotations.Operation; @@ -50,7 +47,14 @@ public class ImMessageController { @GetMapping("/list") @Operation(summary = "消息列表-根据接收人和发送时间进行分页查询") public CommonResult> getMessageList(@Valid ImMessageListReqVO listReqVO) { - List messagePage = imMessageService.getMessageList(getLoginUserId(), listReqVO); + List messagePage = imMessageService.getMessageList(listReqVO); + return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class)); + } + + @GetMapping("/listByNo") + @Operation(summary = "消息列表-根据接收人和发送时间进行分页查询") + public CommonResult> getMessageListByNo(@Valid ImMessageListByNoReqVO listReqVO) { + List messagePage = imMessageService.getMessageListByConversationNo(listReqVO); return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class)); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListByNoReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListByNoReqVO.java new file mode 100755 index 0000000000..0c10cf5d19 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListByNoReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.im.controller.admin.message.vo; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Schema(description = "管理后台 - 消息列表 Request VO") +@Data +@ToString(callSuper = true) +public class ImMessageListByNoReqVO { + + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime sendTime; + + @Schema(description = "会话编号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") + @NotNull(message = "会话编号不能为空") + private String conversationNo ; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java index ee21ed0eaa..672951bdbf 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java @@ -21,6 +21,10 @@ public class ImMessageListReqVO { @NotNull(message = "接收人编号不能为空") private Long receiverId; + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") + @NotNull(message = "发送人编号不能为空") + private Long senderId; + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @InEnum(value = ImConversationTypeEnum.class,message = "会话类型必须是 {value}") @NotNull(message = "会话类型不能为空") @@ -30,4 +34,8 @@ public class ImMessageListReqVO { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) private LocalDateTime sendTime; + @Schema(description = "会话编号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") + @NotNull(message = "会话编号不能为空") + private String conversationNo ; + } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java index fd04053544..cb8369fc63 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java @@ -24,6 +24,10 @@ public class ImMessageSendReqVO { @NotNull(message = "会话类型不能为空") private Integer conversationType; + @Schema(description = "会话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "会话编号不能为空") + private String conversationNo; + @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @InEnum(ImMessageContentTypeEnum.class) @NotNull(message = "消息类型不能为空") diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java index cf54be3a13..33e8e447b0 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java @@ -18,7 +18,7 @@ public interface ImConversationService { * * @return 会话列表 */ - List getConversationList(); + List getConversationList(Long loginUserId); /** * 置顶会话 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java index 1a8ad08334..121797918b 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java @@ -5,6 +5,8 @@ import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversatio import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO; import cn.iocoder.yudao.module.im.dal.mysql.conversation.ImConversationMapper; import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -24,8 +26,20 @@ public class ImConversationServiceImpl implements ImConversationService { private ImConversationMapper imConversationMapper; @Override - public List getConversationList() { - return imConversationMapper.selectList(); + public List getConversationList(Long loginUserId) { + // 根据loginUserId判断targetId, 自己不能做targetId + // 如何loginUserId和targetId相同,则需要调换userId和targetId + List conversationList = imConversationMapper.selectList(); + // 遍历判断loginUserId和targetId相同,相同则将userId设置为targetId, targetId设置为userId + conversationList.forEach(item -> { + if (item.getTargetId().equals(loginUserId)) { + Long targetId = item.getTargetId(); + Long userId = item.getUserId(); + item.setTargetId(userId); + item.setUserId(targetId); + } + }); + return conversationList; } @Override diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java index acdad2aaa2..f8c5c2422f 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.im.service.message; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListByNoReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO; @@ -16,11 +17,19 @@ public interface ImMessageService { /** * 获得历史消息 * - * @param loginUserId 登录用户编号 * @param listReqVO 分页查询 * @return 消息分页 */ - List getMessageList(Long loginUserId, ImMessageListReqVO listReqVO); + List getMessageList(ImMessageListReqVO listReqVO); + + + /** + * 获得历史消息 + * + * @param listReqVO 分页查询 + * @return 消息分页 + */ + List getMessageListByConversationNo(ImMessageListByNoReqVO listReqVO); /** * 拉取消息-大于 seq 的消息 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java index be10bb4e8a..740a8951ff 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.im.service.message; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListByNoReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; @@ -46,9 +47,9 @@ public class ImMessageServiceImpl implements ImMessageService { private ImGroupMemberService imGroupMemberService; @Override - public List getMessageList(Long loginUserId, ImMessageListReqVO listReqVO) { + public List getMessageList(ImMessageListReqVO listReqVO) { // 1. 获得会话编号 - String no = ImConversationTypeEnum.generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType()); + String no = ImConversationTypeEnum.generateConversationNo(listReqVO.getSenderId(), listReqVO.getReceiverId(), listReqVO.getConversationType()); // 2. 查询历史消息 ImMessageDO message = new ImMessageDO() .setSendTime(listReqVO.getSendTime()) @@ -56,6 +57,17 @@ public class ImMessageServiceImpl implements ImMessageService { return imMessageMapper.selectMessageList(message); } + @Override + public List getMessageListByConversationNo(ImMessageListByNoReqVO listReqVO) { + + // 1. 查询历史消息 + ImMessageDO message = new ImMessageDO() + .setSendTime(listReqVO.getSendTime()) + .setConversationNo(listReqVO.getConversationNo()); + return imMessageMapper.selectMessageList(message); + } + + @Override public List pullMessageList(Long userId, Long sequence, Integer size) { List messageIds = imInboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size); @@ -84,7 +96,7 @@ public class ImMessageServiceImpl implements ImMessageService { ImMessageDO imMessageDO = BeanUtil.copyProperties(message, ImMessageDO.class) .setSenderNickname(fromUser.getNickname()).setSenderAvatar(fromUser.getAvatar()) .setSenderId(fromUserId) - .setConversationNo(ImConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType())) + .setConversationNo(message.getConversationNo()) .setSendFrom(ImMessageSourceEnum.USER_SEND.getSource()) .setMessageStatus(ImMessageStatusEnum.SENDING.getStatus()) .setSendTime(LocalDateTime.now());