当前位置: 首页 > 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.xdnf.cn/news/1140895.html

相关文章:

  • 实现库存显示和状态按钮的Question
  • 如何将 iPhone 备份到笔记本电脑?
  • 从 Spring Boot 2.x 到 Spring Boot 3.x:全面对比与快速上手指南
  • 解决“Module ‘./@ant-design/icons‘ does not exist in container”的Webpack微前端报错
  • 【unitrix】 6.8 加一运算(add_one.rs)
  • 【机器人】HOV-SG 开放词汇 | 分层3D场景图 | 语言引导机器人导航
  • 第16章 基于AB实验的增长实践——验证想法:AB实验实践
  • 【iOS】消息传递和消息转发
  • AI IDE冲击下JetBrains作死,IDEA埋订阅陷阱
  • C++---cout、cerr、clog
  • PYTHON日志神器nb_log详细介绍和使用说明
  • leetcode:单词接龙[图广搜][无权图找最短路径]
  • C# 转换(引用转换)
  • 超简单linux上部署Apache
  • React + Mermaid 图表渲染消失问题剖析及 4 种代码级修复方案
  • B 站关键词排名提高之账号互助术:矩阵助攻,流量起飞
  • OpenAI最强ChatGPT智能体发布:技术突破与应用前景分析
  • 前端项目利用Gitlab CI/CD流水线自动化打包、部署云服务
  • 乙烯丙烯酸酯橡胶市场报告:性能优势、行业现状与发展前景​
  • 【现有资料整理】灵枢 - 用于医学领域的 SOTA 多模态大语言模型
  • Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
  • Pythonday17
  • 群晖中相册管理 immich大模型的使用
  • C++ :vector的介绍和使用
  • MyBatis:配置文件完成增删改查_添加
  • 【RAG实战】用户反馈如何关联算法优化
  • Redisson 分布式锁
  • 构建智能客服Agent:从需求分析到生产部署
  • 使用 jar -xvf 解压JAR文件无反应怎么办?
  • 打车代驾 app 订单管理系统模块搭建