From 954f2329bc5143fe0c4e606ab8d8894c3a89e9c5 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Wed, 16 Apr 2025 15:24:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE=E5=BD=92?= =?UTF-8?q?=E6=A1=A3=E6=9F=A5=E8=AF=A2=E3=80=81=E5=95=86=E5=93=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=88=86=E7=B1=BB=E7=BC=93=E5=AD=98=E3=80=81=E5=B7=B2?= =?UTF-8?q?=E7=9F=A5=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/NotifyController.java | 23 ++- .../admin/DataSummaryController.java | 2 +- .../main/java/com/czg/task/StatisticTask.java | 88 ++++++++++- .../controller/admin/ProductController.java | 24 +-- .../controller/user/UProductController.java | 10 +- .../java/com/czg/service/RedisService.java | 52 +++++++ .../czg/order/entity/ShopOrderStatistic.java | 2 - .../czg/order/entity/ShopProdStatistic.java | 11 +- .../order/entity/ShopTableOrderStatistic.java | 29 +++- .../czg/order/service/DataSummaryService.java | 4 +- .../service/ShopOrderStatisticService.java | 5 +- .../service/ShopProdStatisticService.java | 5 +- .../ShopTableOrderStatisticService.java | 5 +- .../czg/order/vo/DataSummaryDateAmountVo.java | 24 --- .../vo/DataSummaryProductSaleRankingVo.java | 15 ++ .../com/czg/order/vo/TableSummaryInfoVo.java | 5 + .../main/java/com/czg/order/vo/TotalVo.java | 38 +++++ .../czg/product/service/ProductService.java | 13 ++ .../src/main/java/com/czg/utils/PageUtil.java | 11 +- .../service/impl/DataSummaryServiceImpl.java | 25 +-- .../service/impl/SaleSummaryServiceImpl.java | 6 +- .../impl/ShopOrderStatisticServiceImpl.java | 54 +++++-- .../impl/ShopProdStatisticServiceImpl.java | 111 ++++++------- .../ShopTableOrderStatisticServiceImpl.java | 131 ++++++++-------- .../service/impl/TableSummaryServiceImpl.java | 2 +- .../mapper/ShopProdStatisticMapper.xml | 9 +- .../mapper/ShopTableOrderStatisticMapper.xml | 16 +- .../service/impl/ProductServiceImpl.java | 147 ++++++++++++++++-- .../impl/ShopProdCategoryServiceImpl.java | 17 +- 29 files changed, 611 insertions(+), 273 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java diff --git a/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java b/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java index ab2857f59..9b45af1a4 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java @@ -1,5 +1,7 @@ package com.czg.controller; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ThreadUtil; import com.alibaba.fastjson2.JSONObject; import com.czg.CzgPayUtils; import com.czg.entity.CzgBaseRespParams; @@ -9,10 +11,9 @@ import com.czg.task.StatisticTask; import com.czg.utils.AssertUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; /** * @author ww @@ -32,7 +33,7 @@ public class NotifyController { @RequestMapping("/payCallBack") - public String notifyCallBack(@RequestBody CzgBaseRespParams respParams){ + public String notifyCallBack(@RequestBody CzgBaseRespParams respParams) { JSONObject czg = CzgPayUtils.getCzg(respParams); AssertUtil.isNull(czg, "支付回调数据为空"); log.info("支付回调数据为:{}", czg); @@ -41,7 +42,7 @@ public class NotifyController { } @RequestMapping("/refundCallBack") - public String refundCallBack(@RequestBody CzgBaseRespParams respParams){ + public String refundCallBack(@RequestBody CzgBaseRespParams respParams) { JSONObject czg = CzgPayUtils.getCzg(respParams); AssertUtil.isNull(czg, "退款回调数据为空"); log.info("退款回调数据为:{}", czg); @@ -51,8 +52,18 @@ public class NotifyController { @Resource private PrintMqListener printMqListener; + @RequestMapping("/test") public void test(@RequestParam String id) { printMqListener.orderPrint(id); } + + @GetMapping("/anew/statistic/history/data") + public String statistic(@RequestParam String now) { + String format = DateUtil.format(new Date(), "yyyyMMddHHmm"); + if (format.equals(now)) { + ThreadUtil.execAsync(() -> statisticTask.statisticHistoryData()); + } + return SUCCESS; + } } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java index 69a606dd5..74bf84b34 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/DataSummaryController.java @@ -47,7 +47,7 @@ public class DataSummaryController { if (param.getShopId() == null) { param.setShopId(shopId); } - ShopOrderStatistic data = dataSummaryService.getTradeData(param); + ShopOrderStatistic data = dataSummaryService.getArchiveTradeData(param); return CzgResult.success(data); } 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 e387fe681..b79d79794 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 @@ -1,13 +1,27 @@ package com.czg.task; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.czg.order.entity.ShopOrderStatistic; +import com.czg.order.entity.ShopProdStatistic; +import com.czg.order.entity.ShopTableOrderStatistic; import com.czg.order.service.ShopOrderStatisticService; import com.czg.order.service.ShopProdStatisticService; import com.czg.order.service.ShopTableOrderStatisticService; +import com.czg.service.order.mapper.ShopOrderStatisticMapper; +import com.czg.service.order.mapper.ShopProdStatisticMapper; +import com.czg.service.order.mapper.ShopTableOrderStatisticMapper; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.row.DbChain; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.time.LocalDate; +import java.util.List; + /** * @author Administrator */ @@ -20,15 +34,81 @@ public class StatisticTask { private ShopProdStatisticService shopProdStatisticService; @Resource private ShopOrderStatisticService shopOrderStatisticService; + @Resource + private ShopOrderStatisticMapper shopOrderStatisticMapper; + @Resource + private ShopProdStatisticMapper shopProdStatisticMapper; + @Resource + private ShopTableOrderStatisticMapper shopTableOrderStatisticMapper; -// @Scheduled(cron = "1/6 * * * * ? ") + /** + * 基础统计 + * + * @param dateTime 日期时间 + */ + private void baseStatistic(DateTime dateTime) { + try { + shopOrderStatisticService.statistic(dateTime); + } catch (Exception e) { + log.error("统计订单数据失败", e); + } + try { + shopProdStatisticService.statistic(dateTime); + } catch (Exception e) { + log.error("统计商品数据失败", e); + } + try { + shopTableOrderStatisticService.statistic(dateTime); + } catch (Exception e) { + log.error("统计桌台数据失败", e); + } + } + + // @Scheduled(cron = "1/6 * * * * ? ") @Scheduled(cron = "0 0 8 * * ?") public void run() { long start = System.currentTimeMillis(); log.info("定时任务执行,开始统计数据"); - shopOrderStatisticService.statistic(); - shopProdStatisticService.statistic(); - shopTableOrderStatisticService.statistic(); + // 获取前一天 + DateTime yesterday = DateUtil.yesterday(); + baseStatistic(yesterday); log.info("定时任务执行完毕,耗时:{}ms", start - System.currentTimeMillis()); } + + @Scheduled(cron = "0 0,15,30,45 * * * ? ") + public void run2() { + long start = System.currentTimeMillis(); + log.info("定时任务2执行,开始统计数据"); + // 获取当天 + DateTime today = DateUtil.date(); + baseStatistic(today); + log.info("定时任务2执行完毕,耗时:{}ms", start - System.currentTimeMillis()); + } + + /** + * 统计历史数据 + */ + public void statisticHistoryData() { + // 指定开始日期 + LocalDate startDate = LocalDate.of(2024, 3, 1); + // 指定结束日期 + LocalDate endDate = LocalDate.now(); + List shopIdList = DbChain.table("tb_shop_info").select("id").objListAs(Long.class); + List> split = CollUtil.split(shopIdList, 10); + // 1.清除历史统计的数据 + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + shopOrderStatisticMapper.deleteByQuery(QueryWrapper.create().eq(ShopOrderStatistic::getShopId, shopId)); + shopProdStatisticMapper.deleteByQuery(QueryWrapper.create().eq(ShopProdStatistic::getShopId, shopId)); + shopTableOrderStatisticMapper.deleteByQuery(QueryWrapper.create().eq(ShopTableOrderStatistic::getShopId, shopId)); + }); + } + // 2.开始从2024-3-1开始统计数据 + startDate.datesUntil(endDate.plusDays(1)).forEach(date -> { + System.out.println(date.toString()); + DateTime dateTime = DateUtil.parseDate(date.toString()); + System.out.println(dateTime); + baseStatistic(dateTime); + }); + } } diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java index 3aaa40506..334db1222 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java @@ -2,8 +2,6 @@ package com.czg.controller.admin; import cn.hutool.core.convert.Convert; import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; import com.czg.account.service.ShopConfigService; import com.czg.annotation.SaStaffCheckPermission; import com.czg.config.RabbitPublisher; @@ -72,22 +70,9 @@ public class ProductController { public CzgResult> getProductList(ProductDTO param) { Long shopId = StpKit.USER.getShopId(0L); param.setShopId(shopId); - ProductDTO cacheParam = new ProductDTO(); - cacheParam.setShopId(shopId); - List data = getProductCacheList(cacheParam, param); - productService.refreshProductStock(param, data); - return CzgResult.success(data); - } - - private List getProductCacheList(ProductDTO cacheParam, ProductDTO param) { - List productList = productService.getProductList(cacheParam); - if (StrUtil.isNotEmpty(param.getName())) { - productList = productList.stream().filter(obj -> StrUtil.contains(obj.getName(), param.getName())).toList(); - } - if (ObjUtil.isNotNull(param.getCategoryId())) { - productList = productList.stream().filter(obj -> param.getCategoryId().equals(obj.getCategoryId())).toList(); - } - return productList; + List productList = productService.getProductCacheList(param); + productService.refreshProductStock(param, productList); + return CzgResult.success(productList); } /** @@ -160,6 +145,9 @@ public class ProductController { Long shopId = StpKit.USER.getShopId(0L); param.setShopId(shopId); productService.updateProductStock(param); + ThreadUtil.execAsync(() -> { + rabbitPublisher.sendProductInfoChangeMsg(Convert.toStr(shopId)); + }); return CzgResult.success(); } diff --git a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java index 18f1e7163..fca30ef4d 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/user/UProductController.java @@ -1,6 +1,5 @@ package com.czg.controller.user; -import com.czg.product.dto.ProdGroupDTO; import com.czg.product.param.ShopProductSkuParam; import com.czg.product.service.ProdGroupService; import com.czg.product.service.UProductService; @@ -21,7 +20,6 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** @@ -57,19 +55,13 @@ public class UProductController { @GetMapping("/miniApp/group/query") public CzgResult> queryGroupProductList() { Long shopId = StpKit.USER.getShopId(0L); - ProdGroupDTO param = new ProdGroupDTO(); - List prodGroupList = prodGroupService.getProdGroupList(param); - Map groupMap = prodGroupList.stream().collect(Collectors.toMap(ProdGroupDTO::getId, i -> i)); List list = uProductService.queryGroupProductList(shopId); Map productStock = uProductService.findShopProductStock(shopId); list.forEach(item -> { uProductService.refreshProductStock(productStock, item.getProductList()); - ProdGroupDTO config = groupMap.get(item.getId()); item.getProductList().forEach(prod -> { prod.setIsSaleTime(uProductService.calcIsSaleTime(prod.getDays(), prod.getStartTime(), prod.getEndTime())); - if (config != null) { - prod.setIsSaleTime(uProductService.calcIsSaleTime(config.getUseTime(), config.getSaleStartTime(), config.getSaleEndTime())); - } + prod.setIsSaleTime(uProductService.calcIsSaleTime(item.getUseTime(), item.getSaleStartTime(), item.getSaleEndTime())); }); }); return CzgResult.success(list); diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java b/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java index ad5c1a2d6..e84608854 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java @@ -1,5 +1,7 @@ package com.czg.service; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONWriter; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -598,4 +600,54 @@ public class RedisService { return redisTemplate.opsForList().rightPop(key); } + /** + * 右模糊查找key + * + * @param key 模糊匹配的key前缀 + * @return 匹配的keys + */ + public Set rightLikeKey(String key) { + return redisTemplate.keys(key + "*"); + } + + /** + * JsonString缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean setJsonStr(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, JSON.toJSONString(value, JSONWriter.Feature.WriteMapNullValue)); + return true; + } catch (Exception e) { + log.error("redis error:{}", e + ""); + return false; + } + } + + /** + * JsonString缓存获取 + * + * @param key 键 + * @return 值 + */ + public String getJsonStr(String key) { + return key == null ? null : (String) redisTemplate.opsForValue().get(key); + } + + /** + * JsonString缓存获取 + * + * @param key 键 + * @return 值 + */ + public List getJsonToBeanList(String key, Class type) { + String jsonStr = getJsonStr(key); + if (jsonStr == null) { + return null; + } + return JSON.parseArray(jsonStr, type); + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java index 1b6f44da3..33fb14ba6 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopOrderStatistic.java @@ -1,7 +1,6 @@ package com.czg.order.entity; import com.alibaba.fastjson2.annotation.JSONField; -import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; @@ -141,7 +140,6 @@ public class ShopOrderStatistic implements Serializable { /** * 新增会员数 */ - @Column(ignore = true) private Long newMemberCount = 0L; /** * 店铺id 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 6dc26364b..e87bacbad 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 @@ -3,16 +3,15 @@ package com.czg.order.entity; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.math.BigDecimal; -import java.sql.Date; - -import java.io.Serial; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + /** * 实体类。 * diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java index 6d5312e9a..7eeb9427f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/ShopTableOrderStatistic.java @@ -3,16 +3,15 @@ package com.czg.order.entity; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.math.BigDecimal; -import java.sql.Date; - -import java.io.Serial; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + /** * 台桌订单统计表 实体类。 * @@ -32,8 +31,22 @@ public class ShopTableOrderStatistic implements Serializable { @Id(keyType = KeyType.Auto) private Long id; + /** + * 台桌id + */ private Long tableId; - + /** + * 台桌id + */ + private String tableCode; + /** + * 台桌名称 + */ + private String tableName; + /** + * 区域名称 + */ + private String areaName; /** * 订单数量 */ @@ -56,7 +69,7 @@ public class ShopTableOrderStatistic implements Serializable { /** * 退款数量 */ - private long refundCount; + private Long refundCount; /** * 退款金额 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java index c1ba00493..387702ca1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/DataSummaryService.java @@ -18,7 +18,9 @@ import java.util.List; */ public interface DataSummaryService { - ShopOrderStatistic getTradeData(DataSummaryTradeParam param); + ShopOrderStatistic getArchiveTradeData(DataSummaryTradeParam param); + + ShopOrderStatistic getRealTimeTradeData(DataSummaryTradeParam param); Page getProductSaleRankingPage(DataSummaryProductSaleParam param); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java index 3cd54daa2..68dd4c8ab 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopOrderStatisticService.java @@ -1,7 +1,8 @@ package com.czg.order.service; -import com.mybatisflex.core.service.IService; +import cn.hutool.core.date.DateTime; import com.czg.order.entity.ShopOrderStatistic; +import com.mybatisflex.core.service.IService; /** * 服务层。 @@ -11,6 +12,6 @@ import com.czg.order.entity.ShopOrderStatistic; */ public interface ShopOrderStatisticService extends IService { - void statistic(); + void statistic(DateTime dateTime); } 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 b7c27ee57..6e1b37906 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,7 +1,8 @@ package com.czg.order.service; -import com.mybatisflex.core.service.IService; +import cn.hutool.core.date.DateTime; import com.czg.order.entity.ShopProdStatistic; +import com.mybatisflex.core.service.IService; /** * 服务层。 @@ -11,6 +12,6 @@ import com.czg.order.entity.ShopProdStatistic; */ public interface ShopProdStatisticService extends IService { - void statistic(); + void statistic(DateTime dateTime); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java index 350826982..15f3314bc 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/ShopTableOrderStatisticService.java @@ -1,8 +1,9 @@ package com.czg.order.service; +import cn.hutool.core.date.DateTime; +import com.czg.order.entity.ShopTableOrderStatistic; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; -import com.czg.order.entity.ShopTableOrderStatistic; import java.math.BigDecimal; @@ -25,5 +26,5 @@ public interface ShopTableOrderStatisticService extends IService total = new ArrayList<>(); - /** - * TotalVo - */ - @NoArgsConstructor - @Data - public static class TotalVo { - /** - * 实收金额 - */ - private BigDecimal actualAmount = BigDecimal.ZERO; - /** - * 优惠金额 - */ - private BigDecimal discountAmount = BigDecimal.ZERO; - /** - * 订单金额 - */ - private BigDecimal orderAmount = BigDecimal.ZERO; - /** - * 日期 - */ - private String tradeDay; - } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java index 5f3ce9942..8c9d0a1a7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/DataSummaryProductSaleRankingVo.java @@ -19,6 +19,11 @@ public class DataSummaryProductSaleRankingVo implements Serializable { @Serial private static final long serialVersionUID = 1L; + /** + * 商品名称 + */ + private Long productId; + /** * 商品名称 */ @@ -34,4 +39,14 @@ public class DataSummaryProductSaleRankingVo implements Serializable { */ private BigDecimal amount; + /** + * 退单量 + */ + private BigDecimal refundCount; + + /** + * 退单金额 + */ + private BigDecimal refundAmount; + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java index ccc960989..23418702f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TableSummaryInfoVo.java @@ -32,6 +32,11 @@ public class TableSummaryInfoVo implements Serializable { @ExcelIgnore @JSONField(serialize = false) private Long lineNum; + /** + * 台桌id + */ + @ExcelIgnore + private Long tableId; /** * 台桌码 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java new file mode 100644 index 000000000..8b9c4741c --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/TotalVo.java @@ -0,0 +1,38 @@ +package com.czg.order.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 销售趋势柱状图 左下 + * @author tankaikai + * @since 2025-03-07 16:08 + */ +@NoArgsConstructor +@Data +public class TotalVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 实收金额 + */ + private BigDecimal actualAmount = BigDecimal.ZERO; + /** + * 优惠金额 + */ + private BigDecimal discountAmount = BigDecimal.ZERO; + /** + * 订单金额 + */ + private BigDecimal orderAmount = BigDecimal.ZERO; + /** + * 日期 + */ + private String tradeDay; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java index 4b08b8386..48f8f053a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java @@ -34,6 +34,19 @@ public interface ProductService extends IService { */ List getProductList(ProductDTO param); + /** + * 从缓存里面获取商品列表 + * + * @param param 查询参数 + * @return 商品列表数据 + */ + List getProductCacheList(ProductDTO param); + + /** + * 清除某个商品分类的缓存 + */ + void clearProductCache(Long... categoryIds); + /** * 获取商品详情 * diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java b/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java index 9a9851d98..e175a116c 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/utils/PageUtil.java @@ -73,9 +73,14 @@ public class PageUtil { */ public QueryWrapper buildSortQueryWrapper() { QueryWrapper queryWrapper = QueryWrapper.create(); - String orderBy = ServletUtil.getRequest().getParameter(ORDER_BY); - if (StrUtil.isNotEmpty(orderBy)) { - queryWrapper.orderBy(SqlUtil.escapeOrderBySql(orderBy)); + try { + HttpServletRequest request = ServletUtil.getRequest(); + String orderBy = request.getParameter(ORDER_BY); + if (StrUtil.isNotEmpty(orderBy)) { + queryWrapper.orderBy(SqlUtil.escapeOrderBySql(orderBy)); + } + } catch (Exception e) { + //System.out.println("排序参数异常"); } return queryWrapper; } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java index 77e0b6587..dd97233a7 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/DataSummaryServiceImpl.java @@ -14,6 +14,7 @@ import com.czg.order.service.DataSummaryService; import com.czg.order.vo.DataSummaryDateAmountVo; import com.czg.order.vo.DataSummaryPayTypeVo; import com.czg.order.vo.DataSummaryProductSaleRankingVo; +import com.czg.order.vo.TotalVo; import com.czg.service.order.mapper.OrderInfoMapper; import com.czg.service.order.mapper.ShopOrderStatisticMapper; import com.czg.service.order.mapper.ShopProdStatisticMapper; @@ -50,7 +51,15 @@ public class DataSummaryServiceImpl implements DataSummaryService { private ShopProdStatisticMapper shopProdStatisticMapper; @Override - public ShopOrderStatistic getTradeData(DataSummaryTradeParam param) { + public ShopOrderStatistic getArchiveTradeData(DataSummaryTradeParam param) { + ShopOrderStatistic shopOrderStatistic = shopOrderStatisticMapper.getTradeData(param); + shopOrderStatistic.setCustomerUnitPrice(shopOrderStatistic.getCustomerUnitPrice().setScale(2, java.math.RoundingMode.HALF_UP)); + shopOrderStatistic.setTableTurnoverRate(shopOrderStatistic.getTableTurnoverRate().setScale(2, java.math.RoundingMode.HALF_UP)); + return shopOrderStatistic; + } + + @Override + public ShopOrderStatistic getRealTimeTradeData(DataSummaryTradeParam param) { List funs = Arrays.asList("getPayTypeAmountCount", "getVipRechargeAmountCount", "getNewMemberCount", "getCustomerUnitPrice", "getTableTurnoverRate"); Map collect = funs.parallelStream().collect(Collectors.toMap(fun -> fun, fun -> ReflectUtil.invoke(shopOrderStatisticMapper, fun, param) @@ -106,13 +115,6 @@ public class DataSummaryServiceImpl implements DataSummaryService { data.setDiscountAmount(discountAmount); data.setDiscountCount(discountCount); return data; - - /*ShopOrderStatistic shopOrderStatistic = shopOrderStatisticMapper.getTradeData(param); - long newMemberCount = shopOrderStatisticMapper.getNewMemberCount(param); - data.setNewMemberCount(newMemberCount); - shopOrderStatistic.setCustomerUnitPrice(shopOrderStatistic.getCustomerUnitPrice().setScale(2, java.math.RoundingMode.HALF_UP)); - shopOrderStatistic.setTableTurnoverRate(shopOrderStatistic.getTableTurnoverRate().setScale(2, java.math.RoundingMode.HALF_UP)); - return shopOrderStatistic;*/ } @Override @@ -129,7 +131,7 @@ public class DataSummaryServiceImpl implements DataSummaryService { param.setBeginDate(days.getFirst() + " 00:00:00"); param.setEndDate(days.getLast() + " 23:59:59"); PageHelper.startPage(PageUtil.buildPageHelp()); - PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findProdRandingSummaryPage2(param)); + PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findProdRandingSummaryPage(param)); return PageUtil.convert(pageInfo); } @@ -138,7 +140,7 @@ public class DataSummaryServiceImpl implements DataSummaryService { LocalDate now = LocalDate.now(); LocalDate beginDate = now.plusDays(-day); DataSummaryDateAmountVo data = new DataSummaryDateAmountVo(); - List total = new ArrayList<>(); + List total = new ArrayList<>(); for (int i = 1; i <= day; i++) { String thisDay = beginDate.plusDays(i).format(DatePattern.NORM_DATE_FORMATTER); OrderInfo orderInfo = orderInfoMapper.selectOneByQuery(QueryWrapper.create() @@ -147,7 +149,7 @@ public class DataSummaryServiceImpl implements DataSummaryService { .eq(OrderInfo::getTradeDay, thisDay) .isNotNull(OrderInfo::getPaidTime) ); - DataSummaryDateAmountVo.TotalVo totalVo = new DataSummaryDateAmountVo.TotalVo(); + TotalVo totalVo = new TotalVo(); if (orderInfo != null) { totalVo.setOrderAmount(orderInfo.getOrderAmount()); totalVo.setActualAmount(orderInfo.getPayAmount()); @@ -209,4 +211,5 @@ public class DataSummaryServiceImpl implements DataSummaryService { public List getShopIdList() { return shopOrderStatisticMapper.getShopIdList(); } + } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java index 2b2f6d6a5..e8c62aa6d 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/SaleSummaryServiceImpl.java @@ -27,7 +27,7 @@ public class SaleSummaryServiceImpl implements SaleSummaryService { @Override public SaleSummaryCountVo summaryCount(SaleSummaryCountParam param) { - SaleSummaryCountVo saleSummaryCount = shopProdStatisticMapper.getSaleSummaryCount2(param); + SaleSummaryCountVo saleSummaryCount = shopProdStatisticMapper.getSaleSummaryCount(param); if (saleSummaryCount == null) { saleSummaryCount = new SaleSummaryCountVo(); } @@ -37,12 +37,12 @@ public class SaleSummaryServiceImpl implements SaleSummaryService { @Override public Page summaryPage(SaleSummaryCountParam param) { PageHelper.startPage(PageUtil.buildPageHelp()); - PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findSaleSummaryList2(param)); + PageInfo pageInfo = new PageInfo<>(shopProdStatisticMapper.findSaleSummaryList(param)); return PageUtil.convert(pageInfo); } @Override public List summaryList(SaleSummaryCountParam param) { - return shopProdStatisticMapper.findSaleSummaryList2(param); + return shopProdStatisticMapper.findSaleSummaryList(param); } } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java index 7d59aed8a..93688ed45 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopOrderStatisticServiceImpl.java @@ -10,9 +10,9 @@ import com.czg.order.service.ShopOrderStatisticService; import com.czg.service.order.mapper.ShopOrderStatisticMapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -23,34 +23,54 @@ import java.util.List; * @since 2025-03-07 */ @Service +@Slf4j public class ShopOrderStatisticServiceImpl extends ServiceImpl implements ShopOrderStatisticService { @Resource private DataSummaryService dataSummaryService; @Override - public void statistic() { - // 获取前一天 - DateTime yesterday = DateUtil.yesterday(); + public void statistic(DateTime dateTime) { // 获取前一天的开始时间(00:00:00) - DateTime startOfDay = DateUtil.beginOfDay(yesterday); + DateTime startOfDay = DateUtil.beginOfDay(dateTime); // 获取前一天的结束时间(23:59:59) - DateTime endOfDay = DateUtil.endOfDay(yesterday); + DateTime endOfDay = DateUtil.endOfDay(dateTime); List shopIdList = dataSummaryService.getShopIdList(); if (CollUtil.isEmpty(shopIdList)) { return; } - shopIdList.parallelStream().forEach(shopId -> { - DataSummaryTradeParam param = new DataSummaryTradeParam(); - param.setShopId(shopId); - param.setBeginDate(startOfDay.toStringDefaultTimeZone()); - param.setEndDate(endOfDay.toStringDefaultTimeZone()); - ShopOrderStatistic statistic = dataSummaryService.getTradeData(param); - statistic.setShopId(shopId); - statistic.setCreateDay(LocalDate.now()); - statistic.setUpdateTime(LocalDateTime.now()); - saveOrUpdate(statistic); - }); + List> split = CollUtil.split(shopIdList, 5); + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + DataSummaryTradeParam param = new DataSummaryTradeParam(); + param.setShopId(shopId); + param.setBeginDate(startOfDay.toStringDefaultTimeZone()); + param.setEndDate(endOfDay.toStringDefaultTimeZone()); + ShopOrderStatistic statistic = dataSummaryService.getRealTimeTradeData(param); + statistic.setShopId(shopId); + statistic.setCreateDay(dateTime.toLocalDateTime().toLocalDate()); + statistic.setUpdateTime(LocalDateTime.now()); + if (statistic.getNewMemberCount() != 0L) { + System.out.println("newMemberCount:" + statistic.getNewMemberCount()); + } + // 如果没有订单和退款,则不更新数据,否则会产出很多数据 + if (statistic.getSaleCount() == 0 + && statistic.getRefundCount() == 0 + && statistic.getMemberPayCount() == 0 + && statistic.getNewMemberCount() == 0 + ) { + log.info("店铺:{},{},没有要存档的订单统计数据", shopId, dateTime.toDateStr()); + } else { + ShopOrderStatistic entity = getMapper().selectOneByQuery(query().eq(ShopOrderStatistic::getShopId, shopId).eq(ShopOrderStatistic::getCreateDay, dateTime.toDateStr())); + if (entity != null) { + statistic.setId(entity.getId()); + updateById(statistic); + } else { + save(statistic); + } + } + }); + } } } 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 5d3e9e02f..796d95387 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 @@ -1,35 +1,41 @@ package com.czg.service.order.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import com.czg.order.entity.OrderDetail; -import com.czg.order.service.OrderDetailService; +import cn.hutool.core.util.NumberUtil; +import com.czg.order.entity.ShopProdStatistic; +import com.czg.order.param.DataSummaryProductSaleParam; +import com.czg.order.service.DataSummaryService; +import com.czg.order.service.ShopProdStatisticService; +import com.czg.order.vo.DataSummaryProductSaleRankingVo; +import com.czg.service.order.mapper.ShopProdStatisticMapper; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.order.entity.ShopProdStatistic; -import com.czg.order.service.ShopProdStatisticService; -import com.czg.service.order.mapper.ShopProdStatisticMapper; import jakarta.annotation.Resource; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** - * 服务层实现。 + * 服务层实现。 * * @author zs * @since 2025-03-07 */ @Service -public class ShopProdStatisticServiceImpl extends ServiceImpl implements ShopProdStatisticService{ +@Slf4j +public class ShopProdStatisticServiceImpl extends ServiceImpl implements ShopProdStatisticService { @Resource - private OrderDetailService orderDetailService; + private DataSummaryService dataSummaryService; + @Resource + private ShopProdStatisticMapper shopProdStatisticMapper; + @Data - private static class StatisticTask{ + private static class StatisticTask { private BigDecimal successCount = BigDecimal.ZERO; private BigDecimal successAmount = BigDecimal.ZERO; private BigDecimal refundCount = BigDecimal.ZERO; @@ -37,57 +43,42 @@ public class ShopProdStatisticServiceImpl extends ServiceImpl orderDetails = orderDetailService.list(new QueryWrapper() - .ge(OrderDetail::getCreateTime, startOfDay) - .le(OrderDetail::getCreateTime, endOfDay) - .ne(OrderDetail::getStatus, "wait-pay")); - - - HashMap> countInfo = new HashMap<>(); - for (OrderDetail item : orderDetails) { - Map map = countInfo.computeIfAbsent(item.getShopId(), k -> new HashMap<>()); - StatisticTask statisticTask = map.get(item.getProductId()); - if (statisticTask == null) { - map.put(item.getProductId(), statisticTask = new StatisticTask()); - } - if ("refunding".equals(item.getStatus()) || "refund".equals(item.getStatus()) || "part-refund".equals(item.getStatus())) { - statisticTask.setRefundAmount(statisticTask.getRefundAmount().add(item.getReturnAmount())); - statisticTask.setRefundCount(statisticTask.getRefundCount().add(item.getRefundNum())); - if (item.getReturnNum().compareTo(item.getNum()) < 0) { - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount().subtract(item.getReturnAmount()))); - statisticTask.setSuccessCount(statisticTask.getSuccessCount().add(item.getNum().subtract(item.getReturnAmount()))); - } - }else { - statisticTask.setSuccessCount(statisticTask.getSuccessCount().add(item.getNum())); - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount())); - } + DateTime endOfDay = DateUtil.endOfDay(dateTime); + List shopIdList = dataSummaryService.getShopIdList(); + if (CollUtil.isEmpty(shopIdList)) { + return; + } + List> split = CollUtil.split(shopIdList, 5); + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + DataSummaryProductSaleParam param = new DataSummaryProductSaleParam(); + param.setShopId(shopId); + param.setBeginDate(startOfDay.toStringDefaultTimeZone()); + param.setEndDate(endOfDay.toStringDefaultTimeZone()); + // 删除之前统计数据 + getMapper().deleteByQuery(QueryWrapper.create().eq(ShopProdStatistic::getShopId, shopId).eq(ShopProdStatistic::getCreateDay, dateTime.toDateStr())); + // 重新统计数据 + List list = shopProdStatisticMapper.findProdRandingSummaryPage2(param); + for (DataSummaryProductSaleRankingVo dto : list) { + ShopProdStatistic entity = new ShopProdStatistic(); + entity.setProdId(dto.getProductId()); + entity.setSaleCount(dto.getNumber()); + entity.setSaleAmount(dto.getAmount()); + entity.setRefundCount(dto.getRefundCount()); + entity.setRefundAmount(dto.getRefundAmount()); + entity.setShopId(shopId); + entity.setCreateDay(dateTime.toJdkDate()); + if (NumberUtil.isLessOrEqual(entity.getSaleCount(), BigDecimal.ZERO) && NumberUtil.isLessOrEqual(entity.getRefundCount(), BigDecimal.ZERO)) { + log.info("店铺:{},{},没有要存档的商品统计数据", shopId, dateTime.toDateStr()); + } else { + save(entity); + } + } + }); } - - countInfo.forEach((shopId, map) -> map.forEach((productId, statisticTask) -> { - ShopProdStatistic statistic = getOne(new QueryWrapper().eq(ShopProdStatistic::getShopId, shopId).eq(ShopProdStatistic::getCreateDay, yesterday.toSqlDate())); - if (statistic == null) { - statistic = new ShopProdStatistic(); - statistic.setShopId(shopId); - statistic.setCreateDay(yesterday.toSqlDate()); - } - statistic.setProdId(productId); - statistic.setSaleCount(statisticTask.getSuccessCount()); - statistic.setSaleAmount(statisticTask.getSuccessAmount()); - statistic.setRefundCount(statisticTask.getRefundCount()); - statistic.setRefundAmount(statisticTask.getRefundAmount()); - saveOrUpdate(statistic); - })); - - } - - } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java index ccadfb5d1..f3ac76f5a 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/ShopTableOrderStatisticServiceImpl.java @@ -1,25 +1,26 @@ package com.czg.service.order.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import com.czg.config.RedisCst; -import com.czg.order.entity.OrderInfo; -import com.czg.order.service.OrderInfoService; +import com.czg.order.entity.ShopTableOrderStatistic; +import com.czg.order.param.TableSummaryParam; +import com.czg.order.service.DataSummaryService; +import com.czg.order.service.ShopTableOrderStatisticService; +import com.czg.order.vo.TableSummaryInfoVo; +import com.czg.service.order.mapper.ShopTableOrderStatisticMapper; import com.czg.utils.PageUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.order.entity.ShopTableOrderStatistic; -import com.czg.order.service.ShopTableOrderStatisticService; -import com.czg.service.order.mapper.ShopTableOrderStatisticMapper; import jakarta.annotation.Resource; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.HashMap; import java.util.List; /** @@ -29,35 +30,38 @@ import java.util.List; * @since 2025-03-07 */ @Service -public class ShopTableOrderStatisticServiceImpl extends ServiceImpl implements ShopTableOrderStatisticService{ +@Slf4j +public class ShopTableOrderStatisticServiceImpl extends ServiceImpl implements ShopTableOrderStatisticService { @Resource - private OrderInfoService orderInfoService; + private DataSummaryService dataSummaryService; + @Resource + private ShopTableOrderStatisticMapper shopTableOrderStatisticMapper; @Override public Page summary(Long shopId, String startTime, String endTime) { Page page = PageUtil.buildPage(); - PageHelper.startPage(Math.toIntExact(page.getPageNumber()),Math.toIntExact(page.getPageSize())); + PageHelper.startPage(Math.toIntExact(page.getPageNumber()), Math.toIntExact(page.getPageSize())); return PageUtil.convert(new PageInfo<>(mapper.selectSummary(shopId, startTime, endTime))); } @Override public boolean addInfo(long shopId, long tableId, long count, BigDecimal amount) { - ShopTableOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getTableId, tableId) - .eq(ShopTableOrderStatistic::getCreateDay, DateUtil.date().toDateStr())); - if (statistic == null) { - statistic = new ShopTableOrderStatistic(); - statistic.setShopId(shopId); - statistic.setTableId(tableId); - statistic.setCreateDay(DateUtil.date().toSqlDate()); - statistic.setOrderCount(count); - statistic.setOrderAmount(amount); - save(statistic); - } - return mapper.incrInfo(shopId, tableId, count, amount, DateUtil.date().toDateStr()); + ShopTableOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getTableId, tableId) + .eq(ShopTableOrderStatistic::getCreateDay, DateUtil.date().toDateStr())); + if (statistic == null) { + statistic = new ShopTableOrderStatistic(); + statistic.setShopId(shopId); + statistic.setTableId(tableId); + statistic.setCreateDay(DateUtil.date().toSqlDate()); + statistic.setOrderCount(count); + statistic.setOrderAmount(amount); + save(statistic); + } + return mapper.incrInfo(shopId, tableId, count, amount, DateUtil.date().toDateStr()); } @Data - private static class StatisticTask{ + private static class StatisticTask { private long successCount = 0; private BigDecimal successAmount = BigDecimal.ZERO; private long refundCount = 0; @@ -65,53 +69,46 @@ public class ShopTableOrderStatisticServiceImpl extends ServiceImpl orderInfos = orderInfoService.list(new QueryWrapper() - .ge(OrderInfo::getCreateTime, startOfDay) - .le(OrderInfo::getCreateTime, endOfDay) - .ne(OrderInfo::getStatus, "unpaid").ne(OrderInfo::getStatus, "cancelled")); - - HashMap countInfo = new HashMap<>(); - for (OrderInfo item : orderInfos) { - StatisticTask statisticTask = countInfo.get(item.getShopId()); - if (statisticTask == null) { - countInfo.put(item.getShopId(), statisticTask = new StatisticTask()); - } - if ("refunding".equals(item.getStatus()) || "refund".equals(item.getStatus()) || "part-refund".equals(item.getStatus())) { - statisticTask.setRefundAmount(statisticTask.getRefundAmount().add(item.getRefundAmount())); - statisticTask.setRefundCount(statisticTask.getRefundCount() + 1); - if (item.getRefundAmount().compareTo(item.getPayAmount()) < 0) { - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount().subtract(item.getRefundAmount()))); - } - }else { - statisticTask.setSuccessCount(statisticTask.getSuccessCount() + 1); - statisticTask.setSuccessAmount(statisticTask.getSuccessAmount().add(item.getPayAmount())); - } + DateTime endOfDay = DateUtil.endOfDay(dateTime); + List shopIdList = dataSummaryService.getShopIdList(); + if (CollUtil.isEmpty(shopIdList)) { + return; + } + List> split = CollUtil.split(shopIdList, 5); + for (List splitIdList : split) { + splitIdList.parallelStream().forEach(shopId -> { + TableSummaryParam param = new TableSummaryParam(); + param.setShopId(shopId); + param.setBeginDate(startOfDay.toStringDefaultTimeZone()); + param.setEndDate(endOfDay.toStringDefaultTimeZone()); + // 删除之前统计数据 + getMapper().deleteByQuery(QueryWrapper.create().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getCreateDay, dateTime.toDateStr())); + // 重新统计数据 + List list = shopTableOrderStatisticMapper.findSummaryList2(param); + for (TableSummaryInfoVo dto : list) { + ShopTableOrderStatistic entity = new ShopTableOrderStatistic(); + entity.setTableId(dto.getTableId()); + entity.setTableCode(dto.getTableCode()); + entity.setTableName(dto.getTableName()); + entity.setAreaName(dto.getAreaName()); + entity.setOrderCount(dto.getOrderCount()); + entity.setOrderAmount(dto.getOrderAmount()); + entity.setRefundCount(dto.getRefundCount()); + entity.setRefundAmount(dto.getRefundAmount()); + entity.setShopId(shopId); + entity.setCreateDay(dateTime.toJdkDate()); + if (entity.getOrderCount() == 0L && entity.getRefundCount() == 0L) { + log.info("店铺:{},{},没有要存档的台桌统计数据", shopId, dateTime.toDateStr()); + } else { + save(entity); + } + } + }); } - - countInfo.forEach((shopId, statisticTask) -> { - ShopTableOrderStatistic statistic = getOne(new QueryWrapper().eq(ShopTableOrderStatistic::getShopId, shopId).eq(ShopTableOrderStatistic::getCreateDay, yesterday.toSqlDate())); - if (statistic == null) { - statistic = new ShopTableOrderStatistic(); - statistic.setShopId(shopId); - statistic.setTableId(0L); - statistic.setCreateDay(yesterday.toSqlDate()); - } - statistic.setOrderCount(statisticTask.getSuccessCount()); - statistic.setOrderAmount(statisticTask.getSuccessAmount()); - statistic.setRefundCount(statisticTask.getRefundCount()); - statistic.setRefundAmount(statisticTask.getRefundAmount()); - saveOrUpdate(statistic); - }); - } } 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 9d0ed8551..cf43704b3 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 @@ -30,7 +30,7 @@ public class TableSummaryServiceImpl implements TableSummaryService { @Override public List summaryList(TableSummaryParam param) { - return shopTableOrderStatisticMapper.findSummaryList2(param); + return shopTableOrderStatisticMapper.findSummaryList(param); } @Override 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 d8bd485e2..d4ebdb653 100644 --- a/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml +++ b/cash-service/order-service/src/main/resources/mapper/ShopProdStatisticMapper.xml @@ -17,7 +17,8 @@ #{day} - group by t1.prod_id + group by t1.prod_id,t2.name + order by sum(t1.sale_count) desc