bug
zhangzeli
2022-01-18 90d61b2122cfc96779bb658ca6f28e86540de128
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package cn.exrick.xboot.core.serviceimpl;
 
import cn.exrick.xboot.core.common.vo.SearchVo;
import cn.exrick.xboot.core.dao.MemberDao;
import cn.exrick.xboot.core.entity.Member;
import cn.exrick.xboot.core.service.MemberService;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * 会员接口实现
 * @author Exrick
 */
@Slf4j
@Service
@Transactional
public class MemberServiceImpl implements MemberService {
 
    @Autowired
    private MemberDao memberDao;
 
    @Override
    public MemberDao getRepository() {
        return memberDao;
    }
 
    @Override
    public Page<Member> findByCondition(Member member, SearchVo searchVo, Pageable pageable) {
 
        return memberDao.findAll(new Specification<Member>() {
            @Nullable
            @Override
            public Predicate toPredicate(Root<Member> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
 
                Path<String> usernameField = root.get("username");
                Path<String> nicknameField = root.get("nickname");
                Path<String> mobileField = root.get("mobile");
                Path<String> emailField = root.get("email");
                Path<String> inviteCodeField = root.get("inviteCode");
                Path<String> inviteByField = root.get("inviteBy");
                Path<String> sexField = root.get("sex");
                Path<Integer> typeField = root.get("type");
                Path<Integer> vipStatusField = root.get("vipStatus");
                Path<Integer> statusField = root.get("status");
                Path<Integer> platformField = root.get("platform");
                Path<Date> createTimeField = root.get("createTime");
 
                List<Predicate> list = new ArrayList<Predicate>();
 
                // 用户名相等匹配
                if (StrUtil.isNotBlank(member.getUsername())) {
                    list.add(cb.equal(usernameField, member.getUsername()));
                }
                // 邀请码相等匹配
                if (StrUtil.isNotBlank(member.getInviteCode())) {
                    list.add(cb.equal(inviteCodeField, member.getInviteCode()));
                }
                // 邀请人相等匹配
                if (StrUtil.isNotBlank(member.getInviteBy())) {
                    list.add(cb.equal(inviteByField, member.getInviteBy()));
                }
                // 昵称模糊搜素
                if (StrUtil.isNotBlank(member.getNickname())) {
                    list.add(cb.like(nicknameField, '%' + member.getNickname() + '%'));
                }
                // 手机模糊搜素
                if (StrUtil.isNotBlank(member.getMobile())) {
                    list.add(cb.like(mobileField, '%' + member.getMobile() + '%'));
                }
                // 邮件模糊搜素
                if (StrUtil.isNotBlank(member.getEmail())) {
                    list.add(cb.like(emailField, '%' + member.getEmail() + '%'));
                }
                // 性别 相等匹配
                if (StrUtil.isNotBlank(member.getSex())) {
                    list.add(cb.equal(sexField, member.getSex()));
                }
                // 会员类型 相等匹配
                if (member.getType() != null) {
                    list.add(cb.equal(typeField, member.getType()));
                }
                // VIP状态 相等匹配
                if (member.getVipStatus() != null) {
                    list.add(cb.equal(vipStatusField, member.getVipStatus()));
                }
                // 会员状态 相等匹配
                if (member.getStatus() != null) {
                    list.add(cb.equal(statusField, member.getStatus()));
                }
                // 注册平台 相等匹配
                if (member.getPlatform() != null) {
                    list.add(cb.equal(platformField, member.getPlatform()));
                }
 
                // 创建时间
                if (StrUtil.isNotBlank(searchVo.getStartDate()) && StrUtil.isNotBlank(searchVo.getEndDate())) {
                    Date start = DateUtil.parse(searchVo.getStartDate());
                    Date end = DateUtil.parse(searchVo.getEndDate());
                    list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end)));
                }
 
                Predicate[] arr = new Predicate[list.size()];
                cq.where(list.toArray(arr));
                return null;
            }
        }, pageable);
    }
 
    @Override
    public Member findByUsername(String username) {
 
        return memberDao.findByUsername(username);
    }
 
    @Override
    public Member findByMobile(String mobile) {
 
        return memberDao.findByMobile(mobile);
    }
 
}