From fcde865a2d849ae13eea8a9fe7171a302676a953 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 8 Aug 2025 16:10:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/pc/StatisticsController.java | 32 ++ .../ycwl/basic/mapper/StatisticsMapper.java | 4 + .../basic/service/pc/StatisticsService.java | 20 ++ .../pc/impl/StatisticsServiceImpl.java | 77 +++++ .../resources/mapper/StatisticsMapper.xml | 306 +++++++++--------- 5 files changed, 277 insertions(+), 162 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/controller/pc/StatisticsController.java create mode 100644 src/main/java/com/ycwl/basic/service/pc/StatisticsService.java create mode 100644 src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java diff --git a/src/main/java/com/ycwl/basic/controller/pc/StatisticsController.java b/src/main/java/com/ycwl/basic/controller/pc/StatisticsController.java new file mode 100644 index 0000000..9d495ee --- /dev/null +++ b/src/main/java/com/ycwl/basic/controller/pc/StatisticsController.java @@ -0,0 +1,32 @@ +package com.ycwl.basic.controller.pc; + +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.service.pc.StatisticsService; +import com.ycwl.basic.utils.ApiResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; + +/** + * @Author:longbinbin + * @Date:2024/12/12 14:30 + */ +@RestController +@RequestMapping("/api/statistics/v1") +public class StatisticsController { + + @Autowired + private StatisticsService statisticsService; + + /** + * 智能获取扫码访问人数统计数据(自动选择粒度) + * @param query 查询参数(包含景区ID、开始时间、结束时间) + * @return 统计数据(超过7天返回日期级别,否则返回小时级别) + */ + @PostMapping("/scanCodeMemberChart") + public ApiResponse>> getScanCodeMemberChart(@RequestBody CommonQueryReq query) { + return ApiResponse.success(statisticsService.getScanCodeMemberChartAuto(query)); + } +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java index 3761f23..879f2a1 100644 --- a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java @@ -102,4 +102,8 @@ public interface StatisticsMapper { List> orderChartByDate(CommonQueryReq query); List> orderChartByHour(CommonQueryReq query); + + List> scanCodeMemberChartByHour(CommonQueryReq query); + + List> scanCodeMemberChartByDate(CommonQueryReq query); } diff --git a/src/main/java/com/ycwl/basic/service/pc/StatisticsService.java b/src/main/java/com/ycwl/basic/service/pc/StatisticsService.java new file mode 100644 index 0000000..09c4e4d --- /dev/null +++ b/src/main/java/com/ycwl/basic/service/pc/StatisticsService.java @@ -0,0 +1,20 @@ +package com.ycwl.basic.service.pc; + +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; + +import java.util.HashMap; +import java.util.List; + +/** + * @Author:longbinbin + * @Date:2024/12/12 14:32 + */ +public interface StatisticsService { + + /** + * 智能获取扫码访问人数统计数据(自动选择小时级别或日期级别) + * @param query 查询参数(包含景区ID、开始时间、结束时间) + * @return 统计数据(超过7天返回日期级别,否则返回小时级别) + */ + List> getScanCodeMemberChartAuto(CommonQueryReq query); +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java new file mode 100644 index 0000000..775b7d0 --- /dev/null +++ b/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java @@ -0,0 +1,77 @@ +package com.ycwl.basic.service.pc.impl; + +import com.ycwl.basic.mapper.StatisticsMapper; +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.service.pc.StatisticsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +/** + * @Author:longbinbin + * @Date:2024/12/12 14:34 + */ +@Service +public class StatisticsServiceImpl implements StatisticsService { + + @Autowired + private StatisticsMapper statisticsMapper; + + List> getScanCodeMemberChartByHour(CommonQueryReq query) { + return statisticsMapper.scanCodeMemberChartByHour(query); + } + + List> getScanCodeMemberChartByDate(CommonQueryReq query) { + return statisticsMapper.scanCodeMemberChartByDate(query); + } + + @Override + public List> getScanCodeMemberChartAuto(CommonQueryReq query) { + // 检查时间范围 + if (query.getStartTime() == null || query.getEndTime() == null) { + // 根据需求处理时间范围: + // 如果开始和结束时间均为空,则默认为当天0点到23时59分59秒 + // 如果只有一个为空,则往前或往后推24小时 + LocalDateTime now = LocalDateTime.now(); + + if (query.getStartTime() == null && query.getEndTime() == null) { + // 都为空,设置为当天0点到23:59:59 + LocalDateTime startOfDay = now.withHour(0).withMinute(0).withSecond(0).withNano(0); + LocalDateTime endOfDay = now.withHour(23).withMinute(59).withSecond(59).withNano(0); + + query.setStartTime(Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant())); + query.setEndTime(Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant())); + } else if (query.getStartTime() == null) { + // 开始时间为空,结束时间不为空,往前推24小时 + LocalDateTime endDateTime = query.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime startDateTime = endDateTime.minusHours(24); + + query.setStartTime(Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant())); + } else { + // 结束时间为空,开始时间不为空,往后推24小时 + LocalDateTime startDateTime = query.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime endDateTime = startDateTime.plusHours(24); + + query.setEndTime(Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant())); + } + } + + // 计算时间差(天数) + LocalDateTime startDateTime = query.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime endDateTime = query.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + long daysBetween = ChronoUnit.DAYS.between(startDateTime, endDateTime); + + // 超过7天使用日期级别,否则使用小时级别 + if (daysBetween > 7) { + return getScanCodeMemberChartByDate(query); + } else { + return getScanCodeMemberChartByHour(query); + } + } +} \ No newline at end of file diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index 9684caf..3d8aabf 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -319,176 +319,158 @@ AND date BETWEEN #{startTime} AND #{endTime} 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