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; /** *

* 邀请码管理 服务实现类 *

* * @author mitao * @since 2026-02-03 */ @Service public class XpInvitationCodeServiceImpl extends ServiceImpl implements IXpInvitationCodeService { @Autowired private XpWhitelistMapper xpWhitelistMapper; private static final long INVITATION_CODE_LIMIT = 500L; @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) { 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 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(); } }