diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java index e246c21de..ee90b9d10 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java @@ -11,6 +11,12 @@ public class HardCarDto extends HardCarEntity { private Long orderId; + /** + * 0 yyyy-MM-dd + * 1 yyyy-MM + */ + private String createTimeType = "0"; + private String createTimeStr; private LocalDate[] createTimeList; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java index 3543aa620..0e168fcf1 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java @@ -27,6 +27,9 @@ public class HardCanteenProductTotalVo { @Schema(description = "购买日期(年月日)") private LocalDateTime createTime; + @Schema(description = "购买日期自定义格式") + private String createTimeStr; + @Schema(description = "用餐时间段(早中晚)") private String hourType; 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 30a0826d9..a1fda9eff 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 @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -21,6 +22,7 @@ import com.bsd.pjcloud.hard.service.HardCanteenTotalService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; @@ -82,7 +84,7 @@ public class HardCanteenTotalController { return R.ok(canteenTotalService.productLikeTop(dto)); } - /* ************************************* start app start ************************************* */ + /* ************************************* end app end ************************************* */ @Operation(summary = "根据部门 食堂菜品购买统计", description = "根据部门 食堂菜品购买统计") @PostMapping("/proudct-total-by-dept") public R> productTotalByDept(@ParameterObject Page page, @RequestBody HardOrderDto dto) { @@ -90,17 +92,37 @@ public class HardCanteenTotalController { return R.ok(canteenTotalService.productTotalByDept(page, dto, dataScope)); } - @Operation(summary = "食堂菜品购买统计", description = "食堂菜品购买统计") + @Operation(summary = "食堂菜品购买统计(按天统计)", description = "食堂菜品购买统计(按天统计)") @PostMapping("/proudct-total") public R> productTotal(@ParameterObject Page page, @RequestBody HardOrderDto dto) { DataScope dataScope = null; return R.ok(canteenTotalService.productTotal(page, dto, dataScope)); } + @Operation(summary = "食堂菜品购买统计(按月统计)", description = "食堂菜品购买统计(按月统计)") + @PostMapping("/proudct-total-by-month") + public R> productTotalByMonth(@ParameterObject Page page, @RequestBody HardOrderDto dto) { + DataScope dataScope = null; + return R.ok(canteenTotalService.productTotalByMonth(page, dto, dataScope)); + } + @Operation(summary = "菜品出售统计", description = "菜品出售统计") @PostMapping("/proudct-query") public R> proudctQuery(@ParameterObject Page page, @RequestBody HardCarDto dto) { return R.ok(canteenTotalService.proudctQuery(page, dto)); } + @Operation(summary = "食堂菜品购买统计导出(按天统计)", description = "食堂菜品购买统计导出(按天统计)") + @PostMapping("/proudct-total-export-by-day") + @SysLog("食堂菜品购买统计导出(按天统计)") + public void productTotalExportByDay(HttpServletResponse response, @RequestBody HardOrderDto dto) { + canteenTotalService.productTotalExportByDay(response, dto); + } + + @Operation(summary = "食堂菜品购买统计导出(按月统计)", description = "食堂菜品购买统计导出(按月统计)") + @PostMapping("/proudct-total-export-by-month") + @SysLog("食堂菜品购买统计导出(按月统计)") + public void productTotalExportByMonth(HttpServletResponse response, @RequestBody HardOrderDto dto) { + canteenTotalService.productTotalExportByMonth(response, dto); + } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java index 477c6b4fe..ed6021c03 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java @@ -34,6 +34,8 @@ public interface HardCarMapper extends PjcloudBaseMapper { Page productTotal(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); + Page productTotalByMonth(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); + Page proudctQuery(Page page, @Param("dto") HardCarDto dto); List listByDept(@Param("dto") HardOrderDto dto, DataScope dataScope); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java index 52a674546..db494d2ce 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java @@ -13,6 +13,7 @@ import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; 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; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -40,10 +41,15 @@ public interface HardCanteenTotalService { List productTotalByDept(Page page, HardOrderDto dto, DataScope dataScope); /** - * 食堂菜品购买统计 + * 食堂菜品购买统计(按天统计) */ Page productTotal(Page page, HardOrderDto dto, DataScope dataScope); + /** + * 食堂菜品购买部门统计(按月统计) + */ + Page productTotalByMonth(Page page, HardOrderDto dto, DataScope dataScope); + /** * 菜品出售统计 */ @@ -53,4 +59,14 @@ public interface HardCanteenTotalService { * 食堂菜品购买部门统计 */ List listByDept(HardOrderDto dto, DataScope dataScope); + + /** + * 食堂菜品购买统计导出(按天统计) + */ + void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto); + + /** + * 食堂菜品购买统计导出(按月统计) + */ + void productTotalExportByMonth(HttpServletResponse response, HardOrderDto 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 887988981..63d562968 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 @@ -1,9 +1,15 @@ 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.LocalDateTimeUtil; +import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; @@ -13,6 +19,7 @@ import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.constant.order.HardHourTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; @@ -30,20 +37,19 @@ import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardCanteenTotalService; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -168,7 +174,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } /** - * 食堂菜品购买统计 + * 食堂菜品购买统计(按天统计) */ @Override public Page productTotal(Page page, HardOrderDto dto, DataScope dataScope) { @@ -183,6 +189,25 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { return pageList; } + /** + * 食堂菜品购买部门统计(按月统计) + */ + @Override + public Page productTotalByMonth(Page page, HardOrderDto dto, DataScope dataScope) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + Page pageList = hardCarMapper.productTotalByMonth(page, dto, dataScope); + if (ObjectUtil.isNotEmpty(pageList)) { + for (HardCanteenProductTotalVo v : pageList.getRecords()) { + if (ObjectUtil.isEmpty(v.getCreateTime()) && ObjectUtil.isNotEmpty(v.getCreateTimeStr())) { + v.setCreateTime(LocalDateTimeUtil.parse(v.getCreateTimeStr() + "-01", DatePattern.NORM_DATE_PATTERN)); + } + LocalDate localDate = v.getCreateTime().toLocalDate(); + v.setUniqueCode(localDate + "_" + v.getHourType()); + } + } + return pageList; + } + /** * 菜品出售统计 */ @@ -236,6 +261,75 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { return list; } + /** + * 食堂菜品购买统计导出(按天统计) + */ + @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()) { + + } catch (Exception e) { + e.printStackTrace(); + log.error("|食堂菜品购买统计导出(按天统计)|导出数据异常error:{}", e.getMessage()); + } + } + + /** + * 食堂菜品购买统计导出(按月统计) + */ + @Override + public void productTotalExportByMonth(HttpServletResponse response, HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/食堂菜品购买统计(按月).xlsx")).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); + + long currentPage = 1L; + long pageSize = 200L; + while (true) { + Page page = productTotalByMonth(new Page(currentPage, pageSize), dto, null); + if (ObjectUtil.isEmpty(page) || ObjectUtil.isEmpty(page.getRecords())) break; + // 填充数据 + List records = page.getRecords(); + // 月份 + List> mounthList = records.stream().map(v -> { + LocalDateTime createTime = v.getCreateTime(); + String createTimeStr = LocalDateTimeUtil.format(createTime, DatePattern.NORM_MONTH_PATTERN); + return Map.of("createTimeStr", createTimeStr); + }).toList(); + excelWriter.fill(mounthList, fillConfig, writeSheet); + // 早 + List morningList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.MORNING.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(morningList), fillConfig, writeSheet); + // 中 + List noonList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NOONING.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(noonList), fillConfig, writeSheet); + // 晚 + List nightList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NIGHT.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(nightList), fillConfig, writeSheet); + if (ObjectUtil.isEmpty(page.getPages()) || page.getCurrent() > page.getPages()) break; + currentPage++; + } + excelWriter.fill(new HashMap<>(), writeSheet); + } catch (Exception e) { + e.printStackTrace(); + log.error("|食堂菜品购买统计导出(按月统计)|导出数据异常error:{}", e.getMessage()); + } + } + + private List> productTotalExportByMonthToDefaulColExcelMap(List records) { + List> list = new LinkedList<>(); + if (ObjectUtil.isEmpty(records)) return list; + for (HardCanteenProductTotalVo i : records) { + LinkedHashMap map = new LinkedHashMap<>(); + map.put("totalPrice", BigDecimal.valueOf(i.getTotalPrice()).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP).toString()); + map.put("timeCount", String.valueOf(i.getTimeCount())); + list.add(map); + } + return list; + } + /** * 为HardCanteenProductTotalVo增加部门信息 */ 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..b7e321ff0 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 245a299b8..030735631 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 @@ -42,7 +42,21 @@ a.del_flag = '0' - and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + + + + and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + + and DATE_FORMAT(a.create_time, '%Y-%m') = #{dto.createTimeStr} + + + + + and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} @@ -129,7 +143,7 @@ from hard_car a inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' inner join hard_order o on o.parent_car_id = p.id and o.del_flag = '0' and o.hour_type is not null and - o.hour_type not in ('-1') + o.hour_type not in ('-1','null') @@ -186,7 +200,77 @@ group by DATE_FORMAT(a.create_time, '%Y-%m-%d'), o.hour_type - order by DATE_FORMAT(a.create_time, '%Y-%m-%d') desc, o.hour_type; + order by DATE_FORMAT(a.create_time, '%Y-%m-%d') desc, o.hour_type + + +