liujie
2026-04-01 9adef3dd7723930d44f72713c3cf28e50b002055
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
package com.xiaopeng.operation.service.impl;
 
import com.xiaopeng.api.model.operation.XpInvitationCode;
import com.xiaopeng.api.model.operation.XpPoint;
import com.xiaopeng.api.model.operation.XpWhitelist;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.constant.I18nKeyConstant;
import com.xiaopeng.operation.mapper.XpInvitationCodeMapper;
import com.xiaopeng.operation.mapper.XpWhitelistMapper;
import com.xiaopeng.operation.query.InvitationPageListQuery;
import com.xiaopeng.operation.service.IXpInvitationCodeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
 
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 邀请码管理 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@Service
public class XpInvitationCodeServiceImpl extends ServiceImpl<XpInvitationCodeMapper, XpInvitationCode> implements IXpInvitationCodeService {
 
    @Autowired
    private XpWhitelistMapper xpWhitelistMapper;
    private static final long INVITATION_CODE_LIMIT = 500L;
    @Override
    public PageInfo<XpInvitationCode> pageList(InvitationPageListQuery query) {
        PageInfo<XpInvitationCode> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
        List<XpInvitationCode> list = this.baseMapper.pageList(pageInfo,query);
        pageInfo.setRecords(list);
        return pageInfo;
    }
 
    @Override
    public List<XpInvitationCode> exportList(InvitationPageListQuery query) {
        List<XpInvitationCode> list = this.baseMapper.exportList(query);
 
        return list;
    }
 
    @Override
    public R add(String phones) {
        long existing = this.count();
        long incoming = Arrays.stream(Optional.ofNullable(phones).orElse("").split(","))
                .map(String::trim)
                .filter(StringUtils::hasLength)
                .count();
        if (existing >= INVITATION_CODE_LIMIT || existing + incoming > INVITATION_CODE_LIMIT) {
            return R.fail(String.format("系统最多只能有%d个邀请码,当前已有%d个,本次新增%d个,无法生成", INVITATION_CODE_LIMIT, existing, incoming),
                    I18nKeyConstant.INVITATION_LIMIT_EXCEEDED);
        }
 
        Map<String, Long> codeMap = this.list().stream()
                .collect(Collectors.toMap(XpInvitationCode::getInvitationCode, XpInvitationCode::getId));
        if (StringUtils.hasLength(phones)){
            List<XpInvitationCode> addInvitationCodeList = new ArrayList<>();
            List<XpWhitelist> addWhitelistList = new ArrayList<>();
            for (String phone : Arrays.asList(phones.split(","))) {
                XpInvitationCode xpInvitationCode = new XpInvitationCode();
                // 生成随机六位数邀请码包含数字和大写字母
                String code = generateInviteCode();
                // 若生成出已存在的邀请码 重新生成
                Long l = codeMap.get(code);
                while (l!=null){
                    code = generateInviteCode();
                    l = codeMap.get(code);
                }
                xpInvitationCode.setInvitationCode(code);
                xpInvitationCode.setBindAccount(phone);
                xpInvitationCode.setBindTime(LocalDateTime.now());
                xpInvitationCode.setStatus(2);
                addInvitationCodeList.add(xpInvitationCode);
                XpWhitelist xpWhitelist = new XpWhitelist();
                xpWhitelist.setAccount(phone);
                xpWhitelist.setStatus(true);
                xpWhitelist.setIsPriorityDispatch(false);
                xpWhitelist.setWhitelistSource(2);
                xpWhitelistMapper.insert(xpWhitelist);
 
            }
            this.saveBatch(addInvitationCodeList);
            return R.ok();
        }else {
            return R.fail("请输入邀请手机号");
        }
    }
    private static final String CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final int CODE_LENGTH = 6;
    private static final Random RANDOM = new Random();
 
    public static String generateInviteCode() {
        StringBuilder code = new StringBuilder(CODE_LENGTH);
        for (int i = 0; i < CODE_LENGTH; i++) {
            int index = RANDOM.nextInt(CHARACTERS.length());
            code.append(CHARACTERS.charAt(index));
        }
        return code.toString();
    }
}