From 85bafa86f44fbe6646019fd8ecbab79f552ccd0a Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 04 二月 2026 21:44:38 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
xp-service/xp-operation/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java | 289 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 285 insertions(+), 4 deletions(-)
diff --git a/xp-service/xp-operation/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java b/xp-service/xp-operation/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
index 322ddc6..827d7b8 100644
--- a/xp-service/xp-operation/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
+++ b/xp-service/xp-operation/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -1,9 +1,50 @@
package com.xiaopeng.operation.controller;
-import org.springframework.web.bind.annotation.RequestMapping;
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.xiaopeng.api.model.account.SysUser;
+import com.xiaopeng.api.model.operation.XpInvitationCode;
+import com.xiaopeng.api.model.operation.XpWhitelist;
+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.domain.AjaxResult;
+import com.xiaopeng.common.core.web.page.PageInfo;
+import com.xiaopeng.common.log.annotation.Log;
+import com.xiaopeng.common.log.enums.BusinessType;
+import com.xiaopeng.operation.exportExcle.XpInvitationCodeExportExcel;
+import com.xiaopeng.operation.exportExcle.XpWhitelistExportExcel;
+import com.xiaopeng.operation.importExcel.InvitationCodeImportExcel;
+import com.xiaopeng.operation.query.InvitationPageListQuery;
+import com.xiaopeng.operation.query.WhitelistPageListQuery;
+import com.xiaopeng.operation.service.IXpInvitationCodeService;
+import com.xiaopeng.operation.service.IXpWhitelistService;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
-import org.springframework.stereotype.Controller;
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
/**
* <p>
@@ -13,8 +54,248 @@
* @author mitao
* @since 2026-02-03
*/
-@Controller
-@RequestMapping("/xp-invitation-code")
+@RestController
+@Api(tags = "邀请码管理")
+@Slf4j
+@RequestMapping("/api/v1/invitation")
public class XpInvitationCodeController {
+ @Resource
+ private IXpInvitationCodeService xpInvitationCodeService;
+ @Resource
+ private IXpWhitelistService xpWhitelistService;
+ @ApiOperation(value = "邀请码管理分页列表",response = XpInvitationCode.class)
+ @PostMapping("/pageList")
+ public AjaxResult<PageInfo<XpInvitationCode>> pageList(@RequestBody InvitationPageListQuery query) {
+ PageInfo<XpInvitationCode> pageList = xpInvitationCodeService.pageList(query);
+ return AjaxResult.ok(pageList);
+ }
+ /**
+ * 生成邀请码
+ */
+ @PutMapping("/add")
+ @ResponseBody
+ @ApiOperation(value = "生成邀请码")
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "手机号 多个逗号隔开", name = "phones", dataType = "String", required = true)
+ })
+ @Transactional
+ public AjaxResult add(@RequestParam("phones") String phones){
+ Map<String, Long> codeMap = xpInvitationCodeService.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);
+ addWhitelistList.add(xpWhitelist);
+ }
+ xpInvitationCodeService.saveBatch(addInvitationCodeList);
+ xpWhitelistService.saveBatch(addWhitelistList);
+ return AjaxResult.success();
+ }else {
+ return AjaxResult.error("请输入邀请手机号");
+ }
+ }
+ /**
+ * 解绑
+ */
+ @PutMapping("/unbind")
+ @ResponseBody
+ @ApiOperation(value = "解绑")
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "id", name = "id", dataType = "Long", required = true)
+ })
+ public AjaxResult unbind(@RequestParam("id") Long id){
+ UpdateWrapper<XpInvitationCode> xpInvitationCodeUpdateWrapper = new UpdateWrapper<>();
+ xpInvitationCodeUpdateWrapper.eq("id",id);
+ xpInvitationCodeUpdateWrapper.set("status",3);
+ xpInvitationCodeUpdateWrapper.set("bind_account", null);
+ xpInvitationCodeService.update(xpInvitationCodeUpdateWrapper);
+ return AjaxResult.success();
+ }
+ @ApiOperation(value = "点位导入模板下载")
+ @GetMapping("/import-template")
+ public void importTemplate() {
+ List<InvitationCodeImportExcel> invitationCodeImportExcels = new ArrayList<>();
+ InvitationCodeImportExcel invitationCodeImportExcel = new InvitationCodeImportExcel();
+ invitationCodeImportExcels.add(invitationCodeImportExcel);
+ Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), InvitationCodeImportExcel.class, invitationCodeImportExcels);
+ HttpServletResponse response = WebUtils.response();
+ ServletOutputStream outputStream = null;
+ try {
+ String fileName = URLEncoder.encode("邀请码导入模板.xls", "utf-8");
+ response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+ response.setHeader("content-Type", "application/vnd.ms-excel");
+ response.setHeader("Pragma", "no-cache");
+ response.setHeader("Cache-Control", "no-cache");
+ outputStream = response.getOutputStream();
+ workbook.write(outputStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.out.println("邀请码导入模板下载失败!");
+ } finally {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ @Log(title = "邀请码导入", businessType = BusinessType.IMPORT)
+ @ApiOperation(value = "邀请码导入")
+ @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+ @PostMapping("/importExcel")
+ public AjaxResult<String> importExcel(@RequestPart("file") MultipartFile file) {
+ ImportParams params = new ImportParams();
+// params.setTitleRows(1); // 标题行数
+ params.setHeadRows(1); //表头行数
+ InputStream inputStream = null;
+// List<CustomerImportFailedData> failedData = new ArrayList<>();
+ List<InvitationCodeImportExcel> invitationCodeImportExcels;
+ try {
+ inputStream = file.getInputStream();
+ invitationCodeImportExcels = ExcelImportUtil.importExcel(inputStream,
+ InvitationCodeImportExcel.class, params);
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("邀请码导入失败:{}", e.getMessage());
+ throw new ServiceException("邀请码导入失败!");
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ throw new ServiceException(e.getMessage());
+ }
+ }
+ if (CollectionUtils.isEmpty(invitationCodeImportExcels)) {
+ throw new ServiceException("邀请码数据为空!");
+ }
+ // 校验邀请码是否有重复的
+ long count = invitationCodeImportExcels.stream().map(InvitationCodeImportExcel::getInvitationCode)
+ .distinct().count();
+ if (count!=invitationCodeImportExcels.size()){
+ return AjaxResult.error("邀请码存在重复!");
+ }
+ Map<String, Long> codeMap = xpInvitationCodeService.list().stream()
+ .collect(Collectors.toMap(XpInvitationCode::getInvitationCode, XpInvitationCode::getId));
+ JSONObject result = new JSONObject();
+ List<XpInvitationCode> addList = new ArrayList<>();
+ List<XpWhitelist> addWhitelistList = new ArrayList<>();
+
+ for (InvitationCodeImportExcel locationExcel : invitationCodeImportExcels) {
+ Long id = codeMap.get(locationExcel.getInvitationCode());
+ if (id!=null){
+ result.append("邀请码:[", locationExcel.getInvitationCode()+"]已存在");
+ }
+ locationExcel.setBindTime(locationExcel.getBindTime());
+ XpInvitationCode xpInvitationCode = new XpInvitationCode();
+ xpInvitationCode.setInvitationCode(locationExcel.getInvitationCode());
+ xpInvitationCode.setBindAccount(locationExcel.getBindAccount());
+ if (StringUtils.hasLength(locationExcel.getBindTime())){
+ String replace = locationExcel.getBindTime().replace(".", "-");
+ String res = replace.replace("/", "-");
+ locationExcel.setBindTime(res);
+ }
+
+ xpInvitationCode.setBindTime(DateUtils.stringToLocalDateTime(locationExcel.getBindTime()));
+ if (StringUtils.hasLength(locationExcel.getBindAccount())){
+ xpInvitationCode.setStatus(2);
+ }else{
+ xpInvitationCode.setStatus(1);
+ }
+ XpWhitelist xpWhitelist = new XpWhitelist();
+ xpWhitelist.setAccount(locationExcel.getBindAccount());
+ xpWhitelist.setStatus(true);
+ xpWhitelist.setIsPriorityDispatch(false);
+ xpWhitelist.setWhitelistSource(2);
+ addWhitelistList.add(xpWhitelist);
+ addList.add(xpInvitationCode);
+ }
+ if(!result.isEmpty()){
+ return AjaxResult.success(result.toString());
+ }
+ xpInvitationCodeService.saveBatch(addList);
+ xpWhitelistService.saveBatch(addWhitelistList);
+ return AjaxResult.success();
+ }
+ @ApiOperation(value = "邀请码导出")
+ @PostMapping(value = "/exportExcel")
+ public void exportExcel(@RequestBody InvitationPageListQuery query) {
+ List<XpInvitationCode> list = xpInvitationCodeService.exportList(query);
+ List<XpInvitationCodeExportExcel> xpWhitelistExportExcels = new ArrayList<>();
+ for (XpInvitationCode xpInvitationCode : list) {
+ XpInvitationCodeExportExcel xpWhitelistExportExcel = new XpInvitationCodeExportExcel();
+ xpWhitelistExportExcel.setId(xpInvitationCode.getId());
+ xpWhitelistExportExcel.setBind_account(xpInvitationCode.getBindAccount());
+ xpWhitelistExportExcel.setInvitationCode(xpInvitationCode.getInvitationCode());
+ LocalDateTime createTime = xpInvitationCode.getCreateTime();
+ LocalDateTime bindTime = xpInvitationCode.getBindTime();
+ // 将LocalDateTime转化为yyyy-MM-dd HH:mm:ss格式字符串
+ xpWhitelistExportExcel.setCreateTime(createTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ xpWhitelistExportExcel.setBindTime(bindTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ xpWhitelistExportExcels.add(xpWhitelistExportExcel);
+ }
+ //1.获取excel模板
+ Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpInvitationCodeExportExcel.class, xpWhitelistExportExcels);
+ HttpServletResponse response = WebUtils.response();
+ response.setContentType("application/vnd.ms-excel");
+ response.setCharacterEncoding("utf-8");
+ ServletOutputStream outputStream = null;
+ try {
+ String fileName = URLEncoder.encode("邀请码列表.xls", "utf-8");
+ response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
+ outputStream = response.getOutputStream();
+ workbook.write(outputStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+ /**
+ * 批量删除
+ */
+ @PutMapping("/deleteByIds")
+ @ResponseBody
+ @ApiOperation(value = "批量删除")
+ public AjaxResult deleteByIds(List<Long> ids){
+ xpInvitationCodeService.removeBatchByIds(ids);
+ return AjaxResult.success();
+ }
+ 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();
+ }
}
--
Gitblit v1.7.1