|
@@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
|
|
|
import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
|
|
|
import cn.iocoder.yudao.module.statistics.controller.admin.member.vo.*;
|
|
|
import cn.iocoder.yudao.module.statistics.controller.admin.trade.vo.TradeStatisticsComparisonRespVO;
|
|
|
-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;
|
|
@@ -14,6 +13,7 @@ import cn.iocoder.yudao.module.statistics.service.trade.TradeOrderStatisticsServ
|
|
|
import cn.iocoder.yudao.module.statistics.service.trade.TradeStatisticsService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
+import cn.iocoder.yudao.module.statistics.convert.member.MemberStatisticsConvert;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.time.Duration;
|
|
@@ -45,9 +45,20 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService {
|
|
|
@Resource
|
|
|
private ApiAccessLogStatisticsService apiAccessLogStatisticsService;
|
|
|
|
|
|
+ @Override
|
|
|
+ public MemberSummaryRespVO getMemberSummary() {
|
|
|
+ RechargeSummaryRespBO rechargeSummary = payWalletStatisticsService.getUserRechargeSummary(null, null);
|
|
|
+ // TODO @疯狂:1)这里是实时统计,不好走走 TradeStatistics 表;2)因为这个放在商城下,所以只考虑订单数据,即按照 trade_order 的 pay_price 并且已支付来计算;
|
|
|
+ Integer expensePrice = tradeStatisticsService.getExpensePrice(null, null);
|
|
|
+ Integer userCount = memberStatisticsMapper.selectUserCount(null, null);
|
|
|
+ return MemberStatisticsConvert.INSTANCE.convert(rechargeSummary, expensePrice, userCount);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public List<MemberAreaStatisticsRespVO> getMemberAreaStatisticsList() {
|
|
|
// 统计用户
|
|
|
+ // TODO @疯狂:要处理下,未知省份;就是没填写省份的情况;
|
|
|
+ // TODO @疯狂:可能得把每个省的用户,都查询出来,然后去 order 那边 in;因为要按照这些人为基础来计算;;用户规模量大可能不太好,但是暂时就先这样搞吧 = =
|
|
|
Map<Integer, Integer> userCountMap = convertMap(memberStatisticsMapper.selectSummaryListByAreaId(),
|
|
|
vo -> AreaUtils.getParentIdByType(vo.getAreaId(), AreaTypeEnum.PROVINCE),
|
|
|
MemberAreaStatisticsRespVO::getUserCount, Integer::sum);
|
|
@@ -63,22 +74,22 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService {
|
|
|
return MemberStatisticsConvert.INSTANCE.convertList(AreaUtils.getByType(AreaTypeEnum.PROVINCE, area -> area), userCountMap, orderMap);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public List<MemberSexStatisticsRespVO> getMemberSexStatisticsList() {
|
|
|
- return memberStatisticsMapper.selectSummaryListBySex();
|
|
|
- }
|
|
|
-
|
|
|
+ // TODO @疯狂:这个方法,要不拆成:1)controller 调用 getMemberAnalyseComparisonData;2)tradeOrderStatisticsService.getPayUserCount;3)tradeOrderStatisticsService.getOrderPayPrice;4)。。。
|
|
|
+ // TODO 就是说:分析交给 controller 去组合;
|
|
|
@Override
|
|
|
public MemberAnalyseRespVO getMemberAnalyse(LocalDateTime beginTime, LocalDateTime endTime) {
|
|
|
// 对照数据
|
|
|
MemberAnalyseComparisonRespVO vo = getMemberAnalyseComparisonData(beginTime, endTime);
|
|
|
+ // TODO @疯狂:如果时间段这么处理,会不会 beginTime 重叠了。因为是 <= 一个时间;如果数据库插入的是 ,xxxx-yy-zz 00:00:00 的话,它既满足 >= ? 也满足 <= ;(如果不好理解,微信聊)
|
|
|
LocalDateTime referenceBeginTime = beginTime.minus(Duration.between(beginTime, endTime));
|
|
|
MemberAnalyseComparisonRespVO reference = getMemberAnalyseComparisonData(referenceBeginTime, beginTime);
|
|
|
|
|
|
- Integer payUserCount = tradeOrderStatisticsService.getPayUserCount(beginTime, endTime);
|
|
|
// 计算客单价
|
|
|
+ // TODO @疯狂:这个可能有点特殊,要按照 create_time 来查询;不然它的漏斗就不统一;因为是访问数量 > 今日下单人 > 今日支付人;是一个统一的维度;
|
|
|
+ Integer payUserCount = tradeOrderStatisticsService.getPayUserCount(beginTime, endTime);
|
|
|
int atv = 0;
|
|
|
if (payUserCount != null && payUserCount > 0) {
|
|
|
+ // TODO @疯狂:类似上面的 payUserCount
|
|
|
Integer payPrice = tradeOrderStatisticsService.getOrderPayPrice(beginTime, endTime);
|
|
|
atv = NumberUtil.div(payPrice, payUserCount).intValue();
|
|
|
}
|
|
@@ -90,15 +101,6 @@ 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(RechargeSummaryRespBO::getRechargeUserCount).orElse(0);
|
|
@@ -108,4 +110,10 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService {
|
|
|
.setRechargeUserCount(rechargeUserCount);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<MemberSexStatisticsRespVO> getMemberSexStatisticsList() {
|
|
|
+ // TODO @疯狂:需要考虑,用户性别为空,则是“未知”
|
|
|
+ return memberStatisticsMapper.selectSummaryListBySex();
|
|
|
+ }
|
|
|
+
|
|
|
}
|