framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountByDayAndHourVO.java
New file @@ -0,0 +1,24 @@ package cn.lili.modules.lmk.domain.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * lmk-shop-java * 下订单时间段统计对象 * @author : zxl * @date : 2025-09-26 09:21 **/ @Data @AllArgsConstructor @NoArgsConstructor public class OrderCountByDayAndHourVO { private Long orderCount; private String day; private String hour; } framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
@@ -16,6 +16,7 @@ import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; import cn.lili.mybatis.util.PageUtil; import cn.lili.utils.COSUtil; import cn.lili.utils.CommonUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -177,6 +178,11 @@ Calendar calendar = Calendar.getInstance(); // 用于日期计算的日历实例 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); int days = 0; if (queryParam.getYear() != null && queryParam.getMonth() != null) { Date[] dates = CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth()); startTime = dates[0]; endTime = dates[1]; }else { switch (queryParam.getSearchType()) { case "TODAY": // 今天:从今天0点到现在 @@ -254,6 +260,8 @@ default: return Result.error("不支持的时间范围类型"); } } if ("goods".equals(queryParam.getCurrentType())){ List<Map<String, Object>> maps = baseMapper.selectViewAndCompletionRateCountByDay(startTime, endTime,queryParam.getCurrentLimit()); Map<String,Long> viewPrintMap = maps.stream() framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -31,6 +31,7 @@ import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.lmk.domain.entity.CouponVirtual; import cn.lili.modules.lmk.domain.vo.OrderCountByDayAndHourVO; import cn.lili.modules.lmk.domain.vo.OrderCountVO; import cn.lili.modules.lmk.enums.general.AdminRoleEnum; import cn.lili.modules.lmk.enums.general.VirtualGoodsTypeEnum; @@ -1284,6 +1285,22 @@ Calendar calendar = Calendar.getInstance(); // 用于日期计算的日历实例 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); int days = 0; //判断是否是按年月查询 if (queryParam.getYear() != null && queryParam.getMonth() != null) { Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth()); startTime = dates[0]; endTime = dates[1]; System.out.println("开始打印"); System.out.println(startTime); System.out.println(endTime); Calendar tempCalendar = Calendar.getInstance(); tempCalendar.setTime(startTime); days = tempCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); for (int i = 0; i < days; i++) { dateList.add(sdf.format(tempCalendar.getTime())); tempCalendar.add(Calendar.DATE, 1); // 每天累加1天 } }else{ switch (queryParam.getSearchType()) { case "TODAY": // 今天:从今天0点到现在 @@ -1361,6 +1378,8 @@ default: return Result.error("不支持的时间范围类型"); } } List<Map<String, Object>> maps = baseMapper.selectOrderCountByDay(startTime,endTime); Map<String, Long> dayCountMap = maps.stream() @@ -1386,9 +1405,14 @@ List<String> dateList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); // 用于日期计算的日历实例 for (int i =0;i<=24;i++){ for (int i =0;i<24;i++){ dateList.add(i + "点"); } if (queryParam.getYear() != null && queryParam.getMonth() != null) { Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth()); startTime = dates[0]; endTime = dates[1]; }else{ switch (queryParam.getSearchType()) { case "TODAY": // 今天:从今天0点到现在 @@ -1417,7 +1441,6 @@ calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 999); endTime = calendar.getTime(); break; case "LAST_SEVEN": // 过去七天:从7天前0点到现在(含今天共7天) @@ -1448,22 +1471,34 @@ default: return Result.error("不支持的时间范围类型"); } List<Map<String, Object>> maps = baseMapper.selectOrderTimePeriod(startTime,endTime); Map<String, Long> dayCountMap = maps.stream() .collect(Collectors.toMap( map -> map.get("day").toString(), // 日期字符串(如2023-09-19) map -> Long.valueOf(map.get("count").toString()) // 订单数量 )); List<Long> orderCounts = new ArrayList<>(); for (String date : dateList) { // 核心:存在则取查询结果,不存在则补0 orderCounts.add(dayCountMap.getOrDefault(date, 0L)); } return Result.ok().data(orderCounts); List<Map<String, Object>> maps = baseMapper.selectOrderTimePeriod(startTime,endTime); Map<String, Long> countByDayHour = maps.stream() .collect(Collectors.toMap( map -> map.get("hour").toString(), map -> Long.valueOf(map.get("count").toString()), Long::sum // 如果有重复,累加count )); // 遍历查看结果 List<Long> countList = new ArrayList<>(); for (int i = 0; i < 24; i++) { String hourKey = String.valueOf(i); Long count = countByDayHour.getOrDefault(hourKey, 0L); countList.add(count); } Map<String,Object> map = new HashMap<>(); map.put("dateData",dateList); map.put("countData",countList); //TODO 浏览数据未加入 // map.put(); return Result.ok().data(map); } /** framework/src/main/java/cn/lili/utils/CommonUtil.java
@@ -3,6 +3,9 @@ import cn.lili.common.utils.StringUtils; import java.util.Calendar; import java.util.Date; /** * lmk-shop-java * 工具 @@ -10,7 +13,34 @@ * @author : zxl * @date : 2025-08-07 14:40 **/ public class CommonUtil { public static Date[] getMonthStartAndEnd(int year, int month) { Calendar calendar = Calendar.getInstance(); Date[] result = new Date[2]; // 设置月份起始时间(当月的第一天 00:00:00) calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month - 1); // Calendar月份从0开始,0=1月 calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); result[0] = calendar.getTime(); // 月份起始时间 // 设置月份结束时间(下个月的第一天 00:00:00,然后减1毫秒) calendar.add(Calendar.MONTH, 1); calendar.add(Calendar.MILLISECOND, -1); result[1] = calendar.getTime(); // 月份结束时间 return result; } public static String maskName(String name) { if (StringUtils.isBlank(name)) { return ""; manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
@@ -95,6 +95,11 @@ } /** * 浏览数据和下订单时间段分析 * @param queryParam * @return */ @GetMapping("/orderTimePeriod") public Result getOrderTimePeriod(StatisticsQueryParam queryParam) { return orderService.getOrderTimePeriod(queryParam);