@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.statistics.service.member ;
import cn.hutool.core.date.LocalDateTimeUtil ;
import cn.hutool.core.util.NumberUtil ;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum ;
import cn.iocoder.yudao.framework.ip.core.Area ;
import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum ;
@ -79,37 +78,22 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService {
return MemberStatisticsConvert . INSTANCE . convertList ( areaList , userCountMap , orderMap ) ;
}
// TODO @疯狂:这个方法,要不拆成:1)controller 调用 getMemberAnalyseComparisonData;2)tradeOrderStatisticsService.getPayUserCount;3)tradeOrderStatisticsService.getOrderPayPrice;4)。。。
// TODO 就是说:分析交给 controller 去组合;
@Override
public MemberAnalyseRespVO getMemberAnalyse ( LocalDateTime beginTime , LocalDateTime endTime ) {
public DataComparisonRespVO < MemberAnalyseDataRespVO > getMemberAnalyseComparisonData ( LocalDateTime beginTime , LocalDateTime endTime ) {
// 当前数据
MemberAnalyseDataRespVO vo = getMemberAnalyseData ( beginTime , 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 ) ;
// 计算客单价
// 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 ( ) ;
}
return new MemberAnalyseRespVO ( )
. setVisitUserCount ( apiAccessLogStatisticsService . getIpCount ( UserTypeEnum . MEMBER . getValue ( ) , beginTime , endTime ) )
. setOrderUserCount ( tradeOrderStatisticsService . getOrderUserCount ( beginTime , endTime ) )
. setPayUserCount ( payUserCount )
. setAtv ( atv )
. setComparison ( new DataComparisonRespVO < > ( vo , reference ) ) ;
LocalDateTime referenceEndDate = beginTime . minusDays ( 1 ) ; // 减少1天,防止出现时间重叠
LocalDateTime referenceBeginDate = referenceEndDate . minus ( Duration . between ( beginTime , endTime ) ) ;
MemberAnalyseDataRespVO reference = getMemberAnalyseData (
LocalDateTimeUtil . beginOfDay ( referenceBeginDate ) , LocalDateTimeUtil . endOfDay ( referenceEndDate ) ) ;
return new DataComparisonRespVO < > ( vo , reference ) ;
}
private MemberAnalyseComparisonRespVO getMemberAnalyseComparison Data ( LocalDateTime beginTime , LocalDateTime endTime ) {
private MemberAnalyseDataRespVO getMemberAnalyseData ( LocalDateTime beginTime , LocalDateTime endTime ) {
Integer rechargeUserCount = Optional . ofNullable ( payWalletStatisticsService . getUserRechargeSummary ( beginTime , endTime ) )
. map ( RechargeSummaryRespBO : : getRechargeUserCount ) . orElse ( 0 ) ;
return new MemberAnalyseComparison RespVO ( )
return new MemberAnalyseDataRespVO ( )
. setRegisterUserCount ( memberStatisticsMapper . selectUserCount ( beginTime , endTime ) )
. setVisitUserCount ( apiAccessLogStatisticsService . getUserCount ( UserTypeEnum . MEMBER . getValue ( ) , beginTime , endTime ) )
. setRechargeUserCount ( rechargeUserCount ) ;