From 715c351f5ffd8c7ad9efef6f0566f3256f45dd43 Mon Sep 17 00:00:00 2001 From: longbinbin <2284496322@qq.com> Date: Thu, 12 Dec 2024 18:26:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E2=80=9C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BD=AC=E5=8C=96=E6=BC=8F=E6=96=97=E7=BB=9F=E8=AE=A1=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile/AppStatisticsController.java | 23 +- .../ycwl/basic/mapper/StatisticsMapper.java | 32 +- .../statistic/AppStatisticsFunnelVO.java | 60 ++++ .../impl/mobile/AppStatisticsServiceImpl.java | 115 +++++++- .../service/mobile/AppStatisticsService.java | 7 +- .../resources/mapper/pc/StatisticsMapper.xml | 275 ++++++++++++++---- 6 files changed, 426 insertions(+), 86 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java index 5453715..af5980e 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java @@ -1,9 +1,7 @@ package com.ycwl.basic.controller.mobile; -import com.ycwl.basic.model.mobile.statistic.AppSta1VO; -import com.ycwl.basic.model.mobile.statistic.AppSta2VO; -import com.ycwl.basic.model.mobile.statistic.AppSta3VO; -import com.ycwl.basic.model.mobile.statistic.CommonQueryReq; +import com.ycwl.basic.annotation.IgnoreToken; +import com.ycwl.basic.model.mobile.statistic.*; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.utils.ApiResponse; import io.swagger.annotations.Api; @@ -26,6 +24,7 @@ public class AppStatisticsController { @ApiOperation("支付订单金额、预览_支付转化率、扫码_付费用户转化率") @PostMapping("/one") + @IgnoreToken public ApiResponse oneStatistics(@RequestBody CommonQueryReq query) { return statisticsService.oneStatistics(query); @@ -33,6 +32,7 @@ public class AppStatisticsController { @ApiOperation("支付订单数、现场订单数、推送订单数统计") @PostMapping("/two") + @IgnoreToken public ApiResponse twoStatistics(@RequestBody CommonQueryReq query) { return statisticsService.twoStatistics(query); @@ -40,9 +40,24 @@ public class AppStatisticsController { @ApiOperation("扫码访问人数、推送订阅人数、预览视频人数统计") @PostMapping("/free") + @IgnoreToken public ApiResponse freeStatistics(@RequestBody CommonQueryReq query) { return statisticsService.freeStatistics(query); } + @ApiOperation("用户转化漏斗") + @PostMapping("/userConversionFunnel") + @IgnoreToken + public ApiResponse userConversionFunnel(@RequestBody CommonQueryReq query) { + + return statisticsService.userConversionFunnel(query); + } + + @ApiOperation("统计数据记录") + @PostMapping("/statistics") + public ApiResponse statistics() { + return null; + } + } diff --git a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java index 78b979c..52dbb9f 100644 --- a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java @@ -23,47 +23,65 @@ public interface StatisticsMapper { * @param query * @return */ - int countPreviewOfMember(CommonQueryReq query); + Integer countPreviewVideoOfMember(CommonQueryReq query); /** * 统计扫码访问人数 * @param query * @return */ - int countScanCodeOfMember(CommonQueryReq query); + Integer countScanCodeOfMember(CommonQueryReq query); /** * 统计点击购买人数 * @param query * @return */ - int countClickPayOfMember(CommonQueryReq query); + Integer countClickPayOfMember(CommonQueryReq query); /** * 统计付费人数 * @param query * @return */ - int countPayOfMember(CommonQueryReq query); + Integer countPayOfMember(CommonQueryReq query); /** * 统计现场支付订单数 * @param query * @return */ - int countSceneOrderNum(CommonQueryReq query); + Integer countSceneOrderNum(CommonQueryReq query); /** * 统计推送支付订单数 * @param query * @return */ - int countPushOrderNum(CommonQueryReq query); + Integer countPushOrderNum(CommonQueryReq query); /** * 统计推送订阅人数 * @param query * @return */ - int countPushOfMember(CommonQueryReq query); + Integer countPushOfMember(CommonQueryReq query); + + Integer countCameraShotOfMember(CommonQueryReq query); + + Integer countUploadFaceOfMember(CommonQueryReq query); + + Integer countCompleteVideoOfMember(CommonQueryReq query); + + Integer countTotalVisitorOfMember(CommonQueryReq query); + + Integer countCompleteOfVideo(CommonQueryReq query); + + Integer countPreviewOfVideo(CommonQueryReq query); + + Integer countPayOfOrder(CommonQueryReq query); + + Integer countRefundOfOrder(CommonQueryReq query); + + BigDecimal countRefundAmount(CommonQueryReq query); } diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java new file mode 100644 index 0000000..32a866f --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java @@ -0,0 +1,60 @@ +package com.ycwl.basic.model.mobile.statistic; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author:longbinbin + * @Date:2024/12/12 16:24 + */ +@Data +@ApiModel("移动端用户转化漏斗") +public class AppStatisticsFunnelVO { + + @ApiModelProperty("镜头检测游客数") + private Integer cameraShotOfMemberNum; + @ApiModelProperty("镜头检测游客数_扫码访问人数_转化率") + private String csom_scaom; + @ApiModelProperty("扫码访问人数") + private Integer scanCodeVisitorOfMemberNum; + @ApiModelProperty("扫码访问人数_上传头像人数_转化率") + private String scaom_ufom; + @ApiModelProperty("上传头像(人脸)人数") + private Integer uploadFaceOfMemberNum; + @ApiModelProperty("上传头像人数_推送订阅人数_转化率") + private String ufom_pom; + @ApiModelProperty("推送订阅人数") + private Integer pushOfMemberNum; + @ApiModelProperty("推送订阅人数_生成视频人数_转化率") + private String pom_cvom; + @ApiModelProperty("生成视频人数") + private Integer completeVideoOfMemberNum; + @ApiModelProperty("生成视频人数_预览视频人数_转化率") + private String cvom_pvom; + @ApiModelProperty("预览视频人数") + private Integer previewVideoOfMemberNum; + @ApiModelProperty("预览视频人数_点击购买人数_转化率") + private String pvom_cpom; + @ApiModelProperty("点击购买人数") + private Integer clickOnPayOfMemberNum; + @ApiModelProperty("点击购买人数_支付订单人数_转化率") + private String cpom_pom; + @ApiModelProperty("支付订单人数") + private Integer payOfMemberNum; + + @ApiModelProperty("总访问人数") + private Integer totalVisitorOfMemberNum; + @ApiModelProperty("生成视频条数") + private Integer completeOfVideoNum; + @ApiModelProperty("预览视频条数") + private Integer previewOfVideoNum; + @ApiModelProperty("支付订单数") + private Integer payOfOrderNum; + @ApiModelProperty("支付订单金额") + private String payOfOrderAmount; + @ApiModelProperty("退款订单数") + private Integer refundOfOrderNum; + @ApiModelProperty("退款订单金额") + private String refundOfOrderAmount; +} diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java index 73b0b19..1b1bdf3 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java @@ -1,10 +1,7 @@ package com.ycwl.basic.service.impl.mobile; import com.ycwl.basic.mapper.StatisticsMapper; -import com.ycwl.basic.model.mobile.statistic.AppSta1VO; -import com.ycwl.basic.model.mobile.statistic.AppSta2VO; -import com.ycwl.basic.model.mobile.statistic.AppSta3VO; -import com.ycwl.basic.model.mobile.statistic.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.*; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.DateUtils; @@ -114,6 +111,110 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { return ApiResponse.success(vo); } + @Override + public ApiResponse userConversionFunnel(CommonQueryReq query) { + AppStatisticsFunnelVO vo = new AppStatisticsFunnelVO(); + if(query.getEndTime()==null && query.getStartTime()==null){ + // 没有传时间,则代表用户没有自定义查询时间,使用standard来判断查询时间范围 + Integer standard = query.getStandard(); + if(standard==null){ + query.setStandard(0); + } + //获取当前周期的具体时间范围 + standardToNewSpecificTime(query); + } + + + + //镜头检测游客数 + Integer cameraShotOfMemberNum=statisticsMapper.countCameraShotOfMember(query); + //扫码访问人数 + Integer scanCodeVisitorOfMemberNum=statisticsMapper.countScanCodeOfMember(query); + //镜头检测游客数_扫码访问人数_转化率 + vo.setCsom_scaom(calculateConversionRate(scanCodeVisitorOfMemberNum,cameraShotOfMemberNum)); + //上传头像(人脸)人数 + Integer uploadFaceOfMemberNum=statisticsMapper.countUploadFaceOfMember(query); + //扫码访问人数_上传头像人数_转化率 + vo.setScaom_ufom(calculateConversionRate(uploadFaceOfMemberNum,scanCodeVisitorOfMemberNum)); + //推送订阅人数 + Integer pushOfMemberNum =statisticsMapper.countPushOfMember(query); + //上传头像人数_推送订阅人数_转化率 + vo.setUfom_pom((calculateConversionRate(pushOfMemberNum,uploadFaceOfMemberNum))); + //生成视频人数 + Integer completeVideoOfMemberNum =statisticsMapper.countCompleteVideoOfMember(query); + //推送订阅人数_生成视频人数_转化率 + vo.setPom_cvom((calculateConversionRate(completeVideoOfMemberNum,pushOfMemberNum))); + //预览视频人数 + Integer previewVideoOfMemberNum =statisticsMapper.countPreviewVideoOfMember(query); + //生成视频人数_预览视频人数_转化率 + vo.setCvom_pvom((calculateConversionRate(previewVideoOfMemberNum,completeVideoOfMemberNum))); + //点击购买人数 + Integer clickOnPayOfMemberNum =statisticsMapper.countClickPayOfMember(query); + //预览视频人数_点击购买人数_转化率 + vo.setPvom_cpom((calculateConversionRate(clickOnPayOfMemberNum,previewVideoOfMemberNum))); + //支付订单人数 + Integer payOfMemberNum =statisticsMapper.countPayOfMember(query); + //点击购买人数_支付订单人数_转化率 + vo.setCpom_pom((calculateConversionRate(payOfMemberNum,clickOnPayOfMemberNum))); + //总访问人数 + //TODO 2024/12/12 17:56 目前只有扫码访问的方式,所以这里总访问人数先等于扫码访问人数 +// Integer totalVisitorOfMemberNum =statisticsMapper.countTotalVisitorOfMember(query); + Integer totalVisitorOfMemberNum =scanCodeVisitorOfMemberNum; + //生成视频条数 + Integer completeOfVideoNum =statisticsMapper.countCompleteOfVideo(query); + //预览视频条数 + Integer previewOfVideoNum =statisticsMapper.countPreviewOfVideo(query); + //支付订单数 + Integer payOfOrderNum =statisticsMapper.countPayOfOrder(query); + //支付订单金额 + BigDecimal payOfOrderAmount =statisticsMapper.countOrderAmount(query); + //退款订单数 + Integer refundOfOrderNum =statisticsMapper.countRefundOfOrder(query); + //退款订单金额 + BigDecimal refundOfOrderAmount =statisticsMapper.countRefundAmount(query); + + vo.setCameraShotOfMemberNum(cameraShotOfMemberNum); + vo.setScanCodeVisitorOfMemberNum(scanCodeVisitorOfMemberNum); + vo.setUploadFaceOfMemberNum(uploadFaceOfMemberNum); + vo.setPushOfMemberNum(pushOfMemberNum); + vo.setCompleteVideoOfMemberNum(completeVideoOfMemberNum); + vo.setPreviewVideoOfMemberNum(previewVideoOfMemberNum); + vo.setClickOnPayOfMemberNum(clickOnPayOfMemberNum); + vo.setPayOfMemberNum(payOfMemberNum); + + //转化率格式 + DecimalFormat df = new DecimalFormat("0.0"); + + vo.setTotalVisitorOfMemberNum(totalVisitorOfMemberNum); + vo.setCompleteOfVideoNum(completeOfVideoNum); + vo.setPreviewOfVideoNum(previewOfVideoNum); + vo.setPayOfOrderNum(payOfOrderNum); + vo.setPayOfOrderAmount(df.format(payOfOrderAmount.setScale(2, RoundingMode.HALF_UP))); + vo.setRefundOfOrderNum(refundOfOrderNum); + vo.setRefundOfOrderAmount(df.format(refundOfOrderAmount.setScale(2, RoundingMode.HALF_UP))); + + return ApiResponse.success(vo); + } + + /** + * + * @param num1 + * @param num2 + * @return + */ + private String calculateConversionRate(Integer num1,Integer num2){ + //转化率格式 + DecimalFormat df = new DecimalFormat("0.00"); + if(num2==0){ + return "0.00"; + }else { + BigDecimal result = new BigDecimal(num1).divide(new BigDecimal(num2), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); + return df.format(result); + } + } + + + /** * * @param cycle 周期 1当前 2往期 @@ -126,7 +227,7 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { //查询推送订阅人数 int pushNum=statisticsMapper.countPushOfMember(query); // 查询预览视频人数 - Integer previewNum=statisticsMapper.countPreviewOfMember(query); + Integer previewNum=statisticsMapper.countPreviewVideoOfMember(query); if(cycle==1){ //当前周期的扫码访问人数 @@ -190,7 +291,7 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { // 计算当前周期的支付订单金额 BigDecimal orderAmount=statisticsMapper.countOrderAmount(query).setScale(2, RoundingMode.HALF_UP); //查询预览视频人数 - int preview=statisticsMapper.countPreviewOfMember(query); + int preview=statisticsMapper.countPreviewVideoOfMember(query); //查询扫码人数 int scanCode=statisticsMapper.countScanCodeOfMember(query); //查询付费人数 @@ -211,7 +312,7 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { } }else if(cycle==2){ //上一个周期的支付订单金额 - vo.setNowOrderAmount(orderAmountDf.format(orderAmount)); + vo.setPreviousOrderAmount(orderAmountDf.format(orderAmount)); // 计算预览_支付转化率 if(pay==0){ vo.setPreviousPreviewPay("0.00"); diff --git a/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java b/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java index f4bbc0e..4695771 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java @@ -1,9 +1,6 @@ package com.ycwl.basic.service.mobile; -import com.ycwl.basic.model.mobile.statistic.AppSta1VO; -import com.ycwl.basic.model.mobile.statistic.AppSta2VO; -import com.ycwl.basic.model.mobile.statistic.AppSta3VO; -import com.ycwl.basic.model.mobile.statistic.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.*; import com.ycwl.basic.utils.ApiResponse; /** @@ -17,4 +14,6 @@ public interface AppStatisticsService { ApiResponse twoStatistics(CommonQueryReq query); ApiResponse freeStatistics(CommonQueryReq query); + + ApiResponse userConversionFunnel(CommonQueryReq query); } diff --git a/src/main/resources/mapper/pc/StatisticsMapper.xml b/src/main/resources/mapper/pc/StatisticsMapper.xml index c392073..0a52c10 100644 --- a/src/main/resources/mapper/pc/StatisticsMapper.xml +++ b/src/main/resources/mapper/pc/StatisticsMapper.xml @@ -6,95 +6,242 @@ from `order` where status = 1 and scenic_id = #{scenicId} - + and create_at >= #{startTime} - + and create_at <= #{endTime} - + SELECT + IFNULL(SUM(count), 0) AS count + FROM ( + select count(1) as count + from statistics + where type=2 and scenic_id = #{scenicId} + + and create_time >= #{startTime} + + + and create_time <= #{endTime} + + group by member_id + )a + + + + + + + + - + select count(1) as count from statistics - where type=6 and scenic_id = #{scenicId} - + where type =5 and scenic_id = #{scenicId} + and create_time >= #{startTime} - + and create_time <= #{endTime} - group by member_id + + \ No newline at end of file