当前位置: 首页 > news >正文

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

一、引言

  1. 业务场景重要性

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

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

  2. 技术栈概览

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

    • 后端框架:SpringBoot + MyBatis

    • 数据存储:MySQL

二、接口设计概览

接口类型路径核心参数返回数据结构
营业额统计/admin/report/turnoverStatisticsdate(日期范围)
Result<TurnoverReportVO>
用户统计/admin/report/userStatisticsdate
Result<UserReportVO>
订单统计/admin/report/ordersStatisticsdate
Result<OrderReportVO>
销量排名TOP10/admin/report/top10date
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

http://www.lryc.cn/news/592236.html

相关文章:

  • div和span区别
  • 为什么IoTDB成为物联网场景的技术优选?
  • Vue3 业务落地全景:脚手架、权限、国际化、微前端、跨端与低代码 50 条实战心法
  • 差分数组算法
  • ElasticSearch Doc Values和Fielddata详解
  • Android音视频探索之旅 | Webrtc 1对1音视频通话核心流程分析
  • 力扣347:前K个高频元素
  • [AI8051U入门第五步]modbus_RTU主机
  • 《Python Web 框架深度剖析:Django、Flask 与 FastAPI 的选择之道》
  • 数据库防止数组字符串序列化
  • Python暑期学习笔记5
  • C++编程学习(第10天)
  • 近期遇到的问题汇总
  • 微信小程序商品结算功能
  • 【嵌入式硬件实例】-555定时器实现LED追逐效果
  • 后端参数校验
  • LP-MSPM0G3507学习--05管脚中断
  • 网络基础12--可靠性概述及要求
  • postman接口测试,1个参数有好几个值的时候如何测试比较简单快速?
  • Leetcode 04 java
  • 今日行情明日机会——20250718
  • 【Spring WebFlux】什么是响应式编程
  • Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
  • 证券行业 SCRM 落地:企业微信与系统协同的合规技术方案
  • 二进制写入与文本写入的本质区别:系统视角下的文件操作
  • 数据结构:顺序表和链表
  • 【PTA数据结构 | C语言版】我爱背单词
  • 【PTA数据结构 | C语言版】二叉堆的朴素建堆操作
  • HTML 页面禁止缩放功能
  • 深入解析文本分类技术全景:从特征提取到深度学习架构