会话和消息处理
This commit is contained in:
parent
b540f8d46d
commit
788c24dff4
|
@ -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")
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ;
|
||||
|
||||
}
|
|
@ -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 ;
|
||||
|
||||
}
|
|
@ -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 = "消息类型不能为空")
|
||||
|
|
|
@ -18,7 +18,7 @@ public interface ImConversationService {
|
|||
*
|
||||
* @return 会话列表
|
||||
*/
|
||||
List<ImConversationDO> getConversationList();
|
||||
List<ImConversationDO> getConversationList(Long loginUserId);
|
||||
|
||||
/**
|
||||
* 置顶会话
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 的消息
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in New Issue