diff --git a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java index 36fd8c8..9e4cef6 100644 --- a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java @@ -2,6 +2,7 @@ package com.ycwl.basic.mapper; import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; +import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO; import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; @@ -93,4 +94,7 @@ public interface StatisticsMapper { List getBrokerIdListForUser(Long memberId, Date startTime, Date endTime); Long getUserRecentEnterType(Long memberId, Date endTime); + + List listStatByScenic(Long scenicId, Date startTime, Date endTime); + int insertStat(Long scenicId, Date date, AppStatisticsFunnelVO data); } diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java index 76306a1..8c4b8e8 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java @@ -3,6 +3,8 @@ package com.ycwl.basic.model.mobile.statistic.resp; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; +import java.math.RoundingMode; /** * @Author:longbinbin @@ -13,49 +15,106 @@ import lombok.Data; public class AppStatisticsFunnelVO { @ApiModelProperty("镜头检测游客数") -// private Integer cameraShotOfMemberNum; - private String cameraShotOfMemberNum; - @ApiModelProperty("镜头检测游客数_扫码访问人数_转化率") - private String csom_scaom; + private int cameraShotOfMemberNum; // cs1 @ApiModelProperty("扫码访问人数") - private Integer scanCodeVisitorOfMemberNum; - @ApiModelProperty("扫码访问人数_上传头像人数_转化率") - private String scaom_ufom; + private int scanCodeVisitorOfMemberNum; // sv1 @ApiModelProperty("上传头像(人脸)人数") - private Integer uploadFaceOfMemberNum; - @ApiModelProperty("上传头像人数_推送订阅人数_转化率") - private String ufom_pom; + private int uploadFaceOfMemberNum; // u1 @ApiModelProperty("推送订阅人数") - private Integer pushOfMemberNum; - @ApiModelProperty("推送订阅人数_生成视频人数_转化率") - private String pom_cvom; + private int pushOfMemberNum; // m1 @ApiModelProperty("生成视频人数") - private Integer completeVideoOfMemberNum; - @ApiModelProperty("生成视频人数_预览视频人数_转化率") - private String cvom_pvom; + private int completeVideoOfMemberNum; // gv1 @ApiModelProperty("预览视频人数") - private Integer previewVideoOfMemberNum; - @ApiModelProperty("预览视频人数_点击购买人数_转化率") - private String pvom_cpom; + private int previewVideoOfMemberNum; // pv1 @ApiModelProperty("点击购买人数") - private Integer clickOnPayOfMemberNum; - @ApiModelProperty("点击购买人数_支付订单人数_转化率") - private String cpom_pom; + private int clickOnPayOfMemberNum; // cp1 @ApiModelProperty("支付订单人数") - private Integer payOfMemberNum; + private int payOfMemberNum; // p1 @ApiModelProperty("总访问人数") - private Integer totalVisitorOfMemberNum; + private int totalVisitorOfMemberNum; // v1 @ApiModelProperty("生成视频条数") - private Integer completeOfVideoNum; + private int completeOfVideoNum; // gv2 @ApiModelProperty("预览视频条数") - private Integer previewOfVideoNum; + private int previewOfVideoNum; // pv2 @ApiModelProperty("支付订单数") - private Integer payOfOrderNum; + private int payOfOrderNum; // p2 @ApiModelProperty("支付订单金额") - private String payOfOrderAmount; + private BigDecimal payOfOrderAmount; // o3 @ApiModelProperty("退款订单数") - private Integer refundOfOrderNum; + private int refundOfOrderNum; // ro2 @ApiModelProperty("退款订单金额") - private String refundOfOrderAmount; + private BigDecimal refundOfOrderAmount; // ro3 + + @ApiModelProperty("镜头检测游客数_扫码访问人数_转化率") + public String getCsom_scaom() { + return "-"; // TODO: REAL + } + + @ApiModelProperty("扫码访问人数_上传头像人数_转化率") + public String getScaom_ufom() { + if (uploadFaceOfMemberNum == 0 || scanCodeVisitorOfMemberNum == 0) { + return "0.00"; + } + return new BigDecimal(uploadFaceOfMemberNum) + .multiply(new BigDecimal(100)) + .divide(new BigDecimal(scanCodeVisitorOfMemberNum), 2, RoundingMode.HALF_UP) + .toString(); + } + @ApiModelProperty("上传头像人数_推送订阅人数_转化率") + public String getUfom_pom() { + if (pushOfMemberNum == 0 || uploadFaceOfMemberNum == 0) { + return "0.00"; + } + return new BigDecimal(uploadFaceOfMemberNum) + .multiply(new BigDecimal(100)) + .divide(new BigDecimal(pushOfMemberNum), 2, RoundingMode.HALF_UP) + .toString(); + } + @ApiModelProperty("推送订阅人数_生成视频人数_转化率") + public String getPom_cvom() { + if (completeVideoOfMemberNum == 0 || pushOfMemberNum == 0) { + return "0.00"; + } + return new BigDecimal(completeVideoOfMemberNum) + .multiply(new BigDecimal(100)) + .divide(new BigDecimal(pushOfMemberNum), 2, RoundingMode.HALF_UP) + .toString(); + } + @ApiModelProperty("生成视频人数_预览视频人数_转化率") + public String getCvom_pvom() { + if (previewVideoOfMemberNum == 0 || completeVideoOfMemberNum == 0) { + return "0.00"; + } + return new BigDecimal(previewVideoOfMemberNum) + .multiply(new BigDecimal(100)) + .divide(new BigDecimal(completeVideoOfMemberNum), 2, RoundingMode.HALF_UP) + .toString(); + } + @ApiModelProperty("预览视频人数_点击购买人数_转化率") + public String getPvom_cpom() { + if (clickOnPayOfMemberNum == 0 || previewVideoOfMemberNum == 0) { + return "0.00"; + } + return new BigDecimal(clickOnPayOfMemberNum) + .multiply(new BigDecimal(100)) + .divide(new BigDecimal(previewVideoOfMemberNum), 2, RoundingMode.HALF_UP) + .toString(); + } + @ApiModelProperty("点击购买人数_支付订单人数_转化率") + public String getCpom_pom() { + if (payOfMemberNum == 0 || clickOnPayOfMemberNum == 0) { + return "0.00"; + } + return new BigDecimal(payOfMemberNum) + .multiply(new BigDecimal(100)) + .divide(new BigDecimal(clickOnPayOfMemberNum), 2, RoundingMode.HALF_UP) + .toString(); + } + public String getPayOfOrderAmount() { + return payOfOrderAmount.toString(); + } + public String getRefundOfOrderAmount() { + return refundOfOrderAmount.toString(); + } } diff --git a/src/main/java/com/ycwl/basic/service/mobile/impl/AppStatisticsServiceImpl.java b/src/main/java/com/ycwl/basic/service/mobile/impl/AppStatisticsServiceImpl.java index 1fc1e71..f35d431 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/impl/AppStatisticsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/mobile/impl/AppStatisticsServiceImpl.java @@ -141,41 +141,26 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { //扫码访问人数 // 扫小程序码或景区码进入访问的用户数,包括授权用户(使用OpenID进行精准统计)和未授权用户(使用 UUID统计访问)。但当用户授权时,获取OpenID并与UUID关联,删除本地UUID,避免重复记录。 Integer scanCodeVisitorOfMemberNum=statisticsMapper.countScanCodeOfMember(query); - //镜头检测游客数_扫码访问人数_转化率 -// vo.setCsom_scaom(calculateConversionRate(scanCodeVisitorOfMemberNum,cameraShotOfMemberNum)); - vo.setCsom_scaom("-"); //上传头像(人脸)人数 // 上传了人脸的用户数(包括本地临时ID和获取到OpenID的,同一设备微信获取到OpenID要覆盖掉之前生成的临时ID),上传多张人脸都只算一个人。 Integer uploadFaceOfMemberNum=statisticsMapper.countUploadFaceOfMember(query); - //扫码访问人数_上传头像人数_转化率 - vo.setScaom_ufom(calculateConversionRate(uploadFaceOfMemberNum,scanCodeVisitorOfMemberNum)); //推送订阅人数 // 只要点了允许通知,哪怕只勾选1条订阅都算 Integer pushOfMemberNum =statisticsMapper.countPushOfMember(query); - //上传头像人数_推送订阅人数_转化率 - vo.setUfom_pom((calculateConversionRate(pushOfMemberNum,uploadFaceOfMemberNum))); //生成视频人数 // 生成过Vlog视频的用户ID数,要注意屏蔽掉以前没有片段也能生成的情况 Integer completeVideoOfMemberNum =statisticsMapper.countCompleteVideoOfMember(query); - //推送订阅人数_生成视频人数_转化率 - vo.setPom_cvom((calculateConversionRate(completeVideoOfMemberNum,pushOfMemberNum))); //预览视频人数 // 购买前播放了5秒的视频条数。 Integer previewVideoOfMemberNum =statisticsMapper.countPreviewVideoOfMember(query); if (previewVideoOfMemberNum==null){ previewVideoOfMemberNum=0; } - //生成视频人数_预览视频人数_转化率 - vo.setCvom_pvom((calculateConversionRate(previewVideoOfMemberNum,completeVideoOfMemberNum))); //点击购买人数 // 点了立即购买按钮的用户ID就算,包括支付的和未支付的都算,只要点击了。 Integer clickOnPayOfMemberNum =statisticsMapper.countClickPayOfMember(query); - //预览视频人数_点击购买人数_转化率 - vo.setPvom_cpom((calculateConversionRate(clickOnPayOfMemberNum,previewVideoOfMemberNum))); //支付订单人数 Integer payOfMemberNum =statisticsMapper.countPayOfMember(query); - //点击购买人数_支付订单人数_转化率 - vo.setCpom_pom((calculateConversionRate(payOfMemberNum,clickOnPayOfMemberNum))); //总访问人数 // 通过任何途径访问到小程序的总人数,包括授权用户和未授权用户。 Integer totalVisitorOfMemberNum =statisticsMapper.countTotalVisitorOfMember(query); @@ -194,8 +179,6 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { //退款订单金额 BigDecimal refundOfOrderAmount =statisticsMapper.countRefundAmount(query); -// vo.setCameraShotOfMemberNum(cameraShotOfMemberNum); - vo.setCameraShotOfMemberNum("-"); vo.setScanCodeVisitorOfMemberNum(scanCodeVisitorOfMemberNum); vo.setUploadFaceOfMemberNum(uploadFaceOfMemberNum); vo.setPushOfMemberNum(pushOfMemberNum); @@ -211,9 +194,9 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { vo.setCompleteOfVideoNum(completeOfVideoNum); vo.setPreviewOfVideoNum(previewOfVideoNum); vo.setPayOfOrderNum(payOfOrderNum); - vo.setPayOfOrderAmount(df.format(payOfOrderAmount.setScale(2, RoundingMode.HALF_UP))); + vo.setPayOfOrderAmount(payOfOrderAmount.setScale(2, RoundingMode.HALF_UP)); vo.setRefundOfOrderNum(refundOfOrderNum); - vo.setRefundOfOrderAmount(df.format(refundOfOrderAmount.setScale(2, RoundingMode.HALF_UP))); + vo.setRefundOfOrderAmount(refundOfOrderAmount.setScale(2, RoundingMode.HALF_UP)); return ApiResponse.success(vo); } diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index 1ccba5d..1746a32 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -312,4 +312,15 @@ order by r.create_time desc limit 1 + + + REPLACE INTO scenic_stats (scenic_id, date, cs1, v1, sv1, u1, m1, gv1, gv2, pv1, pv2, cp1, o1, o2, o3, ro2, ro3) + VALUES (#{scenicId}, #{date}, #{data.cameraShotOfMemberNum}, #{data.totalVisitorOfMemberNum}, #{data.scanCodeVisitorOfMemberNum}, #{data.uploadFaceOfMemberNum}, #{data.pushOfMemberNum}, #{data.completeVideoOfMemberNum}, #{data.completeOfVideoNum}, #{data.previewVideoOfMemberNum}, #{data.previewOfVideoNum}, #{data.clickOnPayOfMemberNum}, #{data.payOfMemberNum}, #{data.payOfOrderNum}, #{data.payOfOrderAmount}, #{data.refundOfOrderNum}, #{data.refundOfOrderAmount}) + + \ No newline at end of file