导出报表 11点报表
This commit is contained in:
@@ -8,43 +8,16 @@ import com.rj.service.ILbDailyUserTradeReportService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.servlet.ServletOutputStream;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
import org.apache.poi.ss.usermodel.DataFormat;
|
||||
import org.apache.poi.ss.usermodel.FillPatternType;
|
||||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||
import org.apache.poi.ss.usermodel.VerticalAlignment;
|
||||
import org.apache.poi.ss.usermodel.BorderStyle;
|
||||
import org.apache.poi.ss.usermodel.Font;
|
||||
import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
|
||||
import org.apache.poi.ss.usermodel.ComparisonOperator;
|
||||
import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
|
||||
import org.apache.poi.ss.usermodel.FontFormatting;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
||||
import org.apache.poi.xssf.usermodel.XSSFColor;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
@@ -658,213 +631,6 @@ public class LbDailyUserTradeReportController {
|
||||
@Parameter(description = "租户ID", required = true)
|
||||
@RequestParam String tenantId,
|
||||
HttpServletResponse response) {
|
||||
try {
|
||||
if (tenantId == null || tenantId.trim().isEmpty()) {
|
||||
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "tenantId不能为空");
|
||||
return;
|
||||
}
|
||||
if (reportDate == null || reportDate.trim().isEmpty()) {
|
||||
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "reportDate不能为空");
|
||||
return;
|
||||
}
|
||||
|
||||
LocalDate parsedReportDate;
|
||||
try {
|
||||
parsedReportDate = LocalDate.parse(reportDate.trim());
|
||||
} catch (Exception e) {
|
||||
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "报表日期格式错误,请使用 yyyy-MM-dd");
|
||||
return;
|
||||
}
|
||||
|
||||
LocalDateTime start = parsedReportDate.atStartOfDay();
|
||||
LocalDateTime end = parsedReportDate.plusDays(1).atStartOfDay();
|
||||
|
||||
LambdaQueryWrapper<LbDailyUserTradeReport> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(LbDailyUserTradeReport::getTenantId, tenantId.trim())
|
||||
.ge(LbDailyUserTradeReport::getReportDate, start)
|
||||
.lt(LbDailyUserTradeReport::getReportDate, end)
|
||||
.orderByDesc(LbDailyUserTradeReport::getCreatedAt);
|
||||
|
||||
List<LbDailyUserTradeReport> rows = lbDailyUserTradeReportService.list(queryWrapper);
|
||||
rows.sort(
|
||||
Comparator
|
||||
.comparingInt((LbDailyUserTradeReport o) -> "report_sum".equals(o.getDataType()) ? 1 : 0)
|
||||
.thenComparing((a, b) -> {
|
||||
BigDecimal da = a.getDiffAmt() == null ? BigDecimal.ZERO : a.getDiffAmt();
|
||||
BigDecimal db = b.getDiffAmt() == null ? BigDecimal.ZERO : b.getDiffAmt();
|
||||
return db.compareTo(da);
|
||||
})
|
||||
);
|
||||
|
||||
try (Workbook workbook = new XSSFWorkbook()) {
|
||||
Sheet sheet = workbook.createSheet("report");
|
||||
|
||||
DateTimeFormatter mmdd = DateTimeFormatter.ofPattern("MM-dd");
|
||||
String d0 = parsedReportDate.format(mmdd);
|
||||
String d1 = parsedReportDate.minusDays(1).format(mmdd);
|
||||
|
||||
float rowHeightFactor = 1.3f;
|
||||
sheet.setDefaultRowHeightInPoints(sheet.getDefaultRowHeightInPoints() * rowHeightFactor);
|
||||
|
||||
DataFormat dataFormat = workbook.createDataFormat();
|
||||
|
||||
CellStyle headerStyle = workbook.createCellStyle();
|
||||
Font headerFont = workbook.createFont();
|
||||
headerFont.setBold(true);
|
||||
headerFont.setColor(IndexedColors.DARK_BLUE.getIndex());
|
||||
headerStyle.setFont(headerFont);
|
||||
headerStyle.setAlignment(HorizontalAlignment.CENTER);
|
||||
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
headerStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
|
||||
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
headerStyle.setBorderTop(BorderStyle.THIN);
|
||||
headerStyle.setBorderBottom(BorderStyle.THIN);
|
||||
headerStyle.setBorderLeft(BorderStyle.THIN);
|
||||
headerStyle.setBorderRight(BorderStyle.THIN);
|
||||
|
||||
CellStyle textStyle = workbook.createCellStyle();
|
||||
textStyle.setAlignment(HorizontalAlignment.LEFT);
|
||||
textStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
textStyle.setBorderTop(BorderStyle.THIN);
|
||||
textStyle.setBorderBottom(BorderStyle.THIN);
|
||||
textStyle.setBorderLeft(BorderStyle.THIN);
|
||||
textStyle.setBorderRight(BorderStyle.THIN);
|
||||
|
||||
CellStyle zebraTextStyle = workbook.createCellStyle();
|
||||
zebraTextStyle.cloneStyleFrom(textStyle);
|
||||
zebraTextStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
|
||||
CellStyle intStyle = workbook.createCellStyle();
|
||||
intStyle.setAlignment(HorizontalAlignment.RIGHT);
|
||||
intStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
intStyle.setDataFormat(dataFormat.getFormat("#,##0"));
|
||||
intStyle.setBorderTop(BorderStyle.THIN);
|
||||
intStyle.setBorderBottom(BorderStyle.THIN);
|
||||
intStyle.setBorderLeft(BorderStyle.THIN);
|
||||
intStyle.setBorderRight(BorderStyle.THIN);
|
||||
|
||||
CellStyle zebraIntStyle = workbook.createCellStyle();
|
||||
zebraIntStyle.cloneStyleFrom(intStyle);
|
||||
zebraIntStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
|
||||
// 更淡的斑马纹底色(接近白色)
|
||||
XSSFColor zebraFill = new XSSFColor(new Color(242, 244, 248), null);
|
||||
((XSSFCellStyle) zebraTextStyle).setFillForegroundColor(zebraFill);
|
||||
((XSSFCellStyle) zebraIntStyle).setFillForegroundColor(zebraFill);
|
||||
|
||||
CellStyle summaryTextStyle = workbook.createCellStyle();
|
||||
summaryTextStyle.cloneStyleFrom(textStyle);
|
||||
summaryTextStyle.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());
|
||||
summaryTextStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
Font summaryFont = workbook.createFont();
|
||||
summaryFont.setBold(true);
|
||||
summaryTextStyle.setFont(summaryFont);
|
||||
summaryTextStyle.setBorderTop(BorderStyle.THIN);
|
||||
|
||||
CellStyle summaryIntStyle = workbook.createCellStyle();
|
||||
summaryIntStyle.cloneStyleFrom(intStyle);
|
||||
summaryIntStyle.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());
|
||||
summaryIntStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
summaryIntStyle.setFont(summaryFont);
|
||||
summaryIntStyle.setBorderTop(BorderStyle.THIN);
|
||||
|
||||
int r = 0;
|
||||
Row header = sheet.createRow(r++);
|
||||
header.setHeightInPoints(20 * rowHeightFactor);
|
||||
createHeaderCell(header, 0, "昵称", headerStyle);
|
||||
createHeaderCell(header, 1, d1 + "买货", headerStyle);
|
||||
createHeaderCell(header, 2, d0 + "卖货", headerStyle);
|
||||
createHeaderCell(header, 3, d0 + "买货", headerStyle);
|
||||
createHeaderCell(header, 4, "服务费", headerStyle);
|
||||
createHeaderCell(header, 5, "差额", headerStyle);
|
||||
createHeaderCell(header, 6, "应收应付", headerStyle);
|
||||
createHeaderCell(header, 7, "抵扣金额", headerStyle);
|
||||
|
||||
sheet.createFreezePane(0, 1);
|
||||
sheet.setAutoFilter(new CellRangeAddress(0, 0, 0, 7));
|
||||
|
||||
for (LbDailyUserTradeReport item : rows) {
|
||||
Row row = sheet.createRow(r++);
|
||||
row.setHeightInPoints(row.getHeightInPoints() * rowHeightFactor);
|
||||
boolean isSummary = "report_sum".equals(item.getDataType());
|
||||
boolean zebra = (r % 2 == 0);
|
||||
|
||||
CellStyle tStyle = isSummary ? summaryTextStyle : (zebra ? zebraTextStyle : textStyle);
|
||||
CellStyle nStyle = isSummary ? summaryIntStyle : (zebra ? zebraIntStyle : intStyle);
|
||||
|
||||
createTextCell(row, 0, item.getNickname() == null ? "" : item.getNickname(), tStyle);
|
||||
createIntCell(row, 1, roundedInt(item.getYestodayBuyAmt()), nStyle);
|
||||
createIntCell(row, 2, roundedInt(item.getDailySellAmt()), nStyle);
|
||||
createIntCell(row, 3, roundedInt(item.getDailyBuyAmt()), nStyle);
|
||||
createIntCell(row, 4, roundedInt(item.getServiceAmt()), nStyle);
|
||||
createIntCell(row, 5, roundedInt(item.getDiffAmt()), nStyle);
|
||||
createIntCell(row, 6, roundedInt(item.getActualReceiptsPayments()), nStyle);
|
||||
createIntCell(row, 7, roundedInt(item.getDikouAmt()), nStyle);
|
||||
}
|
||||
|
||||
if (r > 1) {
|
||||
SheetConditionalFormatting scf = sheet.getSheetConditionalFormatting();
|
||||
ConditionalFormattingRule negative = scf.createConditionalFormattingRule(ComparisonOperator.LT, "0");
|
||||
FontFormatting ff = negative.createFontFormatting();
|
||||
ff.setFontColorIndex(IndexedColors.DARK_RED.getIndex());
|
||||
ff.setFontStyle(false, false);
|
||||
scf.addConditionalFormatting(new CellRangeAddress[]{new CellRangeAddress(1, r - 1, 5, 5)}, negative);
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 7; i++) {
|
||||
sheet.autoSizeColumn(i);
|
||||
int currentWidth = sheet.getColumnWidth(i);
|
||||
int widened = (int) Math.min(255 * 256, Math.round(currentWidth * 1.5));
|
||||
sheet.setColumnWidth(i, widened);
|
||||
}
|
||||
|
||||
String filename = "当日汇总报表" + parsedReportDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xlsx";
|
||||
String encoded = URLEncoder.encode(filename, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
|
||||
|
||||
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encoded);
|
||||
|
||||
try (ServletOutputStream os = response.getOutputStream()) {
|
||||
workbook.write(os);
|
||||
os.flush();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
response.reset();
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
||||
response.setContentType("text/plain;charset=UTF-8");
|
||||
response.getWriter().write("导出异常:" + e.getMessage());
|
||||
} catch (Exception ignored) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static long roundedInt(BigDecimal value) {
|
||||
if (value == null) {
|
||||
return 0L;
|
||||
}
|
||||
return value.setScale(0, RoundingMode.HALF_UP).longValue();
|
||||
}
|
||||
|
||||
private static void createHeaderCell(Row row, int col, String text, CellStyle style) {
|
||||
Cell cell = row.createCell(col);
|
||||
cell.setCellValue(text);
|
||||
cell.setCellStyle(style);
|
||||
}
|
||||
|
||||
private static void createTextCell(Row row, int col, String text, CellStyle style) {
|
||||
Cell cell = row.createCell(col);
|
||||
cell.setCellValue(text);
|
||||
cell.setCellStyle(style);
|
||||
}
|
||||
|
||||
private static void createIntCell(Row row, int col, long value, CellStyle style) {
|
||||
Cell cell = row.createCell(col);
|
||||
cell.setCellValue((double) value);
|
||||
cell.setCellStyle(style);
|
||||
lbDailyUserTradeReportService.exportByDateAndTenant(reportDate, tenantId, response);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user