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 95ad4b2bd..000000000 Binary files a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx and /dev/null differ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按天).xlsx b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按天).xlsx new file mode 100644 index 000000000..730038854 Binary files /dev/null and b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按天).xlsx differ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml index 2a94a7f16..8c8a544e8 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml @@ -61,9 +61,6 @@ and DATE_FORMAT(a.create_time, '%Y') = #{dto.createTimeYearStr} - - and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} -