package cn.iocoder.yudao.module.im.dal.mysql.friend; import cn.hutool.core.date.LocalDateTimeUtil; 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.module.im.controller.admin.manager.friend.vo.ImFriendRequestManagerPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.friend.ImFriendRequestDO; import cn.iocoder.yudao.module.im.enums.friend.ImFriendRequestHandleResultEnum; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; import java.util.List; /** * IM 好友申请记录 Mapper * * @author 芋道源码 */ @Mapper public interface ImFriendRequestMapper extends BaseMapperX { default ImFriendRequestDO selectByFromUserIdAndToUserId(Long fromUserId, Long toUserId) { return selectOne(new LambdaQueryWrapperX() .eq(ImFriendRequestDO::getFromUserId, fromUserId) .eq(ImFriendRequestDO::getToUserId, toUserId)); } /** * 拉取「我相关」的好友申请列表 * * @param userId 当前用户编号 * @param maxRequestUpdateTime 起始更新时间;首次拉取传 null * @param maxId 起始记录编号;首次拉取传 null * @param limit 拉取数量 * @return 好友申请列表 */ default List selectMyList(Long userId, LocalDateTime maxRequestUpdateTime, Long maxId, int limit) { LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); wrapper.and(w -> w.eq(ImFriendRequestDO::getFromUserId, userId) .or().eq(ImFriendRequestDO::getToUserId, userId)); if (maxRequestUpdateTime != null && maxId != null) { wrapper.and(w -> w.lt(ImFriendRequestDO::getUpdateTime, maxRequestUpdateTime) .or(n -> n.eq(ImFriendRequestDO::getUpdateTime, maxRequestUpdateTime) .lt(ImFriendRequestDO::getId, maxId))); } wrapper.orderByDesc(ImFriendRequestDO::getUpdateTime) .orderByDesc(ImFriendRequestDO::getId) .last("LIMIT " + limit); return selectList(wrapper); } /** * 增量拉取「我相关」的好友申请(双向 OR,按 update_time + id 正向游标) * * @param userId 当前用户编号 * @param lastUpdateTime 上次拉取到的更新时间;首次拉取传 null * @param lastId 上次拉取到的记录编号;首次拉取传 null * @param limit 拉取数量 * @return 好友申请列表 */ default List selectPullListByUserId(Long userId, Long lastUpdateTime, Long lastId, Integer limit) { LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); query.and(w -> w.eq(ImFriendRequestDO::getFromUserId, userId) .or().eq(ImFriendRequestDO::getToUserId, userId)); if (lastUpdateTime != null && lastId != null) { LocalDateTime lastTime = LocalDateTimeUtil.of(lastUpdateTime); query.and(w -> w.gt(ImFriendRequestDO::getUpdateTime, lastTime) .or(n -> n.eq(ImFriendRequestDO::getUpdateTime, lastTime).gt(ImFriendRequestDO::getId, lastId))); } return selectList(query.orderByAsc(ImFriendRequestDO::getUpdateTime).orderByAsc(ImFriendRequestDO::getId) .last("LIMIT " + limit)); } default int updateByIdAndHandleResult(Long id, Integer handleResult, ImFriendRequestDO updateObj) { return update(updateObj, new LambdaUpdateWrapper() .eq(ImFriendRequestDO::getId, id).eq(ImFriendRequestDO::getHandleResult, handleResult)); } /** * 复用 (fromUserId, toUserId) 旧申请记录:覆盖申请理由 / 备注 / 来源,重置为未处理 + 清空旧处理痕迹 *

* handleContent / handleTime 走 LambdaUpdateWrapper.set 显式置 null,updateById 默认会忽略 null 字段 */ default int updateByIdReset(Long id, String applyContent, String displayName, Integer addSource, LocalDateTime updateTime) { return update(null, new LambdaUpdateWrapper() .eq(ImFriendRequestDO::getId, id) .set(ImFriendRequestDO::getApplyContent, applyContent) .set(ImFriendRequestDO::getDisplayName, displayName) .set(ImFriendRequestDO::getAddSource, addSource) .set(ImFriendRequestDO::getHandleResult, ImFriendRequestHandleResultEnum.UNHANDLED.getResult()) .set(ImFriendRequestDO::getHandleContent, null) .set(ImFriendRequestDO::getHandleTime, null) .set(ImFriendRequestDO::getUpdateTime, updateTime)); } default PageResult selectPage(ImFriendRequestManagerPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(ImFriendRequestDO::getFromUserId, reqVO.getFromUserId()) .eqIfPresent(ImFriendRequestDO::getToUserId, reqVO.getToUserId()) .eqIfPresent(ImFriendRequestDO::getHandleResult, reqVO.getHandleResult()) .eqIfPresent(ImFriendRequestDO::getAddSource, reqVO.getAddSource()) .betweenIfPresent(ImFriendRequestDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(ImFriendRequestDO::getId)); } }