فهرست منبع

会话和消息处理

dylanmay 1 سال پیش
والد
کامیت
788c24dff4
10فایلهای تغییر یافته به همراه152 افزوده شده و 15 حذف شده
  1. 48 2
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
  2. 12 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java
  3. 9 5
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
  4. 28 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListByNoReqVO.java
  5. 8 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java
  6. 4 0
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
  7. 1 1
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java
  8. 16 2
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java
  9. 11 2
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java
  10. 15 3
      yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java

+ 48 - 2
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<List<ImConversationRespVO>> getConversationList() {
-        List<ImConversationDO> conversationList = imConversationService.getConversationList();
-        return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class));
+        List<ImConversationDO> conversationList = imConversationService.getConversationList(getLoginUserId());
+        List<ImConversationRespVO> 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<ImMessageDO> 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")

+ 12 - 0
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;
+
 }

+ 9 - 5
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<List<ImMessageRespVO>> getMessageList(@Valid ImMessageListReqVO listReqVO) {
-        List<ImMessageDO> messagePage = imMessageService.getMessageList(getLoginUserId(), listReqVO);
+        List<ImMessageDO> messagePage = imMessageService.getMessageList(listReqVO);
+        return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class));
+    }
+
+    @GetMapping("/listByNo")
+    @Operation(summary = "消息列表-根据接收人和发送时间进行分页查询")
+    public CommonResult<List<ImMessageRespVO>> getMessageListByNo(@Valid ImMessageListByNoReqVO listReqVO) {
+        List<ImMessageDO> messagePage = imMessageService.getMessageListByConversationNo(listReqVO);
         return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class));
     }
 

+ 28 - 0
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 ;
+
+}

+ 8 - 0
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 ;
+
 }

+ 4 - 0
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 = "消息类型不能为空")

+ 1 - 1
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<ImConversationDO> getConversationList();
+    List<ImConversationDO> getConversationList(Long loginUserId);
 
     /**
      * 置顶会话

+ 16 - 2
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<ImConversationDO> getConversationList() {
-        return imConversationMapper.selectList();
+    public List<ImConversationDO> getConversationList(Long loginUserId) {
+        // 根据loginUserId判断targetId, 自己不能做targetId
+        // 如何loginUserId和targetId相同,则需要调换userId和targetId
+        List<ImConversationDO> 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

+ 11 - 2
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<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO);
+    List<ImMessageDO> getMessageList(ImMessageListReqVO listReqVO);
+
+
+    /**
+     * 获得历史消息
+     *
+     * @param listReqVO   分页查询
+     * @return 消息分页
+     */
+    List<ImMessageDO> getMessageListByConversationNo(ImMessageListByNoReqVO listReqVO);
 
     /**
      * 拉取消息-大于 seq 的消息

+ 15 - 3
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<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO) {
+    public List<ImMessageDO> 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<ImMessageDO> getMessageListByConversationNo(ImMessageListByNoReqVO listReqVO) {
+
+        // 1. 查询历史消息
+        ImMessageDO message = new ImMessageDO()
+                .setSendTime(listReqVO.getSendTime())
+                .setConversationNo(listReqVO.getConversationNo());
+        return imMessageMapper.selectMessageList(message);
+    }
+
+
     @Override
     public List<ImMessageDO> pullMessageList(Long userId, Long sequence, Integer size) {
         List<Long> 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());