puzhibing
2026-05-11 b7bb5daa5f4ffe1764a363a051a5d6f868168cf9
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -7,16 +7,20 @@
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.PhoneUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
import com.xiaopeng.api.model.operation.XpInvitationCode;
import com.xiaopeng.api.model.operation.XpWhitelist;
import com.xiaopeng.api.vo.account.LoginUser;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.DateUtils;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.operation.constant.I18nKeyConstant;
import com.xiaopeng.operation.dto.InvitationAddDto;
import com.xiaopeng.operation.exportExcle.XpInvitationCodeExportExcel;
@@ -68,23 +72,32 @@
    private IXpWhitelistService xpWhitelistService;
    @Resource
    private MessageSource messageSource;
    @Resource
    private SysGroupMenuClient groupMenuClient;
    @Resource
    private TokenService tokenService;
    private static final Pattern CHINESE_PATTERN = Pattern.compile("\\p{IsHan}");
    private static final long INVITATION_CODE_LIMIT = 500L;
    @ApiOperation(value = "邀请码管理分页列表",response = XpInvitationCode.class)
    @ApiOperation(value = "邀请码管理分页列表", response = XpInvitationCode.class)
    @PostMapping("/api/v1/invitation/pageList")
    public R<PageInfo<XpInvitationCode>> pageList(@RequestBody InvitationPageListQuery query) {
        LoginUser loginUser = tokenService.getLoginUser();
        PageInfo<XpInvitationCode> pageList = xpInvitationCodeService.pageList(query);
        if(!loginUser.getPhoneDesensitizationExempt()){
            pageList.getRecords().forEach(s -> s.setBindAccount(DesensitizedUtil.mobilePhone(s.getBindAccount())));
        }
        return R.ok(pageList);
    }
    /**
     * 生成邀请码
     */
    @PostMapping("/api/v1/invitation/add")
    @ResponseBody
    @ApiOperation(value = "生成邀请码")
    public R add(@RequestBody InvitationAddDto dto){
    public R add(@RequestBody InvitationAddDto dto) {
        long existing = xpInvitationCodeService.count();
        long incoming = Arrays.stream(Optional.ofNullable(dto.getPhones()).orElse("").split(","))
                .map(String::trim)
@@ -99,6 +112,7 @@
        }
        return xpInvitationCodeService.add(dto.getPhones());
    }
    /**
     * 解绑
     */
@@ -108,14 +122,15 @@
    @ApiImplicitParams({
            @ApiImplicitParam(value = "id", name = "id", dataType = "Long", required = true)
    })
    public R unbind(@RequestParam("id") Long id){
    public R unbind(@RequestParam("id") Long id) {
        UpdateWrapper<XpInvitationCode> xpInvitationCodeUpdateWrapper = new UpdateWrapper<>();
        xpInvitationCodeUpdateWrapper.eq("id",id);
        xpInvitationCodeUpdateWrapper.set("status",3);
        xpInvitationCodeUpdateWrapper.eq("id", id);
        xpInvitationCodeUpdateWrapper.set("status", 3);
        xpInvitationCodeUpdateWrapper.set("bind_account", null);
        xpInvitationCodeService.update(xpInvitationCodeUpdateWrapper);
        return R.ok();
    }
    @ApiOperation(value = "邀请码导入模板下载")
    @GetMapping("/api/v1/invitation/import-template")
    public void importTemplate() {
@@ -147,6 +162,7 @@
            }
        }
    }
    @ApiOperation(value = "邀请码导入")
    @PostMapping("/base/v1/invitation/importExcel")
    public R<String> importExcel(@RequestParam("file") MultipartFile file) {
@@ -248,7 +264,7 @@
        }
        if (!errors.isEmpty()) {
            return R.fail(messageSource.getMessage(I18nKeyConstant.INVITATION_IMPORT_VALIDATE_FAIL, new Object[]{String.join("\n", errors)},I18nKeyConstant.INVITATION_IMPORT_VALIDATE_FAIL, LocaleContextHolder.getLocale()));
            return R.fail(messageSource.getMessage(I18nKeyConstant.INVITATION_IMPORT_VALIDATE_FAIL, new Object[]{String.join("\n", errors)}, I18nKeyConstant.INVITATION_IMPORT_VALIDATE_FAIL, LocaleContextHolder.getLocale()));
        }
        List<XpInvitationCode> addList = new ArrayList<>();
@@ -259,7 +275,7 @@
            XpInvitationCode xpInvitationCode = new XpInvitationCode();
            xpInvitationCode.setInvitationCode(locationExcel.getInvitationCode());
            xpInvitationCode.setBindAccount(locationExcel.getBindAccount());
            if (StringUtils.hasLength(locationExcel.getBindTime())){
            if (StringUtils.hasLength(locationExcel.getBindTime())) {
                String replace = locationExcel.getBindTime().replace(".", "-");
                String res = replace.replace("/", "-");
                locationExcel.setBindTime(res);
@@ -294,6 +310,7 @@
        }
        return CHINESE_PATTERN.matcher(value).find();
    }
    @ApiOperation(value = "邀请码导出")
    @PostMapping(value = "/api/v1/invitation/exportExcel")
    public void exportExcel(@RequestBody InvitationPageListQuery query) {
@@ -333,13 +350,14 @@
        }
    }
    /**
     * 批量删除
     */
    @GetMapping("/api/v1/invitation/deleteByIds")
    @ResponseBody
    @ApiOperation(value = "批量删除")
    public R deleteByIds(String ids){
    public R deleteByIds(String ids) {
        // 再转化为Long类型
        List<Long> longs = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
        xpInvitationCodeService.removeBatchByIds(longs);
@@ -348,7 +366,7 @@
    @ApiOperation(value = "校验生成邀请码的手机号是否合法")
    @GetMapping("/api/v1/invitation/validateCode")
    public R<List<String>> validateCode(@RequestParam String phone){
    public R<List<String>> validateCode(@RequestParam String phone) {
        List<String> phoneList = Arrays.asList(phone.split(","));
        List<String> existPhones = phoneList.stream().filter(item -> xpInvitationCodeService.lambdaQuery()
                .in(XpInvitationCode::getBindAccount, item)