package cn.iocoder.yudao.module.im.dal.mysql.message; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.im.controller.admin.manager.message.vo.privates.ImPrivateMessageManagerPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImPrivateMessageDO; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; import java.util.List; /** * IM 私聊消息 Mapper * * @author 芋道源码 */ @Mapper public interface ImPrivateMessageMapper extends BaseMapperX { /** * 根据 minId + 时间窗口增量拉取私聊消息 * * @param userId 当前用户编号 * @param minId 最小消息 id(不含) * @param minSendTime 最早发送时间(不含),限制离线消息时间窗口 * @param size 拉取数量 * @return 消息列表 */ default List selectListByMinId(Long userId, Long minId, LocalDateTime minSendTime, Integer size) { QueryWrapperX wrapper = new QueryWrapperX<>(); wrapper.and(w -> w.eq("sender_id", userId) .or() .eq("receiver_id", userId)) .gt("id", minId) .gt("send_time", minSendTime) .orderByAsc("id"); wrapper.limitN(size); return selectList(wrapper); } /** * 查询私聊历史消息(游标拉取) * * @param userId 当前用户编号 * @param receiverId 对方用户编号 * @param maxId 起始消息 id(不含),为空则从最新开始 * @param limit 拉取数量 * @return 消息列表(按 id 倒序) */ default List selectHistoryList(Long userId, Long receiverId, Long maxId, Integer limit) { QueryWrapperX wrapper = new QueryWrapperX<>(); wrapper.and(w -> w.eq("sender_id", userId).eq("receiver_id", receiverId) .or() .eq("sender_id", receiverId).eq("receiver_id", userId)) .lt(maxId != null, "id", maxId) .orderByDesc("id"); wrapper.limitN(limit); return selectList(wrapper); } default ImPrivateMessageDO selectBySenderIdAndClientMessageId(Long senderId, String clientMessageId) { return selectOne(new LambdaQueryWrapperX() .eq(ImPrivateMessageDO::getSenderId, senderId) .eq(ImPrivateMessageDO::getClientMessageId, clientMessageId)); } default int updateBySenderIdAndReceiverIdAndIdLeAndReceiptStatus(Long senderId, Long receiverId, Long maxMessageId, Integer whereReceiptStatus, ImPrivateMessageDO updateObj) { return update(updateObj, new LambdaQueryWrapperX() .eq(ImPrivateMessageDO::getSenderId, senderId) .eq(ImPrivateMessageDO::getReceiverId, receiverId) .le(ImPrivateMessageDO::getId, maxMessageId) .eq(ImPrivateMessageDO::getReceiptStatus, whereReceiptStatus)); } default PageResult selectPage(ImPrivateMessageManagerPageReqVO reqVO) { LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); if (reqVO.getSenderId() != null && reqVO.getReceiverId() != null) { query.and(w -> w.eq(ImPrivateMessageDO::getSenderId, reqVO.getSenderId()) .eq(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId()) .or() .eq(ImPrivateMessageDO::getSenderId, reqVO.getReceiverId()) .eq(ImPrivateMessageDO::getReceiverId, reqVO.getSenderId())); } else { query.eqIfPresent(ImPrivateMessageDO::getSenderId, reqVO.getSenderId()) .eqIfPresent(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId()); } return selectPage(reqVO, query .eqIfPresent(ImPrivateMessageDO::getType, reqVO.getType()) .likeIfPresent(ImPrivateMessageDO::getContent, reqVO.getContent()) .eqIfPresent(ImPrivateMessageDO::getStatus, reqVO.getStatus()) .betweenIfPresent(ImPrivateMessageDO::getSendTime, reqVO.getSendTime()) .orderByDesc(ImPrivateMessageDO::getId)); } }