数据统计模块后端架构解析:从Controller到SQL的ECharts数据对接实践

发布于:2025-07-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、引言

  1. 业务场景重要性

    • 数据驱动决策:日活、订单趋势、商品热度等指标对运营的价值

    • 可视化需求:Apache ECharts在前端动态图表展示中的关键作用(简略介绍

  2. 技术栈概览

    • 前端可视化:Apache ECharts(折线图/柱状图)

    • 后端框架:SpringBoot + MyBatis

    • 数据存储:MySQL

二、接口设计概览

接口类型 路径 核心参数 返回数据结构
营业额统计 /admin/report/turnoverStatistics date(日期范围)
Result<TurnoverReportVO>
用户统计 /admin/report/userStatistics date
Result<UserReportVO>
订单统计 /admin/report/ordersStatistics date
Result<OrderReportVO>
销量排名TOP10 /admin/report/top10 date
Result<SalesTop10ReportVO>

三、分层实现详解(核心章节)

        一、营业额统计接口

                1.Controller

@DateTimeFormat主要作用是将前端传递的字符串类型的日期 / 时间数据,按照指定格式转换为 Java 中的日期 / 时间对象

                2.ServerImpl

营业额统计接口实现概要

核心功能
  • 计算指定日期范围内的每日营业额数据

  • 过滤统计条件:仅包含"已完成"状态的订单

实现流程
  1. 日期范围处理

    • 生成从beginend的连续日期序列

    • 使用循环逐日增加直到覆盖整个查询区间

  2. 每日营业额计算

    • 将日期转换为当天的起止时间点(00:00至23:59)

    • 构建查询参数:

      • 时间范围(当日00:00 - 23:59)

      • 订单状态(已完成)

    • 执行SQL聚合查询获取当日营业额总和

  3. 空数据处理

    • 对无订单的日期返回0.0值

    • 避免前端展示断层

  4. 结果封装

    • 日期列表转换为逗号分隔字符串

    • 营业额列表转换为逗号分隔字符串

    • 构建VO对象返回给Controller层

                3.Mapper/.xml

        二、用户统计接口

                1.Controller
                2.ServerImpl

用户统计接口实现概要

核心功能
  • 统计指定日期范围内的用户增长数据

  • 同步计算每日新增用户数和累计用户总数

  • 覆盖完整日期区间,无数据断层

实现流程
  1. 日期范围处理

    • 生成从起始日到结束日的连续日期序列

    • 使用循环逐日推进确保日期连续性

  2. 双指标并行计算

    • 每日累计用户:统计截至当日23:59:59的用户总量

      • 仅需传入当日结束时间参数

    • 每日新增用户:统计当日00:00:00-23:59:59的注册量

      • 同时传入当日开始和结束时间参数

  3. 精确时间控制

    • 将日期转换为当日精确时间范围

    • 最小时间:00:00:00

    • 最大时间:23:59:59.999999999

  4. 结果封装优化

    • 日期序列转换为逗号分隔字符串

    • 用户数据序列转换为逗号分隔数值字符串

    • 构建三列数据返回结构

                3.Mapper/.xml

        三、订单统计接口

                1.Controller
                2.ServerImpl

  1. 日期序列生成

    • 创建从beginend的连续日期列表

    • 确保日期范围完整性(包含起止日)

  2. 双指标同步统计

    • 总订单统计

      • 查询条件:当日时间范围

      • 无状态过滤

    • 有效订单统计

      • 查询条件:当日时间范围 + 已完成状态

      • 使用相同Mapper方法通过参数区分

  3. 实时聚合计算

    • 循环内累计:

      • allDateOrders(总订单量)

      • allValidOrders(有效订单量)

    • 循环外计算:

      • orderCompletionRate = allValidOrders / allDateOrders

  4. 空值安全机制

    • 无订单日期默认返回0

    • 除零保护:当总订单为0时完成率设为0.0

                3.Mapper/.xml

        四、销量统计接口

                1.Controller
                2.ServerImpl

  1. 时间范围精确化

    • 起始日转换为当日零点(00:00:00

    • 结束日转换为当日最后一刻(23:59:59.999999

    • 确保完整覆盖自然日边界

  2. 聚合查询执行

    • 调用Mapper执行核心SQL:

  3. 数据流转换

    • 名称提取List<GoodsSalesDTO> → List<String>

      • 映射函数:GoodsSalesDTO::getName

    • 销量提取List<GoodsSalesDTO> → List<Integer>

      • 映射函数:GoodsSalesDTO::getNumber

  4. 字符串优化封装

    • 名称列表拼接:List<String> → "商品A,商品B,..."

    • 销量列表拼接:List<Integer> → "156,142,..."

    • 构建最终VO对象

                3.Mapper/.xml

<select id="getTop10" resultType="com.sky.dto.GoodsSalesDTO">
    select 
        od.name,              <!-- 商品名称 -->
        sum(od.number) number <!-- 总销量(别名number) -->
    from 
        order_detail od,      <!-- 订单明细表别名od -->
        orders o              <!-- 订单主表别名o -->
    where 
        od.order_id = o.id    <!-- 两表关联条件 -->
        and o.status = 5      <!-- 只统计已完成的订单 -->
        <if test="beginTime!=null">  <!-- 动态时间范围 -->
            and order_time &gt; #{beginTime}  <!-- 开始时间过滤 -->
        </if>
        <if test="endTime!=null">
            and order_time &lt; #{endTime}    <!-- 结束时间过滤 -->
        </if>
    group by 
        od.name               <!-- 按商品名称分组 -->
    order by 
        number desc           <!-- 按销量降序排序 -->
    limit 0,10                <!-- 取前10条记录 -->
</select>

1.查找两个表分别是order_detail(订单详情表)和orders(订单表)

2.查找订单名,和订单number的数量 并命名为number

3.查找条件是order_detaiol(订单详情表)和order(订单表)的id相同,并且状态码为5(已完成状态)

4.时间必须在条件范围内。

5.根据名字和数量降序排序,

6.只查询前10个。

四、数据展示图

五、总结

本文详细实现了苍穹外卖系统的四个核心数据统计接口:

  1. 营业额统计:日期维度营收分析

  2. 用户统计:新增用户与总量趋势

  3. 订单统计:订单量与完成率分析(含关键实现细节)

  4. 销量排名:TOP10商品排行

六、附录

营业额统计接口返回VO

用户数量统计接口返回VO

订单数据统计接口返回VO

销量统计接口返回VO


网站公告

今日签到

点亮在社区的每一天
去签到