Commit 171161e6c7fbcbf0a8ff9291cce62901966ed547

Authored by owen
1 parent b2c608e7

统计:交易统计

Showing 17 changed files with 534 additions and 41 deletions
sql/mysql/statistics.sql 0 → 100644
  1 +-- 交易统计表
  2 +CREATE TABLE trade_statistics
  3 +(
  4 + id bigint AUTO_INCREMENT COMMENT '编号,主键自增'
  5 + PRIMARY KEY,
  6 + time datetime NOT NULL COMMENT '统计日期',
  7 + order_create_count int DEFAULT 0 NOT NULL COMMENT '创建订单数',
  8 + order_pay_count int DEFAULT 0 NOT NULL COMMENT '支付订单商品数',
  9 + order_pay_price int DEFAULT 0 NOT NULL COMMENT '总支付金额,单位:分',
  10 + order_wallet_pay_price int DEFAULT 0 NOT NULL COMMENT '总支付金额(余额),单位:分',
  11 + after_sale_count int DEFAULT 0 NOT NULL COMMENT '退款订单数',
  12 + after_sale_refund_price int DEFAULT 0 NOT NULL COMMENT '总退款金额,单位:分',
  13 + brokerage_settlement_price int DEFAULT 0 NOT NULL COMMENT '佣金金额(已结算),单位:分',
  14 + recharge_pay_count int DEFAULT 0 NOT NULL COMMENT '充值订单数',
  15 + recharge_pay_price int DEFAULT 0 NOT NULL COMMENT '充值金额,单位:分',
  16 + recharge_refund_count int DEFAULT 0 NOT NULL COMMENT '充值退款订单数',
  17 + recharge_refund_price int DEFAULT 0 NOT NULL COMMENT '充值退款金额,单位:分',
  18 + creator varchar(64) DEFAULT '' NULL COMMENT '创建者',
  19 + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
  20 + updater varchar(64) DEFAULT '' NULL COMMENT '更新者',
  21 + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  22 + deleted bit DEFAULT b'0' NOT NULL COMMENT '是否删除',
  23 + tenant_id bigint DEFAULT 0 NOT NULL COMMENT '租户编号'
  24 +)
  25 + COMMENT '交易统计表';
  26 +
  27 +CREATE INDEX trade_statistics_time_index
  28 + ON trade_statistics (time);
  29 +
  30 +-- 菜单
  31 +INSERT INTO `ruoyi-vue-pro`.system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name)
  32 +VALUES ('统计管理', '', 1, 4, 0, '/statistics', 'ep:data-line', '', '');
  33 +SELECT @parentId := LAST_INSERT_ID();
  34 +INSERT INTO `ruoyi-vue-pro`.system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name)
  35 +VALUES ('交易统计', '', 2, 4, @parentId, 'trade', 'fa-solid:credit-card', 'statistics/trade/index', 'TradeStatistics');
  36 +SELECT @parentId := LAST_INSERT_ID();
  37 +-- 按钮
  38 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
  39 +VALUES ('交易统计查询', 'statistics:trade:query', 3, 1, @parentId, '', '', '', 0);
  40 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
  41 +VALUES ('交易统计导出', 'statistics:trade:export', 3, 2, @parentId, '', '', '', 0);
  42 +
  43 +
... ...
yudao-module-mall/yudao-module-statistics-biz/pom.xml
... ... @@ -49,6 +49,10 @@
49 49 <groupId>cn.iocoder.boot</groupId>
50 50 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
51 51 </dependency>
  52 + <dependency>
  53 + <groupId>cn.iocoder.boot</groupId>
  54 + <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
  55 + </dependency>
52 56  
53 57 <!-- Web 相关 -->
54 58 <dependency>
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/TradeStatisticsController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.controller.admin.trade;
  2 +
  3 +import cn.hutool.core.util.ArrayUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.*;
  7 +import cn.iocoder.yudao.module.statistics.convert.trade.TradeStatisticsConvert;
  8 +import cn.iocoder.yudao.module.statistics.service.trade.TradeStatisticsService;
  9 +import io.swagger.v3.oas.annotations.Operation;
  10 +import io.swagger.v3.oas.annotations.tags.Tag;
  11 +import lombok.extern.slf4j.Slf4j;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.GetMapping;
  15 +import org.springframework.web.bind.annotation.RequestMapping;
  16 +import org.springframework.web.bind.annotation.RestController;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.servlet.http.HttpServletResponse;
  20 +import java.io.IOException;
  21 +import java.util.List;
  22 +
  23 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  24 +
  25 +@Tag(name = "管理后台 - 交易统计")
  26 +@RestController
  27 +@RequestMapping("/statistics/trade")
  28 +@Validated
  29 +@Slf4j
  30 +public class TradeStatisticsController {
  31 +
  32 + @Resource
  33 + private TradeStatisticsService tradeStatisticsService;
  34 +
  35 + @GetMapping("/summary")
  36 + @Operation(summary = "获得交易统计")
  37 + @PreAuthorize("@ss.hasPermission('statistics:trade:query')")
  38 + public CommonResult<TradeStatisticsComparisonRespVO<TradeSummaryRespVO>> getTradeSummaryComparison() {
  39 + return success(tradeStatisticsService.getTradeSummaryComparison());
  40 + }
  41 +
  42 + @GetMapping("/trend/summary")
  43 + @Operation(summary = "获得交易状况统计")
  44 + @PreAuthorize("@ss.hasPermission('statistics:trade:query')")
  45 + public CommonResult<TradeStatisticsComparisonRespVO<TradeTrendSummaryRespVO>> getTradeTrendSummaryComparison(
  46 + TradeTrendReqVO reqVO) {
  47 + return success(tradeStatisticsService.getTradeTrendSummaryComparison(ArrayUtil.get(reqVO.getTimes(), 0),
  48 + ArrayUtil.get(reqVO.getTimes(), 1)));
  49 + }
  50 +
  51 + @GetMapping("/trend/list")
  52 + @Operation(summary = "获得交易状况明细")
  53 + @PreAuthorize("@ss.hasPermission('statistics:trade:query')")
  54 + public CommonResult<List<TradeTrendSummaryRespVO>> getTradeStatisticsList(
  55 + TradeTrendReqVO reqVO) {
  56 + return success(tradeStatisticsService.getTradeStatisticsList(ArrayUtil.get(reqVO.getTimes(), 0),
  57 + ArrayUtil.get(reqVO.getTimes(), 1)));
  58 + }
  59 +
  60 + @GetMapping("/trend/export-excel")
  61 + @Operation(summary = "导出获得交易状况明细 Excel")
  62 + @PreAuthorize("@ss.hasPermission('statistics:trade:export')")
  63 + public void exportTradeStatisticsExcel(TradeTrendReqVO reqVO, HttpServletResponse response) throws IOException {
  64 + List<TradeTrendSummaryRespVO> list = tradeStatisticsService.getTradeStatisticsList(ArrayUtil.get(reqVO.getTimes(), 0),
  65 + ArrayUtil.get(reqVO.getTimes(), 1));
  66 + // 导出 Excel
  67 + List<TradeTrendSummaryExcelVO> data = TradeStatisticsConvert.INSTANCE.convertList02(list);
  68 + ExcelUtils.write(response, "交易状况.xls", "数据", TradeTrendSummaryExcelVO.class, data);
  69 + }
  70 +
  71 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/vo/TradeStatisticsComparisonRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.controller.admin.trade.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +@Schema(description = "管理后台 - 交易统计对照 Response VO")
  9 +@Data
  10 +@NoArgsConstructor
  11 +@AllArgsConstructor
  12 +public class TradeStatisticsComparisonRespVO<T> {
  13 +
  14 + @Schema(description = "当前数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  15 + private T value;
  16 +
  17 + @Schema(description = "参照数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  18 + private T reference;
  19 +
  20 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/vo/TradeSummaryRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.controller.admin.trade.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +@Schema(description = "管理后台 - 交易统计 Response VO")
  7 +@Data
  8 +public class TradeSummaryRespVO {
  9 + @Schema(description = "昨日订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  10 + private Integer yesterdayOrderCount;
  11 + @Schema(description = "昨日支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  12 + private Integer yesterdayPayPrice;
  13 +
  14 + @Schema(description = "本月订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  15 + private Integer monthOrderCount;
  16 + @Schema(description = "本月支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  17 + private Integer monthPayPrice;
  18 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/vo/TradeTrendReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.controller.admin.trade.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +@Schema(description = "管理后台 - 交易状况 Request VO")
  12 +@Data
  13 +public class TradeTrendReqVO {
  14 +
  15 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  16 + @Schema(description = "时间范围")
  17 + private LocalDateTime[] times;
  18 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/vo/TradeTrendSummaryExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.controller.admin.trade.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
  4 +import com.alibaba.excel.annotation.ExcelProperty;
  5 +import com.alibaba.excel.annotation.format.DateTimeFormat;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDate;
  9 +
  10 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
  11 +
  12 +/**
  13 + * 交易状况统计 Excel VO
  14 + *
  15 + * @author owen
  16 + */
  17 +@Data
  18 +public class TradeTrendSummaryExcelVO {
  19 +
  20 + @ExcelProperty(value = "日期")
  21 + @DateTimeFormat(FORMAT_YEAR_MONTH_DAY)
  22 + private LocalDate date;
  23 +
  24 + @ExcelProperty(value = "营业额", converter = MoneyConvert.class)
  25 + private Integer turnover;
  26 +
  27 + @ExcelProperty(value = "商品支付金额", converter = MoneyConvert.class)
  28 + private Integer orderPayPrice;
  29 +
  30 + @ExcelProperty(value = "充值金额", converter = MoneyConvert.class)
  31 + private Integer rechargePrice;
  32 +
  33 + @ExcelProperty(value = "支出金额", converter = MoneyConvert.class)
  34 + private Integer expensePrice;
  35 +
  36 + @ExcelProperty(value = "余额支付金额", converter = MoneyConvert.class)
  37 + private Integer balancePrice;
  38 +
  39 + @ExcelProperty(value = "支付佣金金额", converter = MoneyConvert.class)
  40 + private Integer brokerageSettlementPrice;
  41 +
  42 + @ExcelProperty(value = "商品退款金额", converter = MoneyConvert.class)
  43 + private Integer orderRefundPrice;
  44 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/admin/trade/vo/TradeTrendSummaryRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.controller.admin.trade.vo;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonFormat;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +
  7 +import java.time.LocalDate;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
  10 +
  11 +@Schema(description = "管理后台 - 交易状况统计 Response VO")
  12 +@Data
  13 +public class TradeTrendSummaryRespVO {
  14 +
  15 + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  16 + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
  17 + private LocalDate date;
  18 +
  19 + @Schema(description = "营业额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  20 + private Integer turnover;
  21 +
  22 + @Schema(description = "商品支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  23 + private Integer orderPayPrice;
  24 +
  25 + @Schema(description = "充值金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  26 + private Integer rechargePrice;
  27 +
  28 + @Schema(description = "支出金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  29 + private Integer expensePrice;
  30 +
  31 + @Schema(description = "余额支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  32 + private Integer balancePrice;
  33 +
  34 + @Schema(description = "支付佣金金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  35 + private Integer brokerageSettlementPrice;
  36 +
  37 + @Schema(description = "商品退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  38 + private Integer orderRefundPrice;
  39 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/controller/trade/TradeStatisticsController.java deleted
1   -package cn.iocoder.yudao.module.statistics.controller.trade;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.module.statistics.dal.mysql.trade.TradeStatisticsDO;
5   -import io.swagger.v3.oas.annotations.tags.Tag;
6   -import lombok.extern.slf4j.Slf4j;
7   -import org.springframework.validation.annotation.Validated;
8   -import org.springframework.web.bind.annotation.RequestMapping;
9   -import org.springframework.web.bind.annotation.RestController;
10   -
11   -import java.time.LocalDateTime;
12   -import java.util.List;
13   -
14   -@Tag(name = "管理后台 - 交易统计")
15   -@RestController
16   -@RequestMapping("/statistics/product")
17   -@Validated
18   -@Slf4j
19   -public class TradeStatisticsController {
20   -
21   - // TODO @疯狂:有个 summary 接口,返回昨日、本月、支付金额、本月订单金额等数据;具体看 ui 哈;
22   -
23   - // TODO @疯狂:返回 ProductStatisticsComparisonResp, 里面有两个字段,一个是选择的时间范围的合计结果,一个是对比的时间范围的合计结果;
24   - // 例如说,选择时间范围是 2023-10-01 ~ 2023-10-02,那么对比就是 2023-09-30,再倒推 2 天;
25   - public CommonResult<Object> getTradeStatisticsComparison() {
26   - return null;
27   - }
28   -
29   - // TODO @疯狂:查询指定时间范围内的交易统计数据;DO 到时需要改成 VO 哈
30   - // 总收入(营业额)= 订单、充值的支付 - 订单、充值的退款
31   - public CommonResult<List<TradeStatisticsDO>> getTradeStatisticsList(
32   - LocalDateTime[] times) {
33   - return null;
34   - }
35   -
36   -}
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/convert/trade/TradeStatisticsConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.convert.trade;
  2 +
  3 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeStatisticsComparisonRespVO;
  4 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeSummaryRespVO;
  5 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryExcelVO;
  6 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO;
  7 +import cn.iocoder.yudao.module.statistics.service.trade.bo.TradeSummaryRespBO;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 交易统计 Convert
  15 + *
  16 + * @author owen
  17 + */
  18 +@Mapper
  19 +public interface TradeStatisticsConvert {
  20 +
  21 + TradeStatisticsConvert INSTANCE = Mappers.getMapper(TradeStatisticsConvert.class);
  22 +
  23 + default TradeStatisticsComparisonRespVO<TradeSummaryRespVO> convert(TradeSummaryRespBO yesterdayData,
  24 + TradeSummaryRespBO beforeYesterdayData,
  25 + TradeSummaryRespBO monthData,
  26 + TradeSummaryRespBO lastMonthData) {
  27 + return convert(convert(yesterdayData, monthData), convert(beforeYesterdayData, lastMonthData));
  28 + }
  29 +
  30 +
  31 + default TradeSummaryRespVO convert(TradeSummaryRespBO yesterdayData, TradeSummaryRespBO monthData) {
  32 + return new TradeSummaryRespVO()
  33 + .setYesterdayOrderCount(yesterdayData.getCount()).setYesterdayPayPrice(yesterdayData.getSummary())
  34 + .setMonthOrderCount(monthData.getCount()).setMonthPayPrice(monthData.getSummary());
  35 + }
  36 +
  37 + TradeStatisticsComparisonRespVO<TradeSummaryRespVO> convert(TradeSummaryRespVO value, TradeSummaryRespVO reference);
  38 +
  39 + TradeStatisticsComparisonRespVO<TradeTrendSummaryRespVO> convert(TradeTrendSummaryRespVO value, TradeTrendSummaryRespVO reference);
  40 +
  41 + List<TradeTrendSummaryExcelVO> convertList02(List<TradeTrendSummaryRespVO> list);
  42 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/trade/TradeStatisticsDO.java renamed to yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/dataobject/trade/TradeStatisticsDO.java
1   -package cn.iocoder.yudao.module.statistics.dal.mysql.trade;
  1 +package cn.iocoder.yudao.module.statistics.dal.dataobject.trade;
2 2  
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  3 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
4 4 import com.baomidou.mybatisplus.annotation.KeySequence;
5 5 import com.baomidou.mybatisplus.annotation.TableId;
6 6 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -10,7 +10,7 @@ import java.time.LocalDateTime;
10 10  
11 11 /**
12 12 * 交易统计 DO
13   - *
  13 + * <p>
14 14 * 以天为维度,统计全部的数据
15 15 *
16 16 * @author 芋道源码
... ... @@ -23,7 +23,7 @@ import java.time.LocalDateTime;
23 23 @Builder
24 24 @NoArgsConstructor
25 25 @AllArgsConstructor
26   -public class TradeStatisticsDO extends BaseDO {
  26 +public class TradeStatisticsDO extends TenantBaseDO {
27 27  
28 28 /**
29 29 * 编号,主键自增
... ... @@ -69,7 +69,7 @@ public class TradeStatisticsDO extends BaseDO {
69 69  
70 70 /**
71 71 * 充值订单数
72   - *
  72 + * <p>
73 73 * 从 PayWalletRechargeDO 计算
74 74 */
75 75 private Integer rechargePayCount;
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/trade/TradeStatisticsMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.dal.mysql.trade;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO;
  5 +import cn.iocoder.yudao.module.statistics.dal.dataobject.trade.TradeStatisticsDO;
  6 +import cn.iocoder.yudao.module.statistics.service.trade.bo.TradeSummaryRespBO;
  7 +import org.apache.ibatis.annotations.Mapper;
  8 +import org.apache.ibatis.annotations.Param;
  9 +import org.apache.ibatis.annotations.Select;
  10 +
  11 +import java.time.LocalDateTime;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 交易统计 Mapper
  16 + *
  17 + * @author owen
  18 + */
  19 +@Mapper
  20 +public interface TradeStatisticsMapper extends BaseMapperX<TradeStatisticsDO> {
  21 +
  22 + @Select("SELECT IFNULL(SUM(order_create_count), 0) AS count, IFNULL(SUM(order_pay_price), 0) AS summary " +
  23 + "FROM trade_statistics " +
  24 + "WHERE time BETWEEN #{beginTime} AND #{endTime} AND deleted = FALSE")
  25 + TradeSummaryRespBO selectOrderCreateCountSumAndOrderPayPriceSumByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
  26 + @Param("endTime") LocalDateTime endTime);
  27 +
  28 + TradeTrendSummaryRespVO selectByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
  29 + @Param("endTime") LocalDateTime endTime);
  30 +
  31 + List<TradeTrendSummaryRespVO> selectListByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
  32 + @Param("endTime") LocalDateTime endTime);
  33 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/trade/TradeStatisticsService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.service.trade;
  2 +
  3 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeStatisticsComparisonRespVO;
  4 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeSummaryRespVO;
  5 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO;
  6 +
  7 +import java.time.LocalDateTime;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 交易统计 Service 接口
  12 + *
  13 + * @author owen
  14 + */
  15 +public interface TradeStatisticsService {
  16 +
  17 + /**
  18 + * 获得交易统计
  19 + *
  20 + * @return 统计数据对照
  21 + */
  22 + TradeStatisticsComparisonRespVO<TradeSummaryRespVO> getTradeSummaryComparison();
  23 +
  24 + /**
  25 + * 获得交易状况统计
  26 + *
  27 + * @return 统计数据对照
  28 + */
  29 + TradeStatisticsComparisonRespVO<TradeTrendSummaryRespVO> getTradeTrendSummaryComparison(LocalDateTime beginTime, LocalDateTime endTime);
  30 +
  31 + /**
  32 + * 获得交易状况明细
  33 + *
  34 + * @return 统计数据列表
  35 + */
  36 + List<TradeTrendSummaryRespVO> getTradeStatisticsList(LocalDateTime beginTime, LocalDateTime endTime);
  37 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/trade/TradeStatisticsServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.service.trade;
  2 +
  3 +import cn.hutool.core.date.LocalDateTimeUtil;
  4 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeStatisticsComparisonRespVO;
  5 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeSummaryRespVO;
  6 +import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO;
  7 +import cn.iocoder.yudao.module.statistics.convert.trade.TradeStatisticsConvert;
  8 +import cn.iocoder.yudao.module.statistics.dal.mysql.trade.TradeStatisticsMapper;
  9 +import cn.iocoder.yudao.module.statistics.service.trade.bo.TradeSummaryRespBO;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.validation.annotation.Validated;
  12 +
  13 +import javax.annotation.Resource;
  14 +import java.time.Duration;
  15 +import java.time.LocalDateTime;
  16 +import java.time.LocalTime;
  17 +import java.time.temporal.TemporalAdjusters;
  18 +import java.util.List;
  19 +
  20 +/**
  21 + * 交易统计 Service 实现类
  22 + *
  23 + * @author owen
  24 + */
  25 +@Service
  26 +@Validated
  27 +public class TradeStatisticsServiceImpl implements TradeStatisticsService {
  28 +
  29 + @Resource
  30 + private TradeStatisticsMapper tradeStatisticsMapper;
  31 +
  32 + @Override
  33 + public TradeStatisticsComparisonRespVO<TradeSummaryRespVO> getTradeSummaryComparison() {
  34 + // 昨天的数据
  35 + TradeSummaryRespBO yesterdayData = getTradeSummaryByDays(-1);
  36 + // 前天的数据(用于对照昨天的数据)
  37 + TradeSummaryRespBO beforeYesterdayData = getTradeSummaryByDays(-2);
  38 +
  39 + // 本月数据;
  40 + TradeSummaryRespBO monthData = getTradeSummaryByMonths(0);
  41 + // 上月数据(用于对照本月的数据)
  42 + TradeSummaryRespBO lastMonthData = getTradeSummaryByMonths(-1);
  43 +
  44 + return TradeStatisticsConvert.INSTANCE.convert(yesterdayData, beforeYesterdayData, monthData, lastMonthData);
  45 + }
  46 +
  47 + @Override
  48 + public TradeStatisticsComparisonRespVO<TradeTrendSummaryRespVO> getTradeTrendSummaryComparison(LocalDateTime beginTime,
  49 + LocalDateTime endTime) {
  50 + // 统计数据
  51 + TradeTrendSummaryRespVO value = tradeStatisticsMapper.selectByTimeBetween(beginTime, endTime);
  52 + // 对照数据
  53 + LocalDateTime referenceBeginTime = beginTime.minus(Duration.between(beginTime, endTime));
  54 + TradeTrendSummaryRespVO reference = tradeStatisticsMapper.selectByTimeBetween(referenceBeginTime, beginTime);
  55 + return TradeStatisticsConvert.INSTANCE.convert(value, reference);
  56 + }
  57 +
  58 + @Override
  59 + public List<TradeTrendSummaryRespVO> getTradeStatisticsList(LocalDateTime beginTime, LocalDateTime endTime) {
  60 + return tradeStatisticsMapper.selectListByTimeBetween(beginTime, endTime);
  61 + }
  62 +
  63 + /**
  64 + * 统计指定日期的交易数据
  65 + *
  66 + * @param days 增加的天数
  67 + * @return 交易数据
  68 + */
  69 + private TradeSummaryRespBO getTradeSummaryByDays(int days) {
  70 + LocalDateTime date = LocalDateTime.now().plusDays(days);
  71 + return tradeStatisticsMapper.selectOrderCreateCountSumAndOrderPayPriceSumByTimeBetween(
  72 + LocalDateTimeUtil.beginOfDay(date), LocalDateTimeUtil.endOfDay(date));
  73 + }
  74 +
  75 + /**
  76 + * 统计指定月份的交易数据
  77 + *
  78 + * @param months 增加的月数
  79 + * @return 交易数据
  80 + */
  81 + private TradeSummaryRespBO getTradeSummaryByMonths(int months) {
  82 + // 月份开始时间
  83 + LocalDateTime beginOfMonth = LocalDateTime.now()
  84 + .plusMonths(months)
  85 + .with(TemporalAdjusters.firstDayOfMonth())
  86 + .with(LocalTime.MIN);
  87 + // 月份截止时间
  88 + LocalDateTime endOfToday = LocalDateTime.now()
  89 + .plusMonths(months)
  90 + .with(TemporalAdjusters.lastDayOfMonth())
  91 + .with(LocalTime.MAX);
  92 + return tradeStatisticsMapper.selectOrderCreateCountSumAndOrderPayPriceSumByTimeBetween(beginOfMonth, endOfToday);
  93 + }
  94 +
  95 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/trade/bo/TradeSummaryRespBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.statistics.service.trade.bo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * 交易统计 Resp BO
  7 + *
  8 + * @author owen
  9 + */
  10 +@Data
  11 +public class TradeSummaryRespBO {
  12 +
  13 + /**
  14 + * 数量
  15 + */
  16 + private Integer count;
  17 +
  18 + /**
  19 + * 合计
  20 + */
  21 + private Integer summary;
  22 +}
... ...
yudao-module-mall/yudao-module-statistics-biz/src/main/resources/mapper/trade/TradeStatisticsMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.statistics.dal.mysql.trade.TradeStatisticsMapper">
  4 + <select id="selectByTimeBetween"
  5 + resultType="cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO">
  6 + SELECT
  7 + -- 营业额 = 商品支付金额 + 充值金额
  8 + SUM(order_pay_price + recharge_pay_price) AS turnover,
  9 + SUM(order_pay_price) AS orderPayPrice,
  10 + SUM(recharge_pay_price) AS rechargePrice,
  11 + -- 支出金额 = 余额支付金额 + 支付佣金金额 + 商品退款金额
  12 + SUM(order_wallet_pay_price + brokerage_settlement_price + after_sale_refund_price) AS expensePrice,
  13 + SUM(order_wallet_pay_price) AS balancePrice,
  14 + SUM(brokerage_settlement_price) AS brokerageSettlementPrice,
  15 + SUM(after_sale_refund_price) AS orderRefundPrice
  16 + FROM trade_statistics
  17 + WHERE time BETWEEN #{beginTime} AND #{endTime}
  18 + AND deleted = FALSE
  19 + </select>
  20 +
  21 + <select id="selectListByTimeBetween"
  22 + resultType="cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO">
  23 + SELECT DATE_FORMAT(time, '%Y-%m-%d') AS date,
  24 + -- 营业额 = 商品支付金额 + 充值金额
  25 + SUM(order_pay_price + recharge_pay_price) AS turnover,
  26 + SUM(order_pay_price) AS orderPayPrice,
  27 + SUM(recharge_pay_price) AS rechargePrice,
  28 + -- 支出金额 = 余额支付金额 + 支付佣金金额 + 商品退款金额
  29 + SUM(order_wallet_pay_price + brokerage_settlement_price + after_sale_refund_price) AS expensePrice,
  30 + SUM(order_wallet_pay_price) AS balancePrice,
  31 + SUM(brokerage_settlement_price) AS brokerageSettlementPrice,
  32 + SUM(after_sale_refund_price) AS orderRefundPrice
  33 + FROM trade_statistics
  34 + WHERE time BETWEEN #{beginTime} AND #{endTime}
  35 + AND deleted = FALSE
  36 + GROUP BY date
  37 + </select>
  38 +</mapper>
... ...
yudao-server/pom.xml
... ... @@ -83,6 +83,11 @@
83 83 <artifactId>yudao-module-trade-biz</artifactId>
84 84 <version>${revision}</version>
85 85 </dependency>
  86 + <dependency>
  87 + <groupId>cn.iocoder.boot</groupId>
  88 + <artifactId>yudao-module-statistics-biz</artifactId>
  89 + <version>${revision}</version>
  90 + </dependency>
86 91  
87 92 <!-- spring boot 配置所需依赖 -->
88 93 <dependency>
... ...