From 7cec1477cd8dc30a1719c1c4c5952849e07a0f2a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 15 Jan 2026 19:23:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=A3=9F=E5=A0=82=E8=8F=9C=E5=93=81?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E7=BB=9F=E8=AE=A1(=E6=8C=89=E5=A4=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/dto/order/HardOrderDto.java | 6 + .../order/HardCanteenTotalController.java | 10 ++ .../order/HardCanteenTotalServiceImpl.java | 127 +++++++++++++++++- .../main/resources/file/支付方式交易汇总.xlsx | Bin 10035 -> 0 bytes .../file/食堂菜品购买统计(按天).xlsx | Bin 0 -> 10220 bytes .../resources/mapper/order/HardCarMapper.xml | 3 - 6 files changed, 142 insertions(+), 4 deletions(-) delete mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按天).xlsx diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java index d7cda0eff..c58531eab 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java @@ -62,6 +62,12 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn */ private String afterSaleNo; + /** + * 0 yyyy-MM-dd + * 1 yyyy-MM + */ + private String createTimeType = "0"; + private String createTimeStr; /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java index ab28f425a..5d43020c7 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java @@ -28,6 +28,8 @@ import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Map; @@ -116,6 +118,14 @@ public class HardCanteenTotalController { @PostMapping("/proudct-total-export-by-day") @SysLog("食堂菜品购买统计导出(按天统计)") public void productTotalExportByDay(HttpServletResponse response, @RequestBody HardOrderDto dto) { + if (ObjectUtil.isEmpty(dto.getCreateTimeList())) { + throw new RuntimeException("请选择创建时间(天)"); + } + // 导出最多只能导出一年 + long days = Math.abs(ChronoUnit.DAYS.between(dto.getCreateTimeList()[0].toLocalDate(), dto.getCreateTimeList()[1].toLocalDate())); + if (days > 366) { + throw new RuntimeException("最多只能导出一年的数据"); + } canteenTotalService.productTotalExportByDay(response, dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java index f55ab99e4..49bfa8f68 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service.impl.order; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.ObjectUtil; @@ -29,6 +30,7 @@ import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderSbVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo; @@ -269,8 +271,121 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { @Override public void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto) { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); - try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/设备交易金额汇总.xlsx")).build()) { + // 查询食堂 + String mchName = "所有"; + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + MchManageVo mch = remoteMchService.getById(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mch)) { + mchName = mch.getName(); + } + } + // 标题 + // 格式-2025年县府一楼食堂就餐情况统计表 + String title = LocalDateTimeUtil.format(dto.getCreateTimeList()[0].toLocalDate(), DatePattern.CHINESE_DATE_PATTERN) + "至" + LocalDateTimeUtil.format(dto.getCreateTimeList()[1].toLocalDate(), DatePattern.CHINESE_DATE_PATTERN) + mchName + "就餐情况统计表"; + // 选择的天数 + List dateRangeList = getDateRangeList(dto.getCreateTimeList()[0].toLocalDate(), dto.getCreateTimeList()[1].toLocalDate()); + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/食堂菜品购买统计(按天).xlsx")).inMemory(true).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map = new HashMap(); + map.put("title", title); + + // 总金额 + double sumMorningPrice = 0; + long sumMorningTimeCount = 0; + double sumNoonPrice = 0; + long sumNoonTimeCount = 0; + double sumEveningPrice = 0; + long sumEveningTimeCount = 0; + + Page page = productTotal(new Page(1, 2000), dto, null); + List records = page.getRecords(); + // 开始处理excel + List> excelList = new LinkedList<>(); + for (LocalDate v : dateRangeList) { + Map excelMap = new HashMap(); + String timeStr = ""; + double morningPrice = 0; + long morningTimeCount = 0; + double noonPrice = 0; + long noonTimeCount = 0; + double eveningPrice = 0; + long eveningTimeCount = 0; + double colPrice = 0; + long colTimeCount = 0; + // 早 + HardCanteenProductTotalVo morning = records.stream().filter(item -> ObjectUtil.equals(item.getHourType(), HardHourTypeEnum.MORNING.getType()) && ObjectUtil.equals(item.getCreateTime().toLocalDate(), v)).findFirst().orElse(null); + // 中 + HardCanteenProductTotalVo noon = records.stream().filter(item -> ObjectUtil.equals(item.getHourType(), HardHourTypeEnum.NOONING.getType()) && ObjectUtil.equals(item.getCreateTime().toLocalDate(), v)).findFirst().orElse(null); + // 晚 + HardCanteenProductTotalVo evening = records.stream().filter(item -> ObjectUtil.equals(item.getHourType(), HardHourTypeEnum.NIGHT.getType()) && ObjectUtil.equals(item.getCreateTime().toLocalDate(), v)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(v)) { + timeStr = LocalDateTimeUtil.format(v, DatePattern.NORM_DATE_PATTERN); + } + if (ObjectUtil.isNotEmpty(morning)) { + if (ObjectUtil.isNotEmpty(morning.getTotalPrice())) { + morningPrice = BigDecimal.valueOf(morning.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + if (ObjectUtil.isNotEmpty(morning.getTimeCount())) { + morningTimeCount = morning.getTimeCount(); + } + } + if (ObjectUtil.isNotEmpty(noon)) { + if (ObjectUtil.isNotEmpty(noon.getTotalPrice())) { + noonPrice = BigDecimal.valueOf(noon.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + if (ObjectUtil.isNotEmpty(noon.getTimeCount())) { + noonTimeCount = noon.getTimeCount(); + } + } + if (ObjectUtil.isNotEmpty(evening)) { + if (ObjectUtil.isNotEmpty(evening.getTotalPrice())) { + eveningPrice = BigDecimal.valueOf(evening.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + if (ObjectUtil.isNotEmpty(evening.getTimeCount())) { + eveningTimeCount = evening.getTimeCount(); + } + } + + sumMorningPrice += morningPrice; + sumMorningTimeCount += morningTimeCount; + sumNoonPrice += noonPrice; + sumNoonTimeCount += noonTimeCount; + sumEveningPrice += eveningPrice; + sumEveningTimeCount += eveningTimeCount; + colPrice = morningPrice + noonPrice + eveningPrice; + colTimeCount = morningTimeCount + noonTimeCount + eveningTimeCount; + + excelMap.put("timeStr", timeStr); + excelMap.put("morningPrice", morningPrice); + excelMap.put("morningTimeCount", morningTimeCount); + excelMap.put("noonPrice", noonPrice); + excelMap.put("noonTimeCount", noonTimeCount); + excelMap.put("eveningPrice", eveningPrice); + excelMap.put("eveningTimeCount", eveningTimeCount); + excelMap.put("colPrice", colPrice); + excelMap.put("colTimeCount", colTimeCount); + excelList.add(excelMap); + } + map.put("sumMorningPrice", sumMorningPrice); + map.put("sumMorningTimeCount", sumMorningTimeCount); + map.put("sumNoonPrice", sumNoonPrice); + map.put("sumNoonTimeCount", sumNoonTimeCount); + map.put("sumEveningPrice", sumEveningPrice); + map.put("sumEveningTimeCount", sumEveningTimeCount); + map.put("colPrice", sumMorningPrice + sumNoonPrice + sumEveningPrice); + map.put("colTimeCount", sumMorningTimeCount + sumNoonTimeCount + sumEveningTimeCount); + + excelWriter.fill(map, writeSheet); + excelWriter.fill(excelList, fillConfig, writeSheet); + + Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook(); + if (ObjectUtil.isNotEmpty(workbook)) { + // 计算公式 + workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); + } + excelWriter.finish(); } catch (Exception e) { e.printStackTrace(); log.error("|食堂菜品购买统计导出(按天统计)|导出数据异常error:{}", e.getMessage()); @@ -511,4 +626,14 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } } } + + public List getDateRangeList(LocalDate startDate, LocalDate endDate) { + List dateList = new ArrayList<>(); + LocalDate currentDate = startDate; + while (!currentDate.isAfter(endDate)) { + dateList.add(currentDate); + currentDate = currentDate.plusDays(1); + } + return dateList; + } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx deleted file mode 100644 index 95ad4b2bde2deeb893a2d9c0daf0011e384173c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10035 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

eMf|xLms8b+c-?P4!lg@>}{yP%6w`bY{1Q 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 and DATE_FORMAT(a.create_time, '%Y') = #{dto.createTimeYearStr} - - and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} -