package com.xiaopeng.operation.controller;
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.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.hutool.core.io.resource.ClassPathResource;
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.page.PageInfo;
import com.xiaopeng.common.log.annotation.Log;
import com.xiaopeng.common.log.enums.BusinessType;
import com.xiaopeng.operation.dto.InvitationAddDto;
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.openxml4j.exceptions.NotOfficeXmlFileException;
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 javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
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;
/**
*
* 邀请码管理 前端控制器
*
*
* @author mitao
* @since 2026-02-03
*/
@RestController
@Api(tags = "邀请码管理")
@Slf4j
@RequestMapping("")
public class XpInvitationCodeController {
@Resource
private IXpInvitationCodeService xpInvitationCodeService;
@Resource
private IXpWhitelistService xpWhitelistService;
@ApiOperation(value = "邀请码管理分页列表",response = XpInvitationCode.class)
@PostMapping("/api/v1/invitation/pageList")
public R> pageList(@RequestBody InvitationPageListQuery query) {
PageInfo pageList = xpInvitationCodeService.pageList(query);
return R.ok(pageList);
}
/**
* 生成邀请码
*/
@PostMapping("/api/v1/invitation/add")
@ResponseBody
@ApiOperation(value = "生成邀请码")
@Transactional
public R add(@RequestBody InvitationAddDto dto){
return xpInvitationCodeService.add(dto.getPhones());
}
/**
* 解绑
*/
@PutMapping("/api/v1/invitation/unbind")
@ResponseBody
@ApiOperation(value = "解绑")
@ApiImplicitParams({
@ApiImplicitParam(value = "id", name = "id", dataType = "Long", required = true)
})
public R unbind(@RequestParam("id") Long id){
UpdateWrapper xpInvitationCodeUpdateWrapper = new UpdateWrapper<>();
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() {
List 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;
//1.获取excel模板
ClassPathResource classPathResource = new ClassPathResource("template/邀请码导入模板.xlsx");
TemplateExportParams params = new TemplateExportParams(classPathResource.getPath());
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
try {
String fileName = URLEncoder.encode("邀请码导入模板.xlsx", "utf-8");
response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
outputStream = response.getOutputStream();
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
System.out.println("邀请码导入模板下载失败!");
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@ApiOperation(value = "邀请码导入")
@PostMapping("/base/v1/invitation/importExcel")
public R importExcel(@RequestPart("file") MultipartFile file) {
System.out.println("文件名 = " + file.getOriginalFilename());
System.out.println("文件大小 = " + file.getSize());
System.out.println("ContentType = " + file.getContentType());
ImportParams params = new ImportParams();
params.setHeadRows(1); //表头行数
InputStream inputStream = null;
List 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 R.fail("邀请码存在重复!");
}
Map codeMap = xpInvitationCodeService.list().stream()
.collect(Collectors.toMap(XpInvitationCode::getInvitationCode, XpInvitationCode::getId));
JSONObject result = new JSONObject();
List addList = new ArrayList<>();
List 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 R.ok(result.toString());
}
xpInvitationCodeService.saveBatch(addList);
xpWhitelistService.saveBatch(addWhitelistList);
return R.ok();
}
@ApiOperation(value = "邀请码导出")
@PostMapping(value = "/api/v1/invitation/exportExcel")
public void exportExcel(@RequestBody InvitationPageListQuery query) {
List list = xpInvitationCodeService.exportList(query);
List 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();
}
}
}
/**
* 批量删除
*/
@GetMapping("/api/v1/invitation/deleteByIds")
@ResponseBody
@ApiOperation(value = "批量删除")
public R deleteByIds(String ids){
// 再转化为Long类型
List longs = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
xpInvitationCodeService.removeBatchByIds(longs);
return R.ok();
}
}