From 83f5f2a1377de44c1e82788240be8c4af73d1968 Mon Sep 17 00:00:00 2001 From: yangqingyuan Date: Wed, 21 Aug 2024 22:47:34 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=8C=E5=96=84=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/controller/DashboardController.java | 34 ++-- .../com/gxwebsoft/shop/entity/Dashboard.java | 68 +++++++- .../shop/mapper/DashboardMapper.java | 42 +++++ .../shop/mapper/xml/DashboardMapper.xml | 24 +++ .../shop/service/DashboardService.java | 48 ++++++ .../service/impl/DashboardServiceImpl.java | 161 ++++++++++++++++++ 6 files changed, 350 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/DashboardMapper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/xml/DashboardMapper.xml create mode 100644 src/main/java/com/gxwebsoft/shop/service/DashboardService.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/DashboardServiceImpl.java diff --git a/src/main/java/com/gxwebsoft/shop/controller/DashboardController.java b/src/main/java/com/gxwebsoft/shop/controller/DashboardController.java index 13e4877..e764e4e 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/DashboardController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/DashboardController.java @@ -1,30 +1,26 @@ package com.gxwebsoft.shop.controller; -import com.alipay.api.domain.DashboardParam; + import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.shop.entity.Coupon; -import com.gxwebsoft.shop.entity.Dashboard; -import com.gxwebsoft.shop.param.CouponParam; -import com.gxwebsoft.shop.service.CouponService; -import com.gxwebsoft.shop.service.OrderService; + +import com.gxwebsoft.shop.entity.*; +import com.gxwebsoft.shop.param.DashBoardParam; +import com.gxwebsoft.shop.service.DashboardService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.gxwebsoft.common.core.web.*; import javax.annotation.Resource; -import java.math.BigDecimal; /** * 仪表盘,数据统计 * - * @author 科技小王子 - * @since 2022-11-28 18:26:05 + * @author yqy + * @since 2024-08-21 18:26:05 */ @Api(tags = "数据统计") @RestController @@ -32,18 +28,18 @@ import java.math.BigDecimal; public class DashboardController extends BaseController { @Resource - private OrderService orderService; + private DashboardService dashboardService; - //@PreAuthorize("hasAuthority('shop:dashboard')") + //@PreAuthorize("hasAuthority('shop:dashboard:day')") @OperationLog - @ApiOperation("可查看一天日新增的订单量、一天日销售额以及总订单量、总销售额等数据\n") + @ApiOperation("可查看一天日新增的订单量、一天日销售额以及总订单量、总销售额数据\n") @GetMapping("/day") - public ApiResult day(DashboardParam param) { + public ApiResult day(DashBoardParam param) { Dashboard dashboard = new Dashboard(); - dashboard.setDayTotalSale(BigDecimal.valueOf(30)); - dashboard.setDayNewOrderNum(20); - dashboard.setTotalSale(BigDecimal.valueOf(5000)); - dashboard.setTotalOrderNum(2000);; + dashboard.setOrderStatistics(dashboardService.orderStatistics(param)); + dashboard.setSalesAmountStatistics(dashboardService.salesAmountStatistics(param)); + dashboard.setUserStatistics(dashboardService.userStatistics(param)); + dashboard.setEquipmentStatistics(dashboardService.equipmentStatistics(param)); return success(dashboard); } } diff --git a/src/main/java/com/gxwebsoft/shop/entity/Dashboard.java b/src/main/java/com/gxwebsoft/shop/entity/Dashboard.java index eca87e9..42f38e0 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Dashboard.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Dashboard.java @@ -6,21 +6,73 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; +import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) @ApiModel(value = "Dashboard对象", description = "仪表盘数据统计字段") public class Dashboard { - @ApiModelProperty(value = "新增的订单量") - private int dayNewOrderNum; + @ApiModelProperty(value = "销售统计") + private SalesAmountStatistics salesAmountStatistics;//日销售额,总销售额 - @ApiModelProperty(value = "当日销售额") - private BigDecimal dayTotalSale; + @ApiModelProperty(value = "订单统计") + private OrderStatistics orderStatistics;//当日新增的订单量,总订单量 - @ApiModelProperty(value = "总订单量") - private int totalOrderNum; + @ApiModelProperty(value = "用户统计") + private UserStatistics userStatistics;//当日新增的订单量,总订单量 + + @ApiModelProperty(value = "设备统计") + private EquipmentStatistics equipmentStatistics;//当日新增的设备,总设备 + + @Data + @ApiModel(value = "BaseStatistics", description = "基础统计") + public static class BaseStatistics{ + private Date startStatisticsDate; // 开始统计日期 + private Date endStatisticsDate; // 结束统计日期 + } + + @Data + + @ApiModel(value = "UserStatistics", description = "统计当日新增用户数、平台总用户数") + public static class UserStatistics extends BaseStatistics { + @ApiModelProperty(value = "新增用户") + private int dailyNewUsers; + + @ApiModelProperty(value = "平台总用户数") + private int totalUsers; + } + + @Data + @ApiModel(value = "OrderStatistics", description = "日新增订单数、平台总订单数") + public static class OrderStatistics extends BaseStatistics{ + @ApiModelProperty(value = "新增的订单量") + private int dailyNewOrders; + + @ApiModelProperty(value = "平台总订单数") + private int totalOrders; + } + + @Data + @ApiModel(value = "SalesAmount", description = "销售额统计") + public static class SalesAmountStatistics extends BaseStatistics{ + @ApiModelProperty(value = "每日销售额") + private BigDecimal dailySale; + + @ApiModelProperty(value = "总销售额") + private BigDecimal totalSale; + } + + @Data + @ApiModel(value = "EquipmentStatistics", description = "设备统计") + public static class EquipmentStatistics extends BaseStatistics{ + @ApiModelProperty(value = "每日新增设备") + private int dailyEquipment; + + @ApiModelProperty(value = "设备总数") + private int totalEquipment; + } - @ApiModelProperty(value = "总销售额") - private BigDecimal totalSale; } + + diff --git a/src/main/java/com/gxwebsoft/shop/mapper/DashboardMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/DashboardMapper.java new file mode 100644 index 0000000..842c846 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/DashboardMapper.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gxwebsoft.shop.entity.Dashboard; +import com.gxwebsoft.shop.param.DashBoardParam; +import org.apache.ibatis.annotations.Param; + +public interface DashboardMapper extends BaseMapper { + + /** + * 订单统计 + * + * @param param 查询参数 + * @return OrderStatistics + */ + Dashboard.OrderStatistics orderStatistics(@Param("param") DashBoardParam param); + + /** + * 销售额统计 + * + * @param param 查询参数 + * @return SalesAmountStatistics + */ + Dashboard.SalesAmountStatistics salesAmountStatistics(@Param("param") DashBoardParam param); + + + /** + * 用户统计 + * + * @param param 查询参数 + * @return UserStatistics + */ + Dashboard.UserStatistics userStatistics(@Param("param") DashBoardParam param); + + /** + * 设备统计 + * + * @param param 查询参数 + * @return UserStatistics + */ + Dashboard.EquipmentStatistics equipmentStatistics(@Param("param") DashBoardParam param); +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/DashboardMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/DashboardMapper.xml new file mode 100644 index 0000000..39c03ff --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/DashboardMapper.xml @@ -0,0 +1,24 @@ + + + + + + + SELECT a.* + FROM shop_cart a + + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/service/DashboardService.java b/src/main/java/com/gxwebsoft/shop/service/DashboardService.java new file mode 100644 index 0000000..4115082 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/DashboardService.java @@ -0,0 +1,48 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.shop.entity.Dashboard; +import com.gxwebsoft.shop.param.DashBoardParam; + +/** + * 购物车记录表Service + * + * @author 科技小王子 + * @since 2022-11-25 19:04:43 + */ +public interface DashboardService extends IService { + + /** + * 订单统计 + * + * @param param 查询参数 + * @return OrderStatistics + */ + Dashboard.OrderStatistics orderStatistics(DashBoardParam param); + + /** + * 销售额统计 + * + * @param param 查询参数 + * @return SalesAmountStatistics + */ + Dashboard.SalesAmountStatistics salesAmountStatistics(DashBoardParam param); + + + /** + * 用户统计 + * + * @param param 查询参数 + * @return UserStatistics + */ + Dashboard.UserStatistics userStatistics(DashBoardParam param); + + /** + * 设备统计 + * + * @param param 查询参数 + * @return UserStatistics + */ + Dashboard.EquipmentStatistics equipmentStatistics(DashBoardParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/DashboardServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/DashboardServiceImpl.java new file mode 100644 index 0000000..72a04b5 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/DashboardServiceImpl.java @@ -0,0 +1,161 @@ +package com.gxwebsoft.shop.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.apps.entity.Equipment; +import com.gxwebsoft.apps.service.EquipmentService; +import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.common.system.service.UserService; +import com.gxwebsoft.shop.entity.Dashboard; +import com.gxwebsoft.shop.entity.Order; +import com.gxwebsoft.shop.entity.OrderPay; +import com.gxwebsoft.shop.mapper.DashboardMapper; +import com.gxwebsoft.shop.param.DashBoardParam; +import com.gxwebsoft.shop.service.DashboardService; +import com.gxwebsoft.shop.service.OrderPayService; +import com.gxwebsoft.shop.service.OrderService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + +/** + * 仪表盘,数据统计 + * + * @author yqy + * @since 2024-08-21 + */ +@Service +public class DashboardServiceImpl extends ServiceImpl implements DashboardService { + + @Resource + private OrderService orderService; + + @Resource + private UserService userService; + + @Resource + private OrderPayService orderPayService; + + @Resource + private EquipmentService equipmentService; + + /** + * 订单统计 + * + * @param param 查询参数 + * @return OrderStatistics + */ + @Override + public Dashboard.OrderStatistics orderStatistics(DashBoardParam param) { + //某日订单数 + int dayNewOrderNum = orderService.count(Wrappers.lambdaQuery(Order.class) + .ge(Order::getCreateTime,param.getCreateTimeStart()) + .le(Order::getCreateTime,param.getCreateTimeEnd())); + + //订单总数 + int totalOrderNum = orderService.count(Wrappers.lambdaQuery(Order.class) + .eq(Order::getIsRenew,0)//非继费订单 + .eq(Order::getIsFreeze,1)//交押金 + .eq(Order::getDeleted,0));//注意:该过滤方式跟订单管理一致 TODO 这里不考虑巨量数据 + //订单统计 + Dashboard.OrderStatistics orderStatistics = new Dashboard.OrderStatistics(); + orderStatistics.setStartStatisticsDate(DateUtil.parse(param.getCreateTimeStart())); + orderStatistics.setEndStatisticsDate(DateUtil.parse(param.getCreateTimeEnd())); + orderStatistics.setTotalOrders(totalOrderNum); + orderStatistics.setDailyNewOrders(dayNewOrderNum); + return orderStatistics; + } + + /** + * 销售额统计 + * + * @param param 查询参数 + * @return SalesAmountStatistics + */ + @Override + public Dashboard.SalesAmountStatistics salesAmountStatistics(DashBoardParam param) { + //某日销售额 + BigDecimal dayTotalSale =BigDecimal.ZERO; + List orderPayList=orderPayService.list(Wrappers.lambdaQuery(OrderPay.class) + .eq(OrderPay::getPayStatus,20) + .ge(OrderPay::getCreateTime,param.getCreateTimeStart()) + .le(OrderPay::getCreateTime,param.getCreateTimeEnd())); + if (null!=orderPayList && !orderPayList.isEmpty()){ + dayTotalSale= orderPayList.stream().map(OrderPay::getOrderPrice).reduce(BigDecimal.ZERO,BigDecimal::add); + } + + //总销售额 + BigDecimal totalSale =BigDecimal.ZERO; + List totalOrderPayList=orderPayService.list(Wrappers.lambdaQuery(OrderPay.class) + .eq(OrderPay::getDeleted,0) + .eq(OrderPay::getPayStatus,20));//过滤付款的 TODO 这里不考虑巨量数据 + if (null!=totalOrderPayList && !orderPayList.isEmpty()){ + totalSale= totalOrderPayList.stream().map(OrderPay::getOrderPrice).reduce(BigDecimal.ZERO,BigDecimal::add); + } + + //销售额统计 + Dashboard.SalesAmountStatistics salesAmountStatistics = new Dashboard.SalesAmountStatistics(); + salesAmountStatistics.setStartStatisticsDate(DateUtil.parse(param.getCreateTimeStart())); + salesAmountStatistics.setEndStatisticsDate(DateUtil.parse(param.getCreateTimeEnd())); + salesAmountStatistics.setDailySale(dayTotalSale); + salesAmountStatistics.setTotalSale(totalSale); + return salesAmountStatistics; + } + + + /** + * 用户统计 + * + * @param param 查询参数 + * @return UserStatistics + */ + @Override + public Dashboard.UserStatistics userStatistics(DashBoardParam param) { + //某日新增用户数 + int dailyNewUsers = userService.count(Wrappers.lambdaQuery(User.class) + .ge(User::getCreateTime,param.getCreateTimeStart()) + .le(User::getCreateTime,param.getCreateTimeEnd())); + + //用户总数 + int totalUser = userService.count(Wrappers.lambdaQuery(User.class) + .eq(User::getDeleted,0));//TODO 这里不考虑巨量数据 + + //用户统计 + Dashboard.UserStatistics userStatistics = new Dashboard.UserStatistics(); + userStatistics.setStartStatisticsDate(DateUtil.parse(param.getCreateTimeStart())); + userStatistics.setEndStatisticsDate(DateUtil.parse(param.getCreateTimeEnd())); + userStatistics.setTotalUsers(totalUser); + userStatistics.setDailyNewUsers(dailyNewUsers); + return userStatistics; + } + + /** + * 设备统计 + * + * @param param 查询参数 + * @return EquipmentStatistics + */ + @Override + public Dashboard.EquipmentStatistics equipmentStatistics(DashBoardParam param) { + //某日新增设备 + int dailyEquipment = equipmentService.count(Wrappers.lambdaQuery(Equipment.class) + .ge(Equipment::getCreateTime,param.getCreateTimeStart()) + .le(Equipment::getCreateTime,param.getCreateTimeEnd())); + + //设备总数 + int totalEquipment = equipmentService.count(Wrappers.lambdaQuery(Equipment.class) + .eq(Equipment::getDeleted,0));//TODO 这里不考虑巨量数据 + + //设备统计 + Dashboard.EquipmentStatistics equipmentStatistics = new Dashboard.EquipmentStatistics(); + equipmentStatistics.setStartStatisticsDate(DateUtil.parse(param.getCreateTimeStart())); + equipmentStatistics.setEndStatisticsDate(DateUtil.parse(param.getCreateTimeEnd())); + equipmentStatistics.setDailyEquipment(dailyEquipment); + equipmentStatistics.setTotalEquipment(totalEquipment); + return equipmentStatistics; + } + +}