From 8e0f237e2efa3ca5cd50a804f257f89efeaeaded Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Sat, 17 Aug 2024 11:29:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B0=E6=A1=8C=E6=95=B0=E6=8D=AE=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/ysk/cashier/utils/FileUtil.java | 52 ++++++++++++-- .../service/impl/SummaryServiceImpl.java | 68 +++++++++++++++---- 2 files changed, 102 insertions(+), 18 deletions(-) diff --git a/eladmin-common/src/main/java/cn/ysk/cashier/utils/FileUtil.java b/eladmin-common/src/main/java/cn/ysk/cashier/utils/FileUtil.java index 37564530..54bd8138 100644 --- a/eladmin-common/src/main/java/cn/ysk/cashier/utils/FileUtil.java +++ b/eladmin-common/src/main/java/cn/ysk/cashier/utils/FileUtil.java @@ -23,9 +23,11 @@ import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import cn.ysk.cashier.exception.BadRequestException; import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; @@ -37,10 +39,7 @@ import java.io.*; import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; /** @@ -238,6 +237,51 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { IoUtil.close(out); } + public static void downloadAndMergeExcel(List> list, List> mergeData, List keyList, HttpServletResponse response) throws IOException { + String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; + + // 创建工作簿 + Workbook workbook = new XSSFWorkbook(); + // 创建工作表 + Sheet sheet = workbook.createSheet("Sheet1"); + + // 合并单元格,从第 0 行第 0 列到第 0 行第 2 列 +// sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); + + for (List mergeDatum : mergeData) { + sheet.addMergedRegion(new CellRangeAddress(mergeDatum.get(0), mergeDatum.get(1), mergeDatum.get(2), mergeDatum.get(3))); + } + + Row row0 = sheet.createRow(0); + for (int i = 0; i < keyList.size(); i++) { + Cell cell = row0.createCell(i); + cell.setCellValue(keyList.get(i)); + } + for (int i = 0; i < list.size(); i++) { + Map map = list.get(i); + Row row = sheet.createRow(i + 1); + for (int j = 0; j < keyList.size(); j++) { + Cell cell = row.createCell(j); + cell.setCellValue(map.get(keyList.get(j)) == null ? "" : map.get(keyList.get(j)).toString()); + } + } + + // response为HttpServletResponse对象 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); + + try (FileOutputStream outputStream = new FileOutputStream(tempPath); + ServletOutputStream out = response.getOutputStream()) { + + workbook.write(outputStream); + workbook.write(out); + } catch (IOException e) { + // 更详细的错误处理 + e.printStackTrace(); + // 可以考虑返回一个错误响应给客户端 + } + } + /** * 输入标题到excel * diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java index 7e0dbaf7..7be6de7e 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java @@ -16,6 +16,7 @@ import cn.ysk.cashier.utils.DateUtil; import cn.ysk.cashier.utils.FileUtil; import cn.ysk.cashier.vo.*; import com.alibaba.fastjson.JSONObject; +import com.beust.ah.A; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -558,38 +559,77 @@ public class SummaryServiceImpl implements SummaryService { Map> countByTableMap = countByTables.stream() .collect(Collectors.groupingBy(TbOrderSalesCountByTable::getTableId)); - ConcurrentLinkedQueue> list = new ConcurrentLinkedQueue<>(); - ArrayList mergeRowIndex = new ArrayList<>(); + // 比较 shopTableSeleInfoDto 的 startTime 和 endTime 是不是同一天 + boolean sameDay = cn.hutool.core.date.DateUtil.isSameDay(shopTableSeleInfoDto.getStartTime(), shopTableSeleInfoDto.getEndTime()); + + String queryDate = cn.hutool.core.date.DateUtil.format(shopTableSeleInfoDto.getStartTime(), "yyyy-MM-dd"); + if (!sameDay) { + queryDate += " 至 " + cn.hutool.core.date.DateUtil.format(shopTableSeleInfoDto.getEndTime(), "yyyy-MM-dd"); + } + + List> list = new ArrayList<>(); + + List> mergeList = new ArrayList<>(); + Map tableStartIndexMap = new HashMap<>(); + int rowIndex = 1; for (ShopTableSaleInfoVo all : infoVos) { List tables = countByTableMap.get(all.getTableCode()); if (tables == null) { continue; } + BigDecimal total = BigDecimal.ZERO; + for (TbOrderSalesCountByTable table : tables) { + total = total.add(table.getSalesAmount().abs()); + } + + String tableCode = all.getTableName().toString(); + if (!tableStartIndexMap.containsKey(tableCode)) { + tableStartIndexMap.put(tableCode, rowIndex); + } + for (TbOrderSalesCountByTable table : tables) { Map map = new LinkedHashMap<>(); - map.put("开始时间", shopTableSeleInfoDto.getStartTime()); - map.put("结束时间", shopTableSeleInfoDto.getEndTime()); - map.put("区域名称", all.getAreaName()); - map.put("桌台名称", all.getTableName()); + map.put("日期", queryDate); + map.put("台桌", all.getTableName()); map.put("商品分类", table.getCateName()); map.put("商品名称", table.getProductName()); map.put("单位", table.getUnitName()); map.put("商品规格", table.getProductSkuName()); map.put("销量", table.getSalesNum()); - map.put("销售额", table.getSalesAmount()); + map.put("单价", table.getPrice()); + map.put("金额", table.getSalesAmount()); + map.put("销售额", total); + map.put("退单量", table.getRefNum()); + map.put("退单额", table.getRefAmount()); list.add(map); + rowIndex++; } - if (!tables.isEmpty()) { - if (mergeRowIndex.isEmpty()) { - mergeRowIndex.add(tables.size()); - }else { - mergeRowIndex.add(mergeRowIndex.get(mergeRowIndex.size() - 1) + tables.size()); - } + int start = tableStartIndexMap.get(tableCode); + int end = rowIndex - 1; + if (end - start > 0) { + mergeList.add(Arrays.asList(start, end, 0, 0)); + mergeList.add(Arrays.asList(start, end, 1, 1)); + mergeList.add(Arrays.asList(start, end, 9, 9)); } } - FileUtil.downloadExcelAndMerge(list, 4, response, mergeRowIndex); + + List keyList = new ArrayList<>(); + keyList.add("日期"); + keyList.add("台桌"); + keyList.add("商品分类"); + keyList.add("商品名称"); + keyList.add("单位"); + keyList.add("商品规格"); + keyList.add("销量"); + keyList.add("单价"); + keyList.add("金额"); + keyList.add("销售额"); + keyList.add("退单量"); + keyList.add("退单额"); + + FileUtil.downloadAndMergeExcel(list, mergeList, keyList, response); } }