liyong
7 小时以前 7a23c450f3ac85de7dca1b908de273ff636ce218
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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<ImFriendRequestDO> {
 
    default ImFriendRequestDO selectByFromUserIdAndToUserId(Long fromUserId, Long toUserId) {
        return selectOne(new LambdaQueryWrapperX<ImFriendRequestDO>()
                .eq(ImFriendRequestDO::getFromUserId, fromUserId)
                .eq(ImFriendRequestDO::getToUserId, toUserId));
    }
 
    /**
     * 拉取「我相关」的好友申请列表
     *
     * @param userId               当前用户编号
     * @param maxRequestUpdateTime 起始更新时间;首次拉取传 null
     * @param maxId                起始记录编号;首次拉取传 null
     * @param limit                拉取数量
     * @return 好友申请列表
     */
    default List<ImFriendRequestDO> selectMyList(Long userId, LocalDateTime maxRequestUpdateTime,
                                                 Long maxId, int limit) {
        LambdaQueryWrapperX<ImFriendRequestDO> 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<ImFriendRequestDO> selectPullListByUserId(Long userId, Long lastUpdateTime, Long lastId, Integer limit) {
        LambdaQueryWrapperX<ImFriendRequestDO> 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<ImFriendRequestDO>()
                .eq(ImFriendRequestDO::getId, id).eq(ImFriendRequestDO::getHandleResult, handleResult));
    }
 
    /**
     * 复用 (fromUserId, toUserId) 旧申请记录:覆盖申请理由 / 备注 / 来源,重置为未处理 + 清空旧处理痕迹
     * <p>
     * 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<ImFriendRequestDO>()
                .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<ImFriendRequestDO> selectPage(ImFriendRequestManagerPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<ImFriendRequestDO>()
                .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));
    }
 
}