diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java index 81a51ef96..67a1db64c 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/SaleSummaryController.java @@ -42,8 +42,7 @@ public class SaleSummaryController { if (param.getShopId() == null) { param.setShopId(shopId); } - SaleSummaryCountVo data = prodStatisticService.summaryCount( - param.getShopId(), param.getProductName(), param.getRangeType(), param.getBeginDate(), param.getEndDate()); + SaleSummaryCountVo data = prodStatisticService.summaryCount(param); return CzgResult.success(data); } @@ -58,8 +57,7 @@ public class SaleSummaryController { if (param.getShopId() == null) { param.setShopId(shopId); } - List list = prodStatisticService.getArchiveTradeData( - param.getShopId(),param.getProductName(), param.getRangeType(), param.getBeginDate(), param.getEndDate()); + List list = prodStatisticService.getArchiveTradeData(param); return CzgResult.success(list); } @@ -70,8 +68,7 @@ public class SaleSummaryController { if (param.getShopId() == null) { param.setShopId(shopId); } - return prodStatisticService.getArchiveTradeData( - param.getShopId(),param.getProductName(), param.getRangeType(), param.getBeginDate(), param.getEndDate()); + return prodStatisticService.getArchiveTradeData(param); } } diff --git a/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java b/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java index f60f58268..2805973b6 100644 --- a/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java +++ b/cash-api/order-server/src/main/java/com/czg/task/StatisticTask.java @@ -76,7 +76,7 @@ public class StatisticTask { public void statisticAndInsertProd(Long shopId, LocalDate date) { try { - shopProdStatisticService.statisticAndInsert(shopId, date); + shopProdStatisticService.statisticAndInsert(shopId, date, 0L); } catch (Exception e) { log.error("统计商品数据失败,店铺id:{},日期:{}", shopId, date, e); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java index ef8e31b32..6a87d3770 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopProdStatistic.java @@ -40,6 +40,13 @@ public class ShopProdStatistic implements Serializable { */ @ExcelIgnore private Long prodId; + + /** + * 分类 ID + */ + @ExcelIgnore + private Long categoryId; + /** * 商品名称 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java b/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java index 59c4c35a5..664ae848f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/param/SaleSummaryCountParam.java @@ -3,6 +3,7 @@ package com.czg.order.param; import com.czg.validator.group.DefaultGroup; import jakarta.validation.constraints.NotBlank; import lombok.Data; +import lombok.experimental.Accessors; import java.io.Serial; import java.io.Serializable; @@ -14,6 +15,7 @@ import java.time.LocalDate; * @since 2025-03-07 16:23 */ @Data +@Accessors(chain = true) public class SaleSummaryCountParam implements Serializable { @Serial @@ -24,6 +26,11 @@ public class SaleSummaryCountParam implements Serializable { */ private String productName; + /** + * 分类 Id + */ + private Long categoryId; + /** * 开始时间 格式:yyyy-MM-dd */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java index fe4bd5498..9a717e60b 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopProdStatisticService.java @@ -1,6 +1,7 @@ package com.czg.order.service; import com.czg.order.entity.ShopProdStatistic; +import com.czg.order.param.SaleSummaryCountParam; import com.czg.order.vo.SaleSummaryCountVo; import com.mybatisflex.core.service.IService; @@ -20,13 +21,12 @@ public interface ShopProdStatisticService extends IService { * * @return 商品数据 */ - SaleSummaryCountVo summaryCount(Long shopId, String productName, String rangeType, LocalDate start, LocalDate end); + SaleSummaryCountVo summaryCount(SaleSummaryCountParam param); /** * 获取某一段时间的商品交易数据 - * - * @param shopId 店铺id - * @param rangeType 时间范围类型 + * shopId 店铺id + * rangeType 时间范围类型 * TODAY, // 今天 * YESTERDAY, // 昨天 * LAST_7_DAYS, // 最近7天 @@ -34,11 +34,11 @@ public interface ShopProdStatisticService extends IService { * THIS_WEEK, // 本周 * THIS_MONTH // 本月 * CUSTOM // 自定义时间范围 - * @param start 开始时间 格式yyyy-MM-dd 今天/昨天不用传 - * @param end 结束时间 格式yyyy-MM-dd 今天/昨天不用传 + * start 开始时间 格式yyyy-MM-dd 今天/昨天不用传 + * end 结束时间 格式yyyy-MM-dd 今天/昨天不用传 * @return 商品数据 */ - List getArchiveTradeData(Long shopId, String productName, String rangeType, LocalDate start, LocalDate end); + List getArchiveTradeData(SaleSummaryCountParam param); List getArchiveTradeDataBy10(Long shopId, Integer day); //------------------------------------------------------------下列为 后台使用------------------------------------------------------------ @@ -46,18 +46,18 @@ public interface ShopProdStatisticService extends IService { /** * 统计某天数据并插入数据库 */ - void statisticAndInsert(Long shopId, LocalDate day); + void statisticAndInsert(Long shopId, LocalDate day, Long categoryId); /** * 实时统计某天数据 */ - List getRealTimeDataByDay(Long shopId, LocalDate day, String productName); + List getRealTimeDataByDay(Long shopId, LocalDate day, String productName, Long categoryId); /** * 获取某一天的数据 历史数据 * 从ShopOrderStatistic 表中查询 */ - List getProdStatSingleDate(Long shopId, LocalDate day, String productName); + List getProdStatSingleDate(Long shopId, LocalDate day, String productName, Long categoryId); /** * 统计 某时间段数据 总和 不包括当日实时数据 @@ -65,5 +65,5 @@ public interface ShopProdStatisticService extends IService { * @param start 开始时间 * @param end 结束时间 */ - List getProdStatDateRange(Long shopId, LocalDate start, LocalDate end, String productName); + List getProdStatDateRange(Long shopId, LocalDate start, LocalDate end, String productName, Long categoryId); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/mapper/ShopProdStatisticMapper.java b/cash-service/order-service/src/main/java/com/czg/service/order/mapper/ShopProdStatisticMapper.java index 020b37745..a5f401b1c 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/mapper/ShopProdStatisticMapper.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/mapper/ShopProdStatisticMapper.java @@ -18,16 +18,16 @@ public interface ShopProdStatisticMapper extends BaseMapper { /** * 根据店铺id和日期 统计商品 */ - List selectProStatByDay(Long shopId, LocalDate day, String productName); + List selectProStatByDay(Long shopId, LocalDate day, String productName, Long categoryId); - List getProdStatSingleDate(Long shopId, LocalDate day, String productName); + List getProdStatSingleDate(Long shopId, LocalDate day, String productName, Long categoryId); - List getProdStatDateRange(Long shopId, LocalDate start, LocalDate end, String productName); + List getProdStatDateRange(Long shopId, LocalDate start, LocalDate end, String productName, Long categoryId); //-----------------总统计 总金额统计----------------- - SaleSummaryCountVo summaryCountByDay(Long shopId, LocalDate day, String productName); - SaleSummaryCountVo summaryCountSingleDate(Long shopId, LocalDate day, String productName); - SaleSummaryCountVo summaryCountDateRange(Long shopId, LocalDate start, LocalDate end, String productName); + SaleSummaryCountVo summaryCountByDay(Long shopId, LocalDate day, String productName, Long categoryId); + SaleSummaryCountVo summaryCountSingleDate(Long shopId, LocalDate day, String productName, Long categoryId); + SaleSummaryCountVo summaryCountDateRange(Long shopId, LocalDate start, LocalDate end, String productName, Long categoryId); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java index a91be932a..96442e03b 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopProdStatisticServiceImpl.java @@ -3,6 +3,7 @@ package com.czg.service.order.service.impl; import cn.hutool.core.collection.CollUtil; import com.czg.exception.CzgException; import com.czg.order.entity.ShopProdStatistic; +import com.czg.order.param.SaleSummaryCountParam; import com.czg.order.service.ShopProdStatisticService; import com.czg.order.vo.SaleSummaryCountVo; import com.czg.service.order.mapper.ShopProdStatisticMapper; @@ -34,7 +35,9 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl getArchiveTradeDataBy10(Long shopId, Integer day) { LocalDate currentDate = LocalDate.now(); LocalDate startDate = currentDate.minusDays(day - 1); - List archiveTradeData = getArchiveTradeData(shopId, null, "", startDate, currentDate); + List archiveTradeData = getArchiveTradeData(new SaleSummaryCountParam() + .setShopId(shopId).setProductName(null).setRangeType("").setBeginDate(startDate) + .setEndDate(currentDate).setCategoryId(0L)); // 按照 saleCount 降序排序 return archiveTradeData.stream() .sorted( @@ -50,51 +53,55 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl getArchiveTradeData(Long shopId, String productName, String rangeType, LocalDate start, LocalDate end) { + public List getArchiveTradeData(SaleSummaryCountParam param) { LocalDate currentDate = LocalDate.now(); - productName = CzgStrUtils.getStrOrNull(productName); + param.setProductName(CzgStrUtils.getStrOrNull(param.getProductName())); List resultList; - if ("today".equals(rangeType)) { - resultList = getRealTimeDataByDay(shopId, currentDate, productName); - } else if ("yesterday".equals(rangeType)) { - resultList = getProdStatSingleDate(shopId, currentDate.minusDays(1), productName); + if ("today".equals(param.getRangeType())) { + resultList = getRealTimeDataByDay(param.getShopId(), currentDate, param.getProductName(), param.getCategoryId()); + } else if ("yesterday".equals(param.getRangeType())) { + resultList = getProdStatSingleDate(param.getShopId(), currentDate.minusDays(1), + param.getProductName(), param.getCategoryId()); } else { - if (start.isAfter(currentDate)) { + if (param.getBeginDate().isAfter(currentDate)) { throw new CzgException("开始时间不能晚于当前时间"); } - if (start.equals(end)) { - resultList = getProdStatSingleDate(shopId, start, productName); + if (param.getBeginDate().equals(param.getEndDate())) { + resultList = getProdStatSingleDate(param.getShopId(), param.getBeginDate(), param.getProductName(), + param.getCategoryId()); } else { - if (end.isBefore(currentDate)) { - resultList = getProdStatDateRange(shopId, start, end, productName); + if (param.getEndDate().isBefore(currentDate)) { + resultList = getProdStatDateRange(param.getShopId(), param.getBeginDate(), param.getEndDate(), + param.getProductName(), param.getCategoryId()); } else { - List realTimeDataByDay = getRealTimeDataByDay(shopId, currentDate, productName); - List dateRange = getProdStatDateRange(shopId, start, end, productName); + List realTimeDataByDay = getRealTimeDataByDay(param.getShopId(), currentDate, + param.getProductName(), param.getCategoryId()); + List dateRange = getProdStatDateRange(param.getShopId(), param.getBeginDate(), + param.getEndDate(), param.getProductName(), param.getCategoryId()); resultList = mergeProdStatistic(realTimeDataByDay, dateRange); } @@ -105,20 +112,20 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl realTimeData = getRealTimeDataByDay(shopId, day, null); + public void statisticAndInsert(Long shopId, LocalDate day, Long categoryId) { + List realTimeData = getRealTimeDataByDay(shopId, day, null, categoryId); if (CollUtil.isNotEmpty(realTimeData)) { boolean exists = exists(QueryWrapper.create().eq(ShopProdStatistic::getShopId, shopId).eq(ShopProdStatistic::getCreateDay, day)); if (exists) { remove(QueryWrapper.create().eq(ShopProdStatistic::getShopId, shopId).eq(ShopProdStatistic::getCreateDay, day)); } - mapper.insertBatchSelective(realTimeData, 50); + mapper.insertBatchSelective(realTimeData, 50); } } @Override - public List getRealTimeDataByDay(Long shopId, LocalDate day, String productName) { - List shopProdStatistics = mapper.selectProStatByDay(shopId, day, productName); + public List getRealTimeDataByDay(Long shopId, LocalDate day, String productName, Long categoryId) { + List shopProdStatistics = mapper.selectProStatByDay(shopId, day, productName, categoryId); // 过滤掉没有有效数据的记录 shopProdStatistics = shopProdStatistics.stream() .filter(ShopProdStatistic::isValid) @@ -128,18 +135,22 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl getProdStatSingleDate(Long shopId, LocalDate day, String productName) { - return mapper.getProdStatSingleDate(shopId, day, productName); + public List getProdStatSingleDate(Long shopId, LocalDate day, String productName, Long categoryId) { + return mapper.getProdStatSingleDate(shopId, day, productName, categoryId); } @Override - public List getProdStatDateRange(Long shopId, LocalDate start, LocalDate end, String productName) { - return mapper.getProdStatDateRange(shopId, start, end, productName); + public List getProdStatDateRange(Long shopId, LocalDate start, LocalDate end, String productName, Long categoryId) { + return mapper.getProdStatDateRange(shopId, start, end, productName, categoryId); } private SaleSummaryCountVo mergeSummaryCountVo(SaleSummaryCountVo todaySummary, SaleSummaryCountVo dateRangeSummary) { - if (todaySummary == null) todaySummary = new SaleSummaryCountVo(); - if (dateRangeSummary == null) dateRangeSummary = new SaleSummaryCountVo(); + if (todaySummary == null) { + todaySummary = new SaleSummaryCountVo(); + } + if (dateRangeSummary == null) { + dateRangeSummary = new SaleSummaryCountVo(); + } return new SaleSummaryCountVo( safeAdd(todaySummary.getTotalAmount(), dateRangeSummary.getTotalAmount()), @@ -158,8 +169,12 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl mergeProdStatistic(List realTimeDataByDay, List dateRange) { - if (realTimeDataByDay == null) realTimeDataByDay = new ArrayList<>(); - if (dateRange == null) dateRange = new ArrayList<>(); + if (realTimeDataByDay == null) { + realTimeDataByDay = new ArrayList<>(); + } + if (dateRange == null) { + dateRange = new ArrayList<>(); + } return Stream.concat(realTimeDataByDay.stream(), dateRange.stream()) .filter(Objects::nonNull) diff --git a/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml b/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml index 96c20f3ac..b3b115a4d 100644 --- a/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml +++ b/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml @@ -8,6 +8,7 @@ SELECT #{shopId} as shopId, #{day} as createDay, + prod.category_id AS categoryId, CASE WHEN detail.is_temporary = 1 THEN -1 ELSE detail.product_id END AS prodId, CASE WHEN detail.is_temporary = 1 THEN '临时菜' ELSE prod.name END AS productName, sum(detail.num-detail.return_num) as saleCount, @@ -17,7 +18,7 @@ FROM tb_order_info `order` INNER JOIN tb_order_detail detail ON `order`.id = detail.order_id - LEFT JOIN tb_product prod ON detail.product_id = prod.id + INNER JOIN tb_product prod ON detail.product_id = prod.id WHERE `order`.shop_id = #{shopId} AND `order`.trade_day = #{day} @@ -25,6 +26,9 @@ AND detail.product_name LIKE CONCAT('%',#{productName},'%') + + AND prod.category_id = #{categoryId} + GROUP BY prodId @@ -41,6 +45,9 @@ AND prod.name LIKE CONCAT('%',#{productName},'%') + + AND prod.category_id = #{categoryId} + ORDER BY tb_shop_prod_statistic.sale_count DESC, tb_shop_prod_statistic.prod_id @@ -63,6 +70,9 @@ AND prod.name LIKE CONCAT('%',#{productName},'%') + + AND prod.category_id = #{categoryId} + GROUP BY tb_shop_prod_statistic.prod_id ORDER BY @@ -79,7 +89,7 @@ FROM tb_order_info `order` INNER JOIN tb_order_detail detail ON `order`.id = detail.order_id - LEFT JOIN tb_product prod ON detail.product_id = prod.id + INNER JOIN tb_product prod ON detail.product_id = prod.id WHERE `order`.shop_id = #{shopId} AND `order`.trade_day = #{day} @@ -87,6 +97,9 @@ AND detail.product_name LIKE CONCAT('%',#{productName},'%') + + AND prod.category_id = #{categoryId} +