diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java index 2cc134135..c01eaf66d 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/TableSummaryServiceImpl.java @@ -15,9 +15,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -32,7 +30,6 @@ public class TableSummaryServiceImpl implements TableSummaryService { @Resource private ShopTableOrderStatisticMapper shopTableOrderStatisticMapper; - @Override public void summaryExportList(TableSummaryParam param, HttpServletResponse response) { if (param.getBeginDate() == null && param.getEndDate() == null) { @@ -51,47 +48,41 @@ public class TableSummaryServiceImpl implements TableSummaryService { param.setBeginDate(formattedStartDate + " 00:00:00"); param.setEndDate(formattedEndDate + " 23:59:59"); } + List list = shopTableOrderStatisticMapper.findSummaryExportList(param); if (CollUtil.isEmpty(list)) { ExcelExportUtil.exportToResponse(new ArrayList<>(), TableSummaryExportVo.class, "台桌统计", response); return; } - record TableSummary(String tableKey, BigDecimal totalSales, Map productSales) {} - Map summaryMap = list.stream() + // === Step 1: 按日期计算 当日总销售额 === + Map dailyTotalMap = list.stream() .collect(Collectors.groupingBy( - vo -> vo.getTableCode() + "_" + vo.getCreateDate(), - Collectors.collectingAndThen( - Collectors.toList(), - vos -> { - String tableKey = vos.getFirst().getTableCode() + "_" + vos.getFirst().getCreateDate(); - BigDecimal totalSales = vos.stream() - .map(TableSummaryExportVo::getAmount) - .reduce(BigDecimal.ZERO, BigDecimal::add); - - Map productSales = vos.stream() - .collect(Collectors.groupingBy( - TableSummaryExportVo::getProductId, - Collectors.reducing( - BigDecimal.ZERO, - TableSummaryExportVo::getAmount, - BigDecimal::add - ) - )); - - return new TableSummary(tableKey, totalSales, productSales); - } - ) + TableSummaryExportVo::getCreateDate, + Collectors.reducing(BigDecimal.ZERO, TableSummaryExportVo::getAmount, BigDecimal::add) )); - list.forEach(vo -> { - TableSummary summary = summaryMap.get(vo.getTableConcatDate()); - if (summary != null) { - vo.setTotalSalesAmount(summary.totalSales()); - vo.setSalesAmount(summary.productSales().getOrDefault(vo.getProductId(), BigDecimal.ZERO)); - } - }); + // === Step 2: 按 台桌+日期 计算 每台桌当日销售额 === + Map tableDailyTotalMap = list.stream() + .collect(Collectors.groupingBy( + vo -> vo.getTableCode() + "_" + vo.getCreateDate(), + Collectors.reducing(BigDecimal.ZERO, TableSummaryExportVo::getAmount, BigDecimal::add) + )); + + // === Step 3: 回填字段 === + for (TableSummaryExportVo vo : list) { + String dateKey = vo.getCreateDate(); + String tableDateKey = vo.getTableCode() + "_" + dateKey; + + // 设置“总销售额” = 该台桌当天总销售额 + vo.setSalesAmount(tableDailyTotalMap.getOrDefault(tableDateKey, BigDecimal.ZERO)); + + // 设置“当日总销售额” = 当天所有台桌总和 + vo.setTotalSalesAmount(dailyTotalMap.getOrDefault(dateKey, BigDecimal.ZERO)); + } + + // === Step 4: 导出 === List strategies = calculateMergeCells(list); ExcelExportUtil.exportMultipleSheetsToResponse( List.of(new SheetData() @@ -108,89 +99,52 @@ public class TableSummaryServiceImpl implements TableSummaryService { */ private List calculateMergeCells(List list) { List mergeInfos = new ArrayList<>(); - if (CollUtil.isEmpty(list)) { return mergeInfos; } - // 按createDate分组 - Map> byCreateDate = list.stream() + // 按日期分组(用于合并“日期”和“当日总销售额”列) + Map> byDate = list.stream() .collect(Collectors.groupingBy(TableSummaryExportVo::getCreateDate)); - List keyList = byCreateDate.keySet().stream().sorted().toList(); + int currentRow = 1; // Excel 数据从第1行开始(第0行为标题) - // Excel行号从1开始(假设第0行是标题) - int startRow = 1; + // 按日期排序 + List sortedDates = byDate.keySet().stream().sorted().toList(); - for (String key : keyList) { - List dateGroup = byCreateDate.get(key); - int dateGroupSize = dateGroup.size(); + for (String date : sortedDates) { + List dateGroup = byDate.get(date); + int dateSize = dateGroup.size(); - // 合并createDate列(假设是第1列) - if (dateGroupSize > 1) { - mergeInfos.add(ExcelExportUtil.createMergeStrategy(startRow, startRow + dateGroupSize - 1, 0, 0)); - mergeInfos.add(ExcelExportUtil.createMergeStrategy(startRow, startRow + dateGroupSize - 1, 9, 9)); + // 合并“日期”列(第0列)和“当日总销售额”列(第9列) + if (dateSize > 1) { + mergeInfos.add(ExcelExportUtil.createMergeStrategy(currentRow, currentRow + dateSize - 1, 0, 0)); + mergeInfos.add(ExcelExportUtil.createMergeStrategy(currentRow, currentRow + dateSize - 1, 9, 9)); } - // 在销售额组内按tableName分组 - Map> byTableName = dateGroup.stream() + // 在日期组内,按台桌分组(用于合并“台桌”和“总销售额”列) + Map> byTable = dateGroup.stream() .collect(Collectors.groupingBy(TableSummaryExportVo::getTableName)); - List nameKeyList = byTableName.keySet().stream().sorted().toList(); + int tableStartRow = currentRow; + List sortedTables = byTable.keySet().stream().sorted().toList(); - int currentRow = startRow; - for (String nameKey : nameKeyList) { - int nameGroupSize = byTableName.get(nameKey).size(); + for (String table : sortedTables) { + List tableGroup = byTable.get(table); + int tableSize = tableGroup.size(); - // 合并tableName列(假设是第4列,根据实际Excel列调整) - if (nameGroupSize > 1) { - mergeInfos.add(ExcelExportUtil.createMergeStrategy(currentRow, currentRow + nameGroupSize - 1, 1, 1)); + // 合并“台桌”列(第1列)和“总销售额”列(第8列) + if (tableSize > 1) { + mergeInfos.add(ExcelExportUtil.createMergeStrategy(tableStartRow, tableStartRow + tableSize - 1, 1, 1)); + mergeInfos.add(ExcelExportUtil.createMergeStrategy(tableStartRow, tableStartRow + tableSize - 1, 8, 8)); } - // 移动到下一组 - currentRow += nameGroupSize; + tableStartRow += tableSize; } - // 在日期组内按totalSalesAmount分组(同台桌同日期) - Map> byTotalSales = dateGroup.stream() - .collect(Collectors.groupingBy(TableSummaryExportVo::getTotalSalesAmount)); - - List salesKeyList = byTotalSales.keySet().stream().sorted().toList(); - - int nameRow = startRow; - - for (BigDecimal saleKey : salesKeyList) { - List salesGroup = byTotalSales.get(saleKey); - int salesGroupSize = salesGroup.size(); - - // 合并totalSalesAmount列(假设是第8列,根据实际Excel列调整) - if (salesGroupSize > 1) { - mergeInfos.add(ExcelExportUtil.createMergeStrategy(nameRow, nameRow + salesGroupSize - 1, 9, 9)); - } - -// // 在销售额组内按tableName分组 -// Map> byTableName = salesGroup.stream() -// .collect(Collectors.groupingBy(TableSummaryExportVo::getTableName)); -// -// List nameKeyList = byTableName.keySet().stream().sorted().toList(); -// -// for (List nameGroup : byTableName.values()) { -// int nameGroupSize = nameGroup.size(); -// -// // 合并tableName列(假设是第4列,根据实际Excel列调整) -// if (nameGroupSize > 1) { -// mergeInfos.add(ExcelExportUtil.createMergeStrategy(currentRow, currentRow + nameGroupSize - 1, 1, 1)); -// } -// -// // 移动到下一组 -// currentRow += nameGroupSize; -// } - } - - startRow += dateGroupSize; + currentRow += dateSize; } return mergeInfos; } - -} +} \ No newline at end of file