|
@@ -62,10 +62,7 @@ import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
-import org.apache.poi.ss.usermodel.CellStyle;
|
|
|
|
|
-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.*;
|
|
|
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
|
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
|
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
@@ -1932,16 +1929,26 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
@Override
|
|
@Override
|
|
|
public R<String> export (BackendOrderParam orderParam, Long userId) {
|
|
public R<String> export (BackendOrderParam orderParam, Long userId) {
|
|
|
List<Order> orderList = orderMapper.findList(orderParam);
|
|
List<Order> orderList = orderMapper.findList(orderParam);
|
|
|
- if (!orderList.isEmpty()) {
|
|
|
|
|
- orderList.forEach(c -> {
|
|
|
|
|
- List<OrderItem> orderItems = orderItemMapper.getListByOrderNumber(c.getOrderNumber());
|
|
|
|
|
- c.setOrderItems(orderItems);
|
|
|
|
|
- c.setGoodsTotalCount(orderItems.stream().map(OrderItem::getProdCount).reduce(0, Integer::sum));
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
if (orderList.isEmpty()) {
|
|
if (orderList.isEmpty()) {
|
|
|
return R.FAIL("未查询到数据不允许导出");
|
|
return R.FAIL("未查询到数据不允许导出");
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 性能优化:批量查询所有订单项,避免N+1查询问题
|
|
|
|
|
+ List<String> orderNumbers = orderList.stream()
|
|
|
|
|
+ .map(Order::getOrderNumber)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ List<OrderItem> allOrderItems = orderItemMapper.getListByOrderNumbers(orderNumbers);
|
|
|
|
|
+
|
|
|
|
|
+ // 按订单编号分组
|
|
|
|
|
+ Map<String, List<OrderItem>> orderItemMap = allOrderItems.stream()
|
|
|
|
|
+ .collect(Collectors.groupingBy(OrderItem::getOrderNumber));
|
|
|
|
|
+
|
|
|
|
|
+ // 设置订单项
|
|
|
|
|
+ orderList.forEach(c -> {
|
|
|
|
|
+ List<OrderItem> orderItems = orderItemMap.getOrDefault(c.getOrderNumber(), Collections.emptyList());
|
|
|
|
|
+ c.setOrderItems(orderItems);
|
|
|
|
|
+ c.setGoodsTotalCount(orderItems.stream().map(OrderItem::getProdCount).reduce(0, Integer::sum));
|
|
|
|
|
+ });
|
|
|
String taskId = UUID.randomUUID().toString();
|
|
String taskId = UUID.randomUUID().toString();
|
|
|
ExportTask exportTask = new ExportTask();
|
|
ExportTask exportTask = new ExportTask();
|
|
|
exportTask.setUserId(userId);
|
|
exportTask.setUserId(userId);
|
|
@@ -2042,7 +2049,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
ExportUtils.createColumnHeaders(sheet, headerStyle, headers);
|
|
ExportUtils.createColumnHeaders(sheet, headerStyle, headers);
|
|
|
|
|
|
|
|
// 计算并创建总计行
|
|
// 计算并创建总计行
|
|
|
- createSummaryRow(sheet, orderList, dataStyle, numberStyle);
|
|
|
|
|
|
|
+ createSummaryRow(sheet, orderList, workbook);
|
|
|
|
|
|
|
|
// 填充数据
|
|
// 填充数据
|
|
|
fillOrderData(sheet, orderList, dataStyle, numberStyle, dateStyle, context);
|
|
fillOrderData(sheet, orderList, dataStyle, numberStyle, dateStyle, context);
|
|
@@ -2109,7 +2116,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
/**
|
|
/**
|
|
|
* 创建总计行
|
|
* 创建总计行
|
|
|
*/
|
|
*/
|
|
|
- private void createSummaryRow(Sheet sheet, List<Order> orderList, CellStyle dataStyle, CellStyle numberStyle) {
|
|
|
|
|
|
|
+ private void createSummaryRow(Sheet sheet, List<Order> orderList, Workbook workbook) {
|
|
|
|
|
+ // 创建总计行样式(浅绿色背景)
|
|
|
|
|
+ CellStyle summaryStyle = workbook.createCellStyle();
|
|
|
|
|
+ summaryStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
|
|
|
|
|
+ summaryStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
|
|
|
|
+ summaryStyle.setBorderTop(BorderStyle.THIN);
|
|
|
|
|
+ summaryStyle.setBorderBottom(BorderStyle.THIN);
|
|
|
|
|
+ summaryStyle.setBorderLeft(BorderStyle.THIN);
|
|
|
|
|
+ summaryStyle.setBorderRight(BorderStyle.THIN);
|
|
|
|
|
+ summaryStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
|
|
+ summaryStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
|
|
+
|
|
|
|
|
+ // 创建总计行数字样式(浅绿色背景)
|
|
|
|
|
+ CellStyle summaryNumberStyle = workbook.createCellStyle();
|
|
|
|
|
+ summaryNumberStyle.cloneStyleFrom(summaryStyle);
|
|
|
|
|
+ DataFormat dataFormat = workbook.createDataFormat();
|
|
|
|
|
+ summaryNumberStyle.setDataFormat(dataFormat.getFormat("#,##0.00"));
|
|
|
|
|
+
|
|
|
// 计算总计值
|
|
// 计算总计值
|
|
|
int totalProductCount = 0; // 商品总数量
|
|
int totalProductCount = 0; // 商品总数量
|
|
|
double totalAmount = 0; // 商品总额
|
|
double totalAmount = 0; // 商品总额
|
|
@@ -2149,22 +2173,32 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
summaryRow.setHeightInPoints(20);
|
|
summaryRow.setHeightInPoints(20);
|
|
|
|
|
|
|
|
// 序号列显示"总计"
|
|
// 序号列显示"总计"
|
|
|
- ExportUtils.createCell(sheet, summaryRow, 0, 0, 2, "总计", dataStyle);
|
|
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, 0, 0, 2, "总计", summaryStyle);
|
|
|
|
|
+
|
|
|
|
|
+ // 其他列填充空白单元格(保持背景色)
|
|
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, i, 0, 2, "", summaryStyle);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// 商品总数量(索引13)
|
|
// 商品总数量(索引13)
|
|
|
- ExportUtils.createCell(sheet, summaryRow, 13, 0, 2, totalProductCount, numberStyle);
|
|
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, 13, 0, 2, totalProductCount, summaryNumberStyle);
|
|
|
|
|
|
|
|
// 商品总额(索引14)
|
|
// 商品总额(索引14)
|
|
|
- ExportUtils.createCell(sheet, summaryRow, 14, 0, 2, totalAmount, numberStyle);
|
|
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, 14, 0, 2, totalAmount, summaryNumberStyle);
|
|
|
|
|
|
|
|
// 运费(索引15)
|
|
// 运费(索引15)
|
|
|
- ExportUtils.createCell(sheet, summaryRow, 15, 0, 2, totalFreight, numberStyle);
|
|
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, 15, 0, 2, totalFreight, summaryNumberStyle);
|
|
|
|
|
|
|
|
// 积分抵扣(索引16,显示为负数,四舍五入保留后4位)
|
|
// 积分抵扣(索引16,显示为负数,四舍五入保留后4位)
|
|
|
- ExportUtils.createCell(sheet, summaryRow, 16, 0, 2, "-" + Arith.round(totalOffsetPoints, 4), numberStyle);
|
|
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, 16, 0, 2, "-" + Arith.round(totalOffsetPoints, 4), summaryNumberStyle);
|
|
|
|
|
|
|
|
// 实付金额(索引17)
|
|
// 实付金额(索引17)
|
|
|
- ExportUtils.createCell(sheet, summaryRow, 17, 0, 2, totalActualAmount, numberStyle);
|
|
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, 17, 0, 2, totalActualAmount, summaryNumberStyle);
|
|
|
|
|
+
|
|
|
|
|
+ // 后续列填充空白单元格(保持背景色)
|
|
|
|
|
+ for (int i = 18; i <= 20; i++) {
|
|
|
|
|
+ ExportUtils.createCell(sheet, summaryRow, i, 0, 2, "", summaryStyle);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|