目录

(4)订单统计

4-1、代码开发

1、ReportController

2、ReportService

3、ReportServiceImpl

4、OrderMapper

5、OrderMapper.xml

(5)查询销量排名top10接口

5-1、需求分析

5-2、代码开发

1、ReportController

2、ReportService

3、ReportServiceImpl

4、OrderMapper

5、OrderMapper.xml

5-3、测试


4)订单统计

4-1、代码开发

1、ReportController

位置:sky-server/src/main/java/com/sky/controller/admin/ReportController.java

代码:

/**
 * 订单统计
 * @param begin
 * @param end
 * @return
 */
@GetMapping("/ordersStatistics")
@ApiOperation(value = "订单统计")
private Result<OrderReportVO> OrdersStatistics(
        @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
        @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
    log.info("获取{}到{}订单统计数据:",begin, end);
    OrderReportVO ordersStatistics = reportService.OrdersStatistics(begin, end);
    return Result.success(ordersStatistics);
}

示意图:

2、ReportService

位置:sky-server/src/main/java/com/sky/service/ReportService.java

代码:

/**
 * 获取订单统计数据
 * @param begin
 * @param end
 * @return
 */
OrderReportVO OrdersStatistics(LocalDate begin, LocalDate end);

示意图:

3、ReportServiceImpl

位置:sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java

代码:

   /**
     * 获取指定时间段内的订单统计数据
     * @param begin
     * @param end
     * @return
     */
    public OrderReportVO OrdersStatistics(LocalDate begin, LocalDate end) {
        //1、获取日期列表
        List<LocalDate> dateList = new ArrayList();
        dateList.add(begin);
        while (!begin.equals(end)){
            begin = begin.plusDays(1);
            dateList.add(begin);
        }
 
        //2、获取每天订单总数列表
        List<Integer> totalOrderCountList = new ArrayList();
 
        //3、获取每天有效订单总数列表
        List<Integer> validOrderCountList = new ArrayList();
 
 
        for (LocalDate date : dateList) {
            // 由于数据库的对应的字段名为order_time形式是年月日时分秒,所以需要将LocalDate转换为LocalDateTime
            LocalDateTime starTime = LocalDateTime.of(date, LocalTime.MIN);// 开始时间, 00:00:00
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);// 结束时间, 23:59:59
 
 
            //2、获取每天订单总数
            //select count(id) from orders where order_time >= #{startTime} and order_time <= #{endTime}
            Integer totalOrderCount = orderMapper.countOrdersByTime(starTime, endTime);
            totalOrderCountList.add(totalOrderCount);
 
            Map map = new HashMap();
            map.put("begin", starTime);
            map.put("end", endTime);
            map.put("status", Orders.COMPLETED);// 订单状态为已完成
            //3、获取每天有效订单总数
            //select count(id) from orders where status = 5 and order_time >= #{startTime} and order_time <= #{endTime}
            Integer validOrderCount = orderMapper.countOrdersByStatusAndTime(map);
            validOrderCountList.add(validOrderCount);
 
        }
        //4、计算订单完成率
        //计算时间段内的订单总数
        Integer totalOrderCount = totalOrderCountList.stream().reduce(0, Integer::sum);
        //计算时间段内的有效订单总数
        Integer validOrderCount = validOrderCountList.stream().reduce(0, Integer::sum);
        //计算订单完成率
        Double orderCompletionRate = 0.0;
        if(totalOrderCount!= 0){
            orderCompletionRate = (double) validOrderCount / totalOrderCount;
        }
 
        OrderReportVO build =
                OrderReportVO.builder()
                        .dateList(StringUtil.join(",", dateList))//日期列表
                        .orderCountList(StringUtil.join(",", totalOrderCountList))//订单总数列表
                        .validOrderCountList(StringUtil.join(",", validOrderCountList))//有效订单总数列表
                        .totalOrderCount(totalOrderCount)//总订单数
                        .validOrderCount(validOrderCount)//有效订单数
                        .orderCompletionRate(orderCompletionRate)//订单完成率
                        .build();
        return build;
    }

示意图:

4、OrderMapper

位置:sky-server/src/main/java/com/sky/mapper/OrderMapper.java

代码:

    /**
     * 根据ID统计每天订单数量
     * @return
     */
    Integer countOrdersByTime(LocalDateTime begin,LocalDateTime end);
 
    /**
     * 根据状态(已完成)统计每天订单数量
     * @return
     */
 
    Integer countOrdersByStatusAndTime(Map map);

示意图:

5、OrderMapper.xml

位置:sky-server/src/main/resources/mapper/OrderMapper.xml

代码:

<select id="countOrdersByTime" resultType="java.lang.Integer">
    select count(id) from orders
    <where>
        <if test="begin != null">
            and order_time &gt;= #{begin}
        </if>
        <if test="end != null">
            and order_time &lt;= #{end}
        </if>
    </where>
</select>
 
<select id="countOrdersByStatusAndTime" resultType="java.lang.Integer">
    select count(id) from orders
    <where>
        <if test="status != null">
            and status = #{status}
        </if>
        <if test="begin != null">
            and order_time &gt;= #{begin}
        </if>
        <if test="end != null">
            and order_time &lt;= #{end}
        </if>
    </where>
</select>

示意图:

4-2、测试

5)查询销量排名top10接口

5-1、需求分析

5-2、代码开发

1、ReportController

位置:sky-server/src/main/java/com/sky/controller/admin/ReportController.java

代码:

/**
 * 销量排名top10
 * @param begin
 * @param end
 * @return
 */
@GetMapping("/top10")
@ApiOperation("销量排名top10")
public Result<SalesTop10ReportVO> 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));
}

示意图:

2、ReportService

位置:sky-server/src/main/java/com/sky/service/ReportService.java

代码:

/**
 * 统计指定时间区间内的销量排名前10
 * @param begin
 * @param end
 * @return
 */
SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end);

示意图:

3、ReportServiceImpl

位置:sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java

代码:

/**
 * 统计指定时间区间内的销量排名前10
 * @param begin
 * @param end
 * @return
 */
public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) {
    LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN);
    LocalDateTime endTime = LocalDateTime.of(end,LocalTime.MAX);
    List<GoodsSalesDTO> salesTop10 = orderMapper.getSalesTop10(beginTime, endTime);
    List<String> names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());
    String nameList = StringUtils.join(names, ",");
    List<Integer> numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());
    String numberList = StringUtils.join(numbers, ",");
    return SalesTop10ReportVO.builder().nameList(nameList).numberList(numberList).build();
}

示意图:

4、OrderMapper

位置:sky-server/src/main/java/com/sky/mapper/OrderMapper.java

代码:

/**
 * 统计指定时间区间内的销量排名前10
 * @param begin
 * @param end
 * @return
 */
List<GoodsSalesDTO> getSalesTop10(LocalDateTime begin, LocalDateTime end);

示意图:

5、OrderMapper.xml

位置:sky-server/src/main/resources/mapper/OrderMapper.xml

代码:

<select id="getSalesTop10" resultType="com.sky.dto.GoodsSalesDTO">
    select od.name,sum(od.number) number
    from order_detail od,orders o
    where od.order_id = o.id and o.status = 5
    <if test="begin != null">
        and o.order_time &gt; #{begin}
    </if>
    <if test="end != null">
        and o.order_time &lt; #{end}
    </if>
    group by od.name
    order by number desc
    limit 0,10
</select>

示意图:

5-3、测试

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐