将交易记录导出为excel文件
This commit is contained in:
@@ -18,6 +18,7 @@ public class DateUtil {
|
||||
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
|
||||
public static final String YYYYMM = "yyyyMM";
|
||||
public static final String YYYY_MM_DD = "yyyyMMdd";
|
||||
public static final String YYYY_MM_DD_hh_mm_ss = "yyyyMMddHHMMss";
|
||||
|
||||
/**
|
||||
* LocalDate -> Date
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
@@ -208,4 +209,11 @@ public class ConvenientInquiryController {
|
||||
public Response<Map<String, List<String>>> getCities(){
|
||||
return Response.success(convenientInquiryService.getCities());
|
||||
}
|
||||
|
||||
@ApiOperation("下载交易记录")
|
||||
@PostMapping("/exportTransactionRecords")
|
||||
public void exportTransactionRecords(@Valid @RequestBody QueryPaymentInfoDTO queryPaymentInfoDTO, HttpServletResponse response){
|
||||
convenientInquiryService.exportTransactionRecords(queryPaymentInfoDTO, response);
|
||||
// return Response.success();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.ai.da.model.vo.QueryUserConditionsVO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -50,4 +51,6 @@ public interface ConvenientInquiryService extends IService<Questionnaire> {
|
||||
PageBaseResponse<PaymentInfoVO> queryTransactionRecords(QueryPaymentInfoDTO queryPaymentInfoDTO);
|
||||
|
||||
Map<String, List<String>> getCities();
|
||||
|
||||
void exportTransactionRecords(QueryPaymentInfoDTO queryPaymentInfoDTO, HttpServletResponse response);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.DateUtil;
|
||||
import com.ai.da.mapper.primary.*;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.Questionnaire;
|
||||
@@ -23,12 +24,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.mysql.cj.util.StringUtils;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.poi.xssf.usermodel.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.file.Files;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
@@ -663,4 +669,139 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
||||
}};
|
||||
}
|
||||
|
||||
public void exportTransactionRecords(QueryPaymentInfoDTO queryPaymentInfoDTO, HttpServletResponse response){
|
||||
// 查询数据总量
|
||||
Long total = paymentInfoMapper.queryPaymentInfoCount(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
||||
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
|
||||
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
||||
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(), queryPaymentInfoDTO.getPayer());
|
||||
List<PaymentInfoVO> paymentInfoVOS = paymentInfoMapper.queryPaymentInfo(queryPaymentInfoDTO.getPlatform(), queryPaymentInfoDTO.getPayerTotal(),
|
||||
queryPaymentInfoDTO.getType(), queryPaymentInfoDTO.getStatus(),
|
||||
queryPaymentInfoDTO.getCountry(), queryPaymentInfoDTO.getCity(),
|
||||
queryPaymentInfoDTO.getStartTime(), queryPaymentInfoDTO.getEndTime(),
|
||||
total.intValue(), 0, "ASC", queryPaymentInfoDTO.getPayer());
|
||||
excelExport(paymentInfoVOS, response);
|
||||
}
|
||||
|
||||
public void excelExport(List<PaymentInfoVO> paymentInfoVOS, HttpServletResponse response) {
|
||||
if (paymentInfoVOS == null || paymentInfoVOS.isEmpty()) {
|
||||
log.info("无数据,直接返回,不生成空文件");
|
||||
return;
|
||||
}
|
||||
//生成文件路径
|
||||
String newFilePath = "files";
|
||||
//文件名称
|
||||
String time = DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_hh_mm_ss);
|
||||
String fileName = "paymentInfo_"+ time + ".xlsx";
|
||||
//输出流
|
||||
OutputStream out = null;
|
||||
// 创建Excel文件
|
||||
XSSFWorkbook workBook = new XSSFWorkbook();
|
||||
// 创建Excel工作表(Table),之后的数据都添加到该表中
|
||||
XSSFSheet sheet = workBook.createSheet("数据导出");
|
||||
// 设置列的宽度
|
||||
sheet.setDefaultColumnWidth(16);
|
||||
// 创建标题行
|
||||
XSSFRow titleRow = sheet.createRow(0);
|
||||
String[] title = new String[]{"id", "payer", "platform", "payerTotal", "type", "status",
|
||||
"country", "city", "paymentMethod", "last4", "createTime"};
|
||||
//设置标题字体样式
|
||||
XSSFCellStyle cellStyle = workBook.createCellStyle();
|
||||
XSSFFont font = workBook.createFont();
|
||||
font.setBold(true);//加粗
|
||||
font.setFontHeightInPoints((short) 14);//设置字体大小
|
||||
cellStyle.setFont(font);
|
||||
//设置标题列
|
||||
for (int i = 0; i < title.length; i++) {
|
||||
//创建标题的单元格
|
||||
XSSFCell titleCell = titleRow.createCell(i);
|
||||
//填充标题数值
|
||||
titleCell.setCellValue(title[i]);
|
||||
//设置样式
|
||||
titleCell.setCellStyle(cellStyle);
|
||||
}
|
||||
//填充数据
|
||||
//第一行是标题所以要从第二行开始
|
||||
for (int i = 0; i < paymentInfoVOS.size(); i++) {
|
||||
PaymentInfoVO paymentInfoVO = paymentInfoVOS.get(i);
|
||||
XSSFRow row = sheet.createRow(i + 1);
|
||||
for (int j = 0; j < title.length; j++) {
|
||||
XSSFCell titleCell = row.createCell(j);
|
||||
String exportKey = title[j];
|
||||
switch (exportKey) {
|
||||
case "id":
|
||||
titleCell.setCellValue(paymentInfoVO.getId());
|
||||
break;
|
||||
case "payer":
|
||||
titleCell.setCellValue(paymentInfoVO.getPayer());
|
||||
break;
|
||||
case "platform":
|
||||
titleCell.setCellValue(paymentInfoVO.getPlatform());
|
||||
break;
|
||||
case "payerTotal":
|
||||
titleCell.setCellValue(paymentInfoVO.getPayerTotal());
|
||||
break;
|
||||
case "type":
|
||||
titleCell.setCellValue(paymentInfoVO.getType());
|
||||
break;
|
||||
case "status":
|
||||
titleCell.setCellValue(paymentInfoVO.getStatus());
|
||||
break;
|
||||
case "country":
|
||||
titleCell.setCellValue(paymentInfoVO.getCountry());
|
||||
break;
|
||||
case "city":
|
||||
titleCell.setCellValue(paymentInfoVO.getCity());
|
||||
break;
|
||||
case "paymentMethod":
|
||||
titleCell.setCellValue(paymentInfoVO.getPaymentMethod());
|
||||
break;
|
||||
case "last4":
|
||||
titleCell.setCellValue(paymentInfoVO.getLast4());
|
||||
break;
|
||||
case "createTime":
|
||||
titleCell.setCellValue(paymentInfoVO.getCreateTime());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
File file = new File(newFilePath + File.separator + fileName);
|
||||
out = Files.newOutputStream(file.toPath());
|
||||
workBook.write(out);
|
||||
out.flush();
|
||||
out.close();
|
||||
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
||||
// 读取文件并写入响应输出流
|
||||
OutputStream responseOut = response.getOutputStream();
|
||||
FileInputStream fileInputStream = new FileInputStream(newFilePath + File.separator + fileName);
|
||||
// 将文件转成字节数组,再将数组写入响应的输出流
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead = -1;
|
||||
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
|
||||
responseOut.write(buffer, 0, bytesRead);
|
||||
}
|
||||
// 刷新输出流
|
||||
responseOut.flush();
|
||||
// 关闭流
|
||||
fileInputStream.close();
|
||||
responseOut.close();
|
||||
|
||||
// 路径为文件且不为空则进行删除
|
||||
if (file.isFile() && file.exists()) {
|
||||
boolean delete = file.delete();
|
||||
if (delete){
|
||||
log.info("临时文件:{}, 删除成功", fileName);
|
||||
}else {
|
||||
log.info("临时文件:{}, 删除失败", fileName);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.info(e.getMessage());
|
||||
throw new BusinessException("文件下载失败");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user