mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	Merge branch 'feature/mall_product' of https://gitee.com/CrazyWorld/ruoyi-vue-pro into feature/mall_product
# Conflicts: # yudao-module-mall/yudao-module-statistics-biz/src/main/java/cn/iocoder/yudao/module/statistics/service/member/MemberStatisticsServiceImpl.java
This commit is contained in:
		@ -132,25 +132,34 @@ public class AreaUtils {
 | 
			
		||||
        return convertList(areas.values(), func, area -> type.getType().equals(area.getType()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO @疯狂:注释写下;
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据区域编号、上级区域类型,获取上级区域编号
 | 
			
		||||
     *
 | 
			
		||||
     * @param id   区域编号
 | 
			
		||||
     * @param type 区域类型
 | 
			
		||||
     * @return 上级区域编号
 | 
			
		||||
     */
 | 
			
		||||
    public static Integer getParentIdByType(Integer id, @NonNull AreaTypeEnum type) {
 | 
			
		||||
        // TODO @疯狂:这种不要用 while true;因为万一脏数据,可能会死循环;可以转换成 for (int i = 0; i < Byte.MAX; i++) 一般是优先层级;
 | 
			
		||||
        do {
 | 
			
		||||
        for (int i = 0; i < Byte.MAX_VALUE; i++) {
 | 
			
		||||
            Area area = AreaUtils.getArea(id);
 | 
			
		||||
            if (area == null) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 匹配到
 | 
			
		||||
            if (type.getType().equals(area.getType())) {
 | 
			
		||||
                return area.getId();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 找到根节点,返回空
 | 
			
		||||
            if (area.getParent() == null || area.getParent().getId() == null) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 继续向上查找
 | 
			
		||||
            id = area.getParent().getId();
 | 
			
		||||
        } while (true);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,8 @@ import cn.hutool.core.util.ObjUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.ip.core.Area;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.controller.admin.member.vo.MemberAreaStatisticsRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.controller.admin.member.vo.MemberSummaryRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO;
 | 
			
		||||
import org.mapstruct.Mapper;
 | 
			
		||||
import org.mapstruct.factory.Mappers;
 | 
			
		||||
 | 
			
		||||
@ -36,4 +38,6 @@ public interface MemberStatisticsConvert {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    MemberSummaryRespVO convert(RechargeSummaryRespBO rechargeSummary, Integer expensePrice, Integer userCount);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,9 @@
 | 
			
		||||
package cn.iocoder.yudao.module.statistics.dal.mysql.pay;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.controller.admin.member.vo.MemberSummaryRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.bo.WalletSummaryRespBO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.dal.dataobject.trade.TradeStatisticsDO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.bo.WalletSummaryRespBO;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
 | 
			
		||||
@ -29,8 +29,7 @@ public interface PayWalletStatisticsMapper extends BaseMapperX<TradeStatisticsDO
 | 
			
		||||
                                                            @Param("endTime") LocalDateTime endTime,
 | 
			
		||||
                                                            @Param("bizType") Integer bizType);
 | 
			
		||||
 | 
			
		||||
    // TODO @疯狂:是不是搞个单独的 BO 呀;
 | 
			
		||||
    MemberSummaryRespVO selectRechargeSummaryGroupByWalletId(@Param("beginTime") LocalDateTime beginTime,
 | 
			
		||||
    RechargeSummaryRespBO selectRechargeSummaryGroupByWalletId(@Param("beginTime") LocalDateTime beginTime,
 | 
			
		||||
                                                               @Param("endTime") LocalDateTime endTime,
 | 
			
		||||
                                                               @Param("payStatus") Boolean payStatus);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.statistics.dal.dataobject.trade.TradeStatisticsDO
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.bo.TradeSummaryRespBO;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
import org.apache.ibatis.annotations.Select;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@ -19,10 +18,6 @@ import java.util.List;
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TradeStatisticsMapper extends BaseMapperX<TradeStatisticsDO> {
 | 
			
		||||
 | 
			
		||||
    // TODO @疯狂:这个要不要也挪到 xml 里,保持统一?
 | 
			
		||||
    @Select("SELECT IFNULL(SUM(order_create_count), 0) AS count, IFNULL(SUM(order_pay_price), 0) AS summary " +
 | 
			
		||||
            "FROM trade_statistics " +
 | 
			
		||||
            "WHERE time BETWEEN #{beginTime} AND #{endTime} AND deleted = FALSE")
 | 
			
		||||
    TradeSummaryRespBO selectOrderCreateCountSumAndOrderPayPriceSumByTimeBetween(@Param("beginTime") LocalDateTime beginTime,
 | 
			
		||||
                                                                                 @Param("endTime") LocalDateTime endTime);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.statistics.convert.member.MemberStatisticsConvert
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.dal.mysql.member.MemberStatisticsMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.infra.ApiAccessLogStatisticsService;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.pay.PayWalletStatisticsService;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.TradeOrderStatisticsService;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.TradeStatisticsService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
@ -44,18 +45,6 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService {
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ApiAccessLogStatisticsService apiAccessLogStatisticsService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public MemberSummaryRespVO getMemberSummary() {
 | 
			
		||||
        MemberSummaryRespVO vo = payWalletStatisticsService.getUserRechargeSummary(null, null);
 | 
			
		||||
        Integer expensePrice = tradeStatisticsService.getExpensePrice(null, null);
 | 
			
		||||
        Integer userCount = memberStatisticsMapper.selectUserCount(null, null);
 | 
			
		||||
        // 拼接数据
 | 
			
		||||
        if (vo == null) {
 | 
			
		||||
            vo = new MemberSummaryRespVO().setRechargeUserCount(0).setRechargePrice(0);
 | 
			
		||||
        }
 | 
			
		||||
        return vo.setUserCount(userCount).setExpensePrice(expensePrice);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<MemberAreaStatisticsRespVO> getMemberAreaStatisticsList() {
 | 
			
		||||
        // 统计用户
 | 
			
		||||
@ -101,9 +90,18 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService {
 | 
			
		||||
                .setComparison(new TradeStatisticsComparisonRespVO<>(vo, reference));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public MemberSummaryRespVO getMemberSummary() {
 | 
			
		||||
        RechargeSummaryRespBO rechargeSummary = payWalletStatisticsService.getUserRechargeSummary(null, null);
 | 
			
		||||
        Integer expensePrice = tradeStatisticsService.getExpensePrice(null, null);
 | 
			
		||||
        Integer userCount = memberStatisticsMapper.selectUserCount(null, null);
 | 
			
		||||
 | 
			
		||||
        return MemberStatisticsConvert.INSTANCE.convert(rechargeSummary, expensePrice, userCount);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MemberAnalyseComparisonRespVO getMemberAnalyseComparisonData(LocalDateTime beginTime, LocalDateTime endTime) {
 | 
			
		||||
        Integer rechargeUserCount = Optional.ofNullable(payWalletStatisticsService.getUserRechargeSummary(beginTime, endTime))
 | 
			
		||||
                .map(MemberSummaryRespVO::getRechargeUserCount).orElse(0);
 | 
			
		||||
                .map(RechargeSummaryRespBO::getRechargeUserCount).orElse(0);
 | 
			
		||||
        return new MemberAnalyseComparisonRespVO()
 | 
			
		||||
                .setUserCount(memberStatisticsMapper.selectUserCount(beginTime, endTime))
 | 
			
		||||
                .setActiveUserCount(apiAccessLogStatisticsService.getActiveUserCount(beginTime, endTime))
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
package cn.iocoder.yudao.module.statistics.service.pay;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.controller.admin.member.vo.MemberSummaryRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.bo.WalletSummaryRespBO;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
@ -28,6 +28,6 @@ public interface PayWalletStatisticsService {
 | 
			
		||||
     * @param endTime   截止时间
 | 
			
		||||
     * @return 钱包充值统计
 | 
			
		||||
     */
 | 
			
		||||
    MemberSummaryRespVO getUserRechargeSummary(LocalDateTime beginTime, LocalDateTime endTime);
 | 
			
		||||
    RechargeSummaryRespBO getUserRechargeSummary(LocalDateTime beginTime, LocalDateTime endTime);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.statistics.service.pay;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.pay.enums.member.PayWalletBizTypeEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.controller.admin.member.vo.MemberSummaryRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.dal.mysql.pay.PayWalletStatisticsMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO;
 | 
			
		||||
import cn.iocoder.yudao.module.statistics.service.trade.bo.WalletSummaryRespBO;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
@ -39,7 +39,7 @@ public class PayWalletStatisticsServiceImpl implements PayWalletStatisticsServic
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public MemberSummaryRespVO getUserRechargeSummary(LocalDateTime beginTime, LocalDateTime endTime) {
 | 
			
		||||
    public RechargeSummaryRespBO getUserRechargeSummary(LocalDateTime beginTime, LocalDateTime endTime) {
 | 
			
		||||
        return payWalletStatisticsMapper.selectRechargeSummaryGroupByWalletId(beginTime, endTime, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,16 @@
 | 
			
		||||
package cn.iocoder.yudao.module.statistics.service.pay.bo;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
@Schema(description = "管理后台 - 充值统计 Response VO")
 | 
			
		||||
@Data
 | 
			
		||||
public class RechargeSummaryRespBO {
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "充值会员数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "221")
 | 
			
		||||
    private Integer rechargeUserCount;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "充值金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
 | 
			
		||||
    private Integer rechargePrice;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -8,8 +8,6 @@
 | 
			
		||||
        FROM member_user
 | 
			
		||||
        WHERE deleted = FALSE
 | 
			
		||||
        GROUP BY area_id
 | 
			
		||||
        <!-- TODO @疯狂:order by 是不是交给内存哈 -->
 | 
			
		||||
        ORDER BY userCount DESC
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <select id="selectSummaryListBySex"
 | 
			
		||||
@ -18,8 +16,6 @@
 | 
			
		||||
        FROM member_user
 | 
			
		||||
        WHERE deleted = FALSE
 | 
			
		||||
        GROUP BY sex
 | 
			
		||||
        <!-- TODO @疯狂:order by 是不是交给内存哈 -->
 | 
			
		||||
        ORDER BY userCount DESC
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <select id="selectUserCount" resultType="java.lang.Integer">
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <select id="selectRechargeSummaryGroupByWalletId"
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.statistics.controller.admin.member.vo.MemberSummaryRespVO">
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO">
 | 
			
		||||
        SELECT COUNT(1)       AS rechargeUserCount,
 | 
			
		||||
               SUM(pay_price) AS rechargePrice
 | 
			
		||||
        FROM pay_wallet_recharge
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,15 @@
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="cn.iocoder.yudao.module.statistics.dal.mysql.trade.TradeStatisticsMapper">
 | 
			
		||||
 | 
			
		||||
    <select id="selectOrderCreateCountSumAndOrderPayPriceSumByTimeBetween"
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.statistics.service.trade.bo.TradeSummaryRespBO">
 | 
			
		||||
        SELECT IFNULL(SUM(order_create_count), 0) AS count,
 | 
			
		||||
               IFNULL(SUM(order_pay_price), 0) AS summary
 | 
			
		||||
        FROM trade_statistics
 | 
			
		||||
        WHERE time BETWEEN #{beginTime} AND #{endTime}
 | 
			
		||||
          AND deleted = FALSE
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <select id="selectByTimeBetween"
 | 
			
		||||
            resultType="cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeTrendSummaryRespVO">
 | 
			
		||||
        SELECT
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user