Forráskód Böngészése

1.返图功能上线
2.二维码生成接口新增返图二维码
3.优化聊天记录获取返图

fangzhen 4 hónapja
szülő
commit
ab0834ee1e

+ 5 - 5
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java

@@ -16,10 +16,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
@@ -261,12 +258,15 @@ public class CommonController {
      * @return
      */
     @GetMapping("/loginUserQRCode")
-    public AjaxResult generateAndUploadQRCode() {
+    public AjaxResult generateAndUploadQRCode(boolean isReturn) {
         String fileName = "";
         try {
             Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
             JSONObject userIdObj = new JSONObject();
             userIdObj.put("userId", userId);
+            if (isReturn) {
+                userIdObj.put("fantuFlag", true);
+            }
             // 1. 生成临时二维码图片
             fileName = "qrcode_" + userId + ".png";
             Path tempFile = Paths.get(System.getProperty("java.io.tmpdir"), fileName);

+ 28 - 20
ruoyi-framework/src/main/java/com/ruoyi/framework/webSocket/WebSocketServer.java

@@ -2,8 +2,11 @@ package com.ruoyi.framework.webSocket;
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.generator.domain.Community.CommunityReturnRecord;
 import com.ruoyi.generator.service.ICommunityReturnRecordService;
 import com.ruoyi.system.domain.CommunityChatMsg;
 import com.ruoyi.system.service.ICommunityChatMsgService;
@@ -255,6 +258,7 @@ public class WebSocketServer {
             LOGGER.debug("聊天消息推送");
 //            sendToUser(String.valueOf(receiveUserId), JSONObject.toJSONString(jsonObject));
 
+            CommunityReturnRecord communityReturnRecord = null;
             chatMsg = new CommunityChatMsg();
             chatMsg.setSenderId(senderId);
             chatMsg.setReceiverId(receiverId);
@@ -262,31 +266,35 @@ public class WebSocketServer {
                 chatMsg.setSenderAnonName(jsonObject.getString("senderAnonName"));
                 chatMsg.setReceiverAnonName(jsonObject.getString("receiverAnonName"));
 
-//                //获取返图创建人用户id和返图接收人用户id
-//                String returnCreateUserId = jsonObject.getString("returnCreateUserId");
-//                String returnReceiveUserId = jsonObject.getString("returnReceiveUserId");
-//                if (returnCreateUserId != null && returnReceiveUserId != null) {
-//                    //不为null时,则进行判断返图列表是否存在记录
-//                    CommunityReturnRecord returnRecord = returnRecordService.getOne(new QueryWrapper<CommunityReturnRecord>()
-//                            .eq("return_create_user_id", returnCreateUserId)
-//                            .eq("return_receive_user_id", returnReceiveUserId)
-//                            .eq("is_delete", false)
-//                            .eq("status", false));
-//                    if (returnRecord == null) {
-//                        CommunityReturnRecord communityReturnRecord = new CommunityReturnRecord();
-//                        communityReturnRecord.setReturnCreateUserId(Long.parseLong(returnCreateUserId));
-//                        communityReturnRecord.setReturnReceiveUserId(Long.parseLong(returnReceiveUserId));
-//                        communityReturnRecord.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
-//                        communityReturnRecord.setCreateBy(Long.parseLong(returnCreateUserId));
-//                        returnRecordService.save(communityReturnRecord);
-//                    }
-//                }
+                //获取返图创建人用户id和返图接收人用户id
+                Long returnRecordId = Long.parseLong(StringUtils.isEmpty(jsonObject.getString("returnRecordId")) ? "0" : jsonObject.getString("returnRecordId"));
+                String returnCreateUserId = jsonObject.getString("returnCreateUserId");
+                String returnReceiveUserId = jsonObject.getString("returnReceiveUserId");
+                if (returnCreateUserId != null && returnReceiveUserId != null) {
+                    //不为null时,则进行判断返图列表是否存在记录
+                    CommunityReturnRecord returnRecord = returnRecordService.getOne(new QueryWrapper<CommunityReturnRecord>()
+                            .eq("return_create_user_id", returnCreateUserId)
+                            .eq("return_receive_user_id", returnReceiveUserId)
+                            .eq("is_delete", false)
+                            .eq("status", false));
+                    if (returnRecord == null) {
+                        communityReturnRecord = new CommunityReturnRecord();
+                        communityReturnRecord.setReturnCreateUserId(Long.parseLong(returnCreateUserId));
+                        communityReturnRecord.setReturnReceiveUserId(Long.parseLong(returnReceiveUserId));
+                        communityReturnRecord.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
+                        communityReturnRecord.setCreateBy(Long.parseLong(returnCreateUserId));
+                        returnRecordService.save(communityReturnRecord);
+                        returnRecordId = communityReturnRecord.getId();
+                    }
+                }
+                chatMsg.setReturnRecordId(returnRecordId);
             }
-            chatMsg.setCreateBy(senderId);
+
             chatMsg.setSenderIsRead(true);
             chatMsg.setReceiverIsRead(false);
             chatMsg.setType(type);
             chatMsg.setMessageType(messageType);
+            chatMsg.setCreateBy(senderId);
             chatMsg.setCreateTime(DateUtils.parseDate(DateUtils.getTime()));
             switch (messageType) {
                 case 0:

+ 61 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/CommunityChatMsgController.java

@@ -9,9 +9,11 @@ import com.ruoyi.common.exception.user.ProjectException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.generator.domain.Community.CommunityReturnRecord;
 import com.ruoyi.generator.domain.Community.CommunityUserBlock;
 import com.ruoyi.generator.domain.ReqEntity.UpdateAnonName;
 import com.ruoyi.generator.mapper.community.CommunityUserBlockMapper;
+import com.ruoyi.generator.service.CommunityReturnRecordServiceImpl;
 import com.ruoyi.system.domain.CommunityChatMsg;
 import com.ruoyi.system.domain.vo.CommunityChatMsgVo;
 import com.ruoyi.system.domain.vo.SysUserVo;
@@ -50,6 +52,9 @@ public class CommunityChatMsgController extends BaseController {
     @Resource
     private CommunityChatMsgMapper communitychatMsgMapper;
 
+    @Resource
+    private CommunityReturnRecordServiceImpl communityReturnRecordService;
+
     /**
      * 获取当前登录用户聊天记录
      */
@@ -225,4 +230,60 @@ public class CommunityChatMsgController extends BaseController {
 
         return success("更新成功!");
     }
+
+    /**
+     * 获取当前用户的返图记录
+     */
+    @ApiOperation("获取当前用户的返图记录")
+    @GetMapping("/getReturnRecord")
+    public AjaxResult getReturnRecord(String status) {
+        Long userId = SecurityUtils.getUserId();
+        List<CommunityReturnRecord> returnRecords = null;
+        List<SysUserVo> sysUserChatVos = null;
+        switch (status) {
+            case "0": //待完成
+                returnRecords = communityReturnRecordService.list(new QueryWrapper<CommunityReturnRecord>()
+                        .eq("return_create_user_id", userId)
+                        .eq("status", false)
+                        .eq("is_delete", false));
+                break;
+            case "1": //待返图
+                returnRecords = communityReturnRecordService.list(new QueryWrapper<CommunityReturnRecord>()
+                        .eq("return_receive_user_id", userId)
+                        .eq("status", false)
+                        .eq("is_delete", false));
+                break;
+            case "2": //已完成
+                returnRecords = communityReturnRecordService.list(new QueryWrapper<CommunityReturnRecord>()
+                        .and(wrapper ->
+                                wrapper.eq("return_receive_user_id", userId)
+                                        .or()
+                                        .eq("return_create_user_id", userId))
+                        .eq("status", true)
+                        .eq("is_delete", false));
+                break;
+        }
+
+        if (returnRecords != null && !returnRecords.isEmpty()) {
+            List<Long> returnIds = returnRecords.stream().map(CommunityReturnRecord::getId).collect(Collectors.toList());
+            sysUserChatVos = communityChatMsgService.getChatListWithLatestMessage(userId, "anonymous", returnIds);
+        }
+        return AjaxResult.success(sysUserChatVos);
+    }
+
+    /**
+     * 获取当前用户的返图记录
+     */
+    @ApiOperation("更新返图状态")
+    @PutMapping("/updateReturnStatus")
+    public AjaxResult updateReturnStatus(Long returnId) {
+        if (returnId == null) {
+            return AjaxResult.error("程序异常");
+        }
+
+        communityReturnRecordService.update(new UpdateWrapper<CommunityReturnRecord>()
+                .set("status", true)
+                .eq("id", returnId));
+        return AjaxResult.success("返图已完成");
+    }
 }

+ 90 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/vo/CommunityReturnRecordVo.java

@@ -0,0 +1,90 @@
+package com.ruoyi.generator.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+* 
+* @TableName community_return_record
+*/
+@Data
+@TableName("community_return_record")
+public class CommunityReturnRecordVo implements Serializable {
+
+    /**
+    * 标签id
+    */
+    @NotNull(message="[标签id]不能为空")
+    @ApiModelProperty("标签id")
+    @TableId("id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    /**
+    * 创建返图用户id
+    */
+    @ApiModelProperty("创建返图用户id")
+    private Long returnCreateUserId;
+
+    /**
+     * 创建者返图匿名名称
+     */
+    @ApiModelProperty("创建者返图匿名名称")
+    private String senderAnonName;
+
+    /**
+     * 接受返图用户id
+     */
+    @ApiModelProperty("接受返图用户id")
+    private Long returnReceiveUserId;
+
+    /**
+     * 接收者返图匿名名称
+     */
+    @ApiModelProperty("接收者返图匿名名称")
+    private String receiverAnonName;
+
+    /**
+     * 状态
+     */
+    @ApiModelProperty("状态")
+    private boolean status;
+
+    /**
+     * 是否已删除
+     */
+    @ApiModelProperty("是否已删除")
+    private boolean isDelete;
+
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createBy;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+    * 更新人
+    */
+    @ApiModelProperty("更新人")
+    private Long updateBy;
+    /**
+    * 更新时间
+    */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+}

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/CommunityChatMsg.java

@@ -90,6 +90,10 @@ public class CommunityChatMsg implements Serializable {
      * 是否已读(接收人)
      */
     private boolean receiverIsRead;
+    /**
+     * 关联返图记录表id
+     */
+    private Long returnRecordId;
     /**
     * 创建时间
     */

+ 4 - 3
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserVo.java

@@ -12,6 +12,9 @@ public class SysUserVo {
     //用户id
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
+    //返图id
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long returnRecordId;
     //用户昵称
     private String nickName;
     //用户名
@@ -31,11 +34,9 @@ public class SysUserVo {
     //最新消息信息时间
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date msgTime;
-
     //最新一条消息内容
     private String msg;
-
     //未读消息
-    private Long unreads;
+    private Long unReads;
 
 }

+ 23 - 3
ruoyi-system/src/main/java/com/ruoyi/system/mapper/CommunityChatMsgMapper.java

@@ -2,7 +2,6 @@ package com.ruoyi.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.system.domain.CommunityChatMsg;
-import com.ruoyi.system.domain.vo.CommunityChatMsgVo;
 import com.ruoyi.system.domain.vo.SysUserVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -17,7 +16,28 @@ public interface CommunityChatMsgMapper extends BaseMapper<CommunityChatMsg> {
      * @param userId
      * @return
      */
-    List<SysUserVo> getChatListWithLatestMessage(@Param("userId") Long userId, @Param("type") String type);
+    List<SysUserVo> getChatListWithLatestMessage(@Param("userId") Long userId,
+                                                 @Param("type") String type);
 
-    List<CommunityChatMsg>  getChatMsgRecord (@Param("userId") Long userId, @Param("otherUserId") Long otherUserId, @Param("type") String type);
+    /**
+     * 获取登录用户的返图聊天列表
+     *
+     * @param userId
+     * @return
+     */
+    List<SysUserVo> getReturnChatMessage(@Param("userId") Long userId,
+                                         @Param("type") String type,
+                                         @Param("returnRecordIds")  List<Long> returnRecordIds);
+
+    /**
+     * 获取登录用户聊天记录
+     *
+     * @param userId
+     * @param otherUserId
+     * @param type
+     * @return
+     */
+    List<CommunityChatMsg> getChatMsgRecord(@Param("userId") Long userId,
+                                            @Param("otherUserId") Long otherUserId,
+                                            @Param("type") String type);
 }

+ 10 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/ICommunityChatMsgService.java

@@ -14,5 +14,14 @@ public interface ICommunityChatMsgService extends IService<CommunityChatMsg> {
      * @param userId 用户id
      * @return 用户聊天列表
      */
-    List<SysUserVo> getChatListWithLatestMessage(@Param("userId") Long userId, @Param("type") String type);
+    List<SysUserVo> getChatListWithLatestMessage(@Param("userId") Long userId,
+                                                 @Param("type") String type);
+
+    /**
+     * 获取登录用户的聊天列表
+     *
+     * @param userId 用户id
+     * @return 用户聊天列表
+     */
+    List<SysUserVo> getChatListWithLatestMessage(Long userId,String type,List<Long> returnRecordIds);
 }

+ 12 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommunityChatMsgServiceImpl.java

@@ -26,4 +26,16 @@ public class CommunityChatMsgServiceImpl extends ServiceImpl<CommunityChatMsgMap
     public List<SysUserVo> getChatListWithLatestMessage(Long userId, String type) {
         return communityChatMsgMapper.getChatListWithLatestMessage(userId, type);
     }
+
+    /**
+     * 获取登录用户返图聊天列表
+     * @param userId 用户id
+     * @param type 聊天类型
+     * @param returnRecordIds 返图id
+     * @return 返图聊天列表
+     */
+    @Override
+    public List<SysUserVo> getChatListWithLatestMessage(Long userId, String type, List<Long> returnRecordIds) {
+        return communityChatMsgMapper.getReturnChatMessage(userId, type, returnRecordIds);
+    }
 }

+ 168 - 101
ruoyi-system/src/main/resources/mapper/system/CommunityChatMsgMapper.xml

@@ -4,120 +4,187 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.system.mapper.CommunityChatMsgMapper">
 	<select id="getChatListWithLatestMessage" resultType="com.ruoyi.system.domain.vo.SysUserVo">
-        WITH LatestMessages AS (
-            SELECT r.id                                                                  as id,
-                   IF('anonymous' = #{type}, r.sender_anon_name, u.nick_name) AS nickName,
-                   IF('anonymous' = #{type}, r.sender_anon_name, u.user_name) AS username,
-                   u.avatar                                                              as avatar,
-                   (SELECT u2.nick_name
-                    FROM sys_user u2
-                    WHERE u2.user_id = r.sender_id) as senderNickName,
-                   r.receiver_is_read                                                    as receiverIsRead,
-                   r.receiver_id                                                         as receiverId,
-                   r.sender_is_read                                                      as senderIsRead,
-                   r.sender_id                                                           as senderId,
-                   CASE
-                       WHEN r.message_type = 1 THEN '[图片]'
-                       WHEN r.message_type = 2 THEN '[语音]'
-                       WHEN r.message_type = 3 THEN '[定位]'
-                       WHEN r.message_type = 4 THEN '[视频]'
-                       ELSE r.content
-                       END AS msg,
-                   r.create_time                                                         AS msgTime,
-                   COALESCE(
-                           (
-                               SELECT num
-                               FROM (
-                                        SELECT sender_id, COUNT(*) AS num
-                                        FROM community_chat_msg
-                                        WHERE receiver_id = #{userId} AND receiver_is_read = '0' AND type = #{type}
-                                        GROUP BY sender_id
-                                    ) A
-                               WHERE A.sender_id = r.sender_id
-                           ),
-                           0
-                       ) AS unreads
-            FROM (
-                     SELECT CASE
-                                WHEN sender_id = #{userId} THEN receiver_id
-                                ELSE sender_id
-                                END          AS chat_user_id,
-                            MAX(create_time) AS latest_time
-                     FROM community_chat_msg
-                     WHERE (sender_id = #{userId} OR receiver_id = #{userId})
-                       AND type = #{type}
-                       AND (
-                             (sender_id = #{userId} AND (is_delete IS NULL OR is_delete != 1))
-                             OR (receiver_id = #{userId} AND (receiver_is_delete IS NULL OR receiver_is_delete != 1))
-                         )
-                     GROUP BY chat_user_id
-                 ) latest
-                     JOIN community_chat_msg r ON
-                (
-                        (r.sender_id = #{userId} AND r.receiver_id = latest.chat_user_id
-                            OR
-                         r.sender_id = latest.chat_user_id AND r.receiver_id = #{userId} )
-                        AND r.create_time = latest.latest_time AND r.type = #{type}
-                    )
-                     JOIN sys_user u ON u.user_id = latest.chat_user_id
-        ),
-             RankedMessages AS (
-                 SELECT *,
-                        ROW_NUMBER() OVER (PARTITION BY username ORDER BY msgTime DESC) as rn
-                 FROM LatestMessages
-             )
+        WITH LatestMessages AS (SELECT r.id                                                       as id,
+                                       IF('anonymous' = #{type}, r.sender_anon_name, u.nick_name) AS nickName,
+                                       IF('anonymous' = #{type}, r.sender_anon_name, u.user_name) AS username,
+                                       u.avatar                                                   as avatar,
+                                       (SELECT u2.nick_name
+                                        FROM sys_user u2
+                                        WHERE u2.user_id = r.sender_id)                           as senderNickName,
+                                       r.receiver_is_read                                         as receiverIsRead,
+                                       r.receiver_id                                              as receiverId,
+                                       r.sender_is_read                                           as senderIsRead,
+                                       r.sender_id                                                as senderId,
+                                       CASE
+                                           WHEN r.message_type = 1 THEN '[图片]'
+                                           WHEN r.message_type = 2 THEN '[语音]'
+                                           WHEN r.message_type = 3 THEN '[定位]'
+                                           WHEN r.message_type = 4 THEN '[视频]'
+                                           ELSE r.content
+                                           END                                                    AS msg,
+                                       r.create_time                                              AS msgTime,
+                                       COALESCE(
+                                               (SELECT num
+                                                FROM (SELECT sender_id, COUNT(*) AS num
+                                                      FROM community_chat_msg
+                                                      WHERE receiver_id = #{userId}
+                                                        AND receiver_is_read = '0'
+                                                        AND type = #{type}
+                                                      GROUP BY sender_id) A
+                                                WHERE A.sender_id = r.sender_id),
+                                               0
+                                       )                                                          AS unReads
+                                FROM (SELECT CASE
+                                                 WHEN sender_id = #{userId} THEN receiver_id
+                                                 ELSE sender_id
+                                                 END          AS chat_user_id,
+                                             MAX(create_time) AS latest_time
+                                      FROM community_chat_msg
+                                      WHERE (sender_id = #{userId} OR receiver_id = #{userId})
+                                        AND type = #{type}
+                                        AND (
+                                          (sender_id = #{userId} AND (is_delete IS NULL OR is_delete != 1))
+                                              OR (receiver_id = #{userId} AND
+                                                  (receiver_is_delete IS NULL OR receiver_is_delete != 1))
+                                          )
+                                      GROUP BY chat_user_id) latest
+                                         JOIN community_chat_msg r ON
+                                    (
+                                        (r.sender_id = #{userId} AND r.receiver_id = latest.chat_user_id
+                                            OR
+                                         r.sender_id = latest.chat_user_id AND r.receiver_id = #{userId})
+                                            AND r.create_time = latest.latest_time AND r.type = #{type}
+                                        )
+                                         JOIN sys_user u ON u.user_id = latest.chat_user_id),
+             RankedMessages AS (SELECT *,
+                                       ROW_NUMBER() OVER (PARTITION BY username ORDER BY msgTime DESC) as rn
+                                FROM LatestMessages)
+        SELECT *
+        FROM RankedMessages
+        WHERE rn = 1
+        ORDER BY msgTime DESC;
+    </select>
+
+    <select id="getReturnChatMessage" resultType="com.ruoyi.system.domain.vo.SysUserVo">
+        WITH LatestMessages AS (SELECT r.id as id,
+        IF('anonymous' = #{type}, r.sender_anon_name, u.nick_name) AS nickName,
+        IF('anonymous' = #{type}, r.sender_anon_name, u.user_name) AS username,
+        u.avatar as avatar,
+        (SELECT u2.nick_name
+        FROM sys_user u2
+        WHERE u2.user_id = r.sender_id) as senderNickName,
+        r.receiver_is_read as receiverIsRead,
+        r.receiver_id as receiverId,
+        r.sender_is_read as senderIsRead,
+        r.sender_id as senderId,
+        r.return_record_id as returnRecordId,
+        CASE
+        WHEN r.message_type = 1 THEN '[图片]'
+        WHEN r.message_type = 2 THEN '[语音]'
+        WHEN r.message_type = 3 THEN '[定位]'
+        WHEN r.message_type = 4 THEN '[视频]'
+        ELSE r.content
+        END AS msg,
+        r.create_time AS msgTime,
+        COALESCE(
+        (SELECT num
+        FROM (SELECT sender_id, COUNT(*) AS num
+        FROM community_chat_msg
+        WHERE receiver_id = #{userId}
+        AND receiver_is_read = '0'
+        AND return_record_id in
+        <foreach collection="returnRecordIds" item="returnId" index="index" open="(" close=")" separator=",">
+            #{returnId}
+        </foreach>
+        AND type = #{type}
+        GROUP BY sender_id) A
+        WHERE A.sender_id = r.sender_id),
+        0
+        ) AS unReads
+        FROM (SELECT CASE
+        WHEN sender_id = #{userId} THEN receiver_id
+        ELSE sender_id
+        END AS chat_user_id,
+        MAX(create_time) AS latest_time
+        FROM community_chat_msg
+        WHERE (sender_id = #{userId} OR receiver_id = #{userId})
+        AND type = #{type}
+        AND return_record_id in
+        <foreach collection="returnRecordIds" item="returnId" index="index" open="(" close=")" separator=",">
+            #{returnId}
+        </foreach>
+        AND (
+        (sender_id = #{userId} AND (is_delete IS NULL OR is_delete != 1))
+        OR (receiver_id = #{userId} AND
+        (receiver_is_delete IS NULL OR receiver_is_delete != 1))
+        )
+        GROUP BY chat_user_id) latest
+        JOIN community_chat_msg r ON
+        (
+        (r.sender_id = #{userId} AND r.receiver_id = latest.chat_user_id
+        OR
+        r.sender_id = latest.chat_user_id AND r.receiver_id = #{userId})
+        AND r.create_time = latest.latest_time
+        AND r.type = #{type}
+        AND r.return_record_id in
+        <foreach collection="returnRecordIds" item="returnId" index="index" open="(" close=")" separator=",">
+            #{returnId}
+        </foreach>
+        )
+        JOIN sys_user u ON u.user_id = latest.chat_user_id),
+        RankedMessages AS (SELECT *,
+        ROW_NUMBER() OVER (PARTITION BY username ORDER BY msgTime DESC) as rn
+        FROM LatestMessages)
         SELECT *
         FROM RankedMessages
         WHERE rn = 1
         ORDER BY msgTime DESC;
     </select>
+
     <select id="getChatMsgRecord" resultType="com.ruoyi.system.domain.CommunityChatMsg">
-        SELECT
-            id	                as id,
-            content	            as content,
-            sender_id	        as senderId,
-            sender_anon_name    as senderAnonName,
-            receiver_id	        as receiverId,
-            receiver_anon_name  as receiverAnonName,
-            sender_is_read	    as senderIsRead,
-            receiver_is_read	as receiverIsRead,
-            address	            as address,
-            address_name	    as addressName,
-            latitude	        as latitude,
-            longitude	        as longitude,
-            url	                as url,
-            voice_time	        as voiceTime,
-            create_by	        as createBy,
-            create_time	        as createTime,
-            update_by	        as updateBy,
-            update_time	        as updateTime,
-            message_type	    as messageType,
-            type	            as type,
-            is_delete	        as isDelete,
-            receiver_is_delete  as receiverIsDelete
-        FROM
-            community_chat_msg
-        WHERE
+        SELECT id                 as id,
+               content            as content,
+               sender_id          as senderId,
+               sender_anon_name   as senderAnonName,
+               receiver_id        as receiverId,
+               receiver_anon_name as receiverAnonName,
+               sender_is_read     as senderIsRead,
+               receiver_is_read   as receiverIsRead,
+               address            as address,
+               address_name       as addressName,
+               latitude           as latitude,
+               longitude          as longitude,
+               url                as url,
+               voice_time         as voiceTime,
+               create_by          as createBy,
+               create_time        as createTime,
+               update_by          as updateBy,
+               update_time        as updateTime,
+               message_type       as messageType,
+               type               as type,
+               is_delete          as isDelete,
+               receiver_is_delete as receiverIsDelete
+        FROM community_chat_msg
+        WHERE (
             (
-                    (
-                        sender_id = #{userId} AND receiver_id = #{otherUserId}
-                        )
-                    OR (
-                        sender_id = #{otherUserId} AND receiver_id = #{userId}
-                        )
+                sender_id = #{userId} AND receiver_id = #{otherUserId}
                 )
+                OR (
+                sender_id = #{otherUserId} AND receiver_id = #{userId}
+                )
+            )
           AND type = #{type}
           AND (
-                (
-                            sender_id = #{userId} AND (
-                        is_delete IS NULL OR is_delete !=  1
-                        )
+            (
+                sender_id = #{userId} AND (
+                    is_delete IS NULL OR is_delete != 1
                     )
+                )
                 OR (
-                            receiver_id = #{userId} AND (
-                        receiver_is_delete IS NULL OR receiver_is_delete !=   1
-                        )
+                receiver_id = #{userId} AND (
+                    receiver_is_delete IS NULL OR receiver_is_delete != 1
                     )
+                )
             )
         ORDER BY create_time DESC
     </select>