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.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;
/**
*
* 邀请码管理 服务实现类
*
*
* @author mitao
* @since 2026-02-03
*/
@Service
public class XpInvitationCodeServiceImpl extends ServiceImpl implements IXpInvitationCodeService {
@Autowired
private XpWhitelistMapper xpWhitelistMapper;
@Override
public PageInfo pageList(InvitationPageListQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
List list = this.baseMapper.pageList(pageInfo,query);
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public List exportList(InvitationPageListQuery query) {
List list = this.baseMapper.exportList(query);
return list;
}
@Override
public R add(String phones) {
Map codeMap = this.list().stream()
.collect(Collectors.toMap(XpInvitationCode::getInvitationCode, XpInvitationCode::getId));
if (StringUtils.hasLength(phones)){
List addInvitationCodeList = new ArrayList<>();
List 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();
}
}