From 0da38cd6da5979b8d295d18ccd771bae0a0893ea Mon Sep 17 00:00:00 2001 From: zvv <508748680@qq.com> Date: Fri, 10 Apr 2026 10:10:22 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=80=E9=87=8F=E6=8E=92=E5=90=8D=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ReportController.java | 36 +++++++ .../main/java/com/sky/mapper/OrderMapper.java | 20 ++++ .../java/com/sky/service/ReportService.java | 20 ++++ .../sky/service/impl/ReportServiceImpl.java | 101 ++++++++++++++++++ .../src/main/resources/mapper/OrderMapper.xml | 30 ++++++ 5 files changed, 207 insertions(+) diff --git a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java index f651f74..824cb06 100644 --- a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java +++ b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java @@ -3,6 +3,8 @@ package com.sky.controller.admin; import com.sky.result.Result; import com.sky.service.ReportService; +import com.sky.vo.OrderReportVO; +import com.sky.vo.SalesTop10ReportVO; import com.sky.vo.TurnoverReportVO; import com.sky.vo.UserReportVO; import io.swagger.annotations.Api; @@ -59,4 +61,38 @@ public class ReportController { log.info("用户数据统计:{},{}", begin, end); return Result.success(reportService.getUserStatistics(begin, end)); } + + + /** + * 订单统计 + * @param begin + * @param end + * @return + */ + @GetMapping("/ordersStatistics") + @ApiOperation("订单统计") + public Result ordersStatistics( + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end + ){ + log.info("订单统计:{},{}", begin, end); + return Result.success(reportService.getOrdersStatistics(begin, end)); + } + + + /** + * 销量排名 + * @param begin + * @param end + * @return + */ + @GetMapping("/top10") + @ApiOperation("销量排名") + public Result top10( + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end + ){ + log.info("销量排名top10:{},{}", begin, end); + return Result.success(reportService.getSalesTop10(begin, end)); + } } diff --git a/sky-server/src/main/java/com/sky/mapper/OrderMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java index 7329dc9..25b27f8 100644 --- a/sky-server/src/main/java/com/sky/mapper/OrderMapper.java +++ b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java @@ -2,11 +2,13 @@ package com.sky.mapper; import com.github.pagehelper.Page; +import com.sky.dto.GoodsSalesDTO; import com.sky.dto.OrdersPageQueryDTO; import com.sky.entity.Orders; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -76,4 +78,22 @@ public interface OrderMapper { */ //select sum(amount) from orders where order_time < ? and order_time > ? and status = 5 Double sumByMap(Map map); + + + + /** + * 根据动态条件统计订单数据 + * @param map + * @return + */ + Integer countByMap(Map map); + + + /** + * 统计指定时间区间内的销量排名前10 + * @param begin + * @param end + * @return + */ + List getSalesTop10(LocalDateTime begin, LocalDateTime end); } diff --git a/sky-server/src/main/java/com/sky/service/ReportService.java b/sky-server/src/main/java/com/sky/service/ReportService.java index 404fbc5..9ed4fd6 100644 --- a/sky-server/src/main/java/com/sky/service/ReportService.java +++ b/sky-server/src/main/java/com/sky/service/ReportService.java @@ -1,5 +1,7 @@ package com.sky.service; +import com.sky.vo.OrderReportVO; +import com.sky.vo.SalesTop10ReportVO; import com.sky.vo.TurnoverReportVO; import com.sky.vo.UserReportVO; @@ -24,4 +26,22 @@ public interface ReportService { * @return */ UserReportVO getUserStatistics(LocalDate begin, LocalDate end); + + + /** + * 统计指定时间内的订单数据 + * @param begin + * @param end + * @return + */ + OrderReportVO getOrdersStatistics(LocalDate begin, LocalDate end); + + + /** + * 统计指定时间内的销量排名前10 + * @param begin + * @param end + * @return + */ + SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end); } diff --git a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java index 6f8f701..460cf87 100644 --- a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java +++ b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java @@ -1,11 +1,15 @@ package com.sky.service.impl; +import com.sky.dto.GoodsSalesDTO; import com.sky.entity.Orders; import com.sky.mapper.OrderMapper; import com.sky.mapper.UserMapper; import com.sky.service.ReportService; +import com.sky.vo.OrderReportVO; +import com.sky.vo.SalesTop10ReportVO; import com.sky.vo.TurnoverReportVO; import com.sky.vo.UserReportVO; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -18,6 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service @@ -124,4 +129,100 @@ public class ReportServiceImpl implements ReportService { return userReportVO; } + + + /** + * 统计指定时间内的用户数据 + * @param begin + * @param end + * @return + */ + @Override + public OrderReportVO getOrdersStatistics(LocalDate begin, LocalDate end) { + //当前集合用于存放从begin到end范围内每天的日期 + List dateList = new ArrayList(); + dateList.add(begin); + while(!begin.equals(end)){ + //日期计算 计算指定日期的后一天对应的日期 + begin = begin.plusDays(1); + dateList.add(begin); + } + + List orderCountList = new ArrayList<>(); + List validOrderCountList = new ArrayList<>(); + + //遍历日期集合 查询每天的有效订单数和订单总数 + for(LocalDate date: dateList){ + LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); + + //查询每天的订单总数 select count(id) from orders where order_time > ? and order_time < ? + Integer orderCount = getOrderCount(beginTime, endTime, null); + orderCountList.add(orderCount); + //查询每天的有效订单数 select count(id) from orders where order_time > ? and order_time < ? and status = 5 + Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED); + validOrderCountList.add(validOrderCount); + } + + //计算时间区间内的订单总数量 + Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get(); + //计算时间区间内的有效订单总数量 + Integer totalValidOrderCount = validOrderCountList.stream().reduce(Integer::sum).get(); + //计算订单有效率 + Double orderCompletionRate = totalOrderCount ==0? 0.0: totalValidOrderCount.doubleValue() / totalOrderCount; + + OrderReportVO orderReportVO = OrderReportVO.builder() + .dateList(StringUtils.join(dateList, ",")) + .orderCountList(StringUtils.join(orderCountList, ",")) + .validOrderCountList(StringUtils.join(validOrderCountList, ",")) + .totalOrderCount(totalOrderCount) + .validOrderCount(totalValidOrderCount) + .orderCompletionRate(orderCompletionRate) + .build(); + + return orderReportVO; + } + + + /** + * 根据状态统计订单数量 + * @param begin + * @param end + * @param status + * @return + */ + private Integer getOrderCount(LocalDateTime begin, LocalDateTime end, Integer status) { + Map map = new HashMap(); + map.put("begin", begin); + map.put("end", end); + map.put("status", status); + Integer orderCount = orderMapper.countByMap(map); + return orderCount; + } + + + /** + *统计指定时间区间内的销量排名前10 + * @param begin + * @param end + * @return + */ + @Override + public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) { + LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX); + + List salesTop10 = orderMapper.getSalesTop10(beginTime, endTime); + + List names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()); + String nameList = StringUtils.join(names, ","); + List numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList()); + String numberList = StringUtils.join(numbers, ","); + + return SalesTop10ReportVO.builder() + .nameList(nameList) + .numberList(numberList) + .build(); + } + } diff --git a/sky-server/src/main/resources/mapper/OrderMapper.xml b/sky-server/src/main/resources/mapper/OrderMapper.xml index 73df9e8..a9fe8b1 100644 --- a/sky-server/src/main/resources/mapper/OrderMapper.xml +++ b/sky-server/src/main/resources/mapper/OrderMapper.xml @@ -83,4 +83,34 @@ + + + + + +