【烘焙坊项目】后端搭建(13)- 数据统计--图形报表

一、Apache ECharts

1.1介绍

Apache ECharts是一款基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。

官网地址:Apache ECharts

总结:使用Echarts,重点在于研究当前图表所需的数据格式。通常是需要后端提供符合格式要求的动态数据,然后响应给前端来展示图表。

二、营业额统计

2.1需求分析和设计

业务规则:

营业额指订单状态为已完成的订单金额合计

基于可视化报表的折线图展示营业额数据,x轴为日期,y轴为营业额

根据时间选择区间,展示每天的营业额数据

查看接口文档:

2.2代码开发

controller层

service层

java 复制代码
@Service
@Slf4j
public class ReportServiceImpl implements ReportService {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 统计指定时间区间内的营业额数据
     * @param begin
     * @param end
     * @return
     */
    @Override
    public TurnoverReportVO getTurnoverReport(LocalDate begin, LocalDate end) {
        //当前集合用于存放从begin到end范围内的每天日期
        List<LocalDate> dateList = new ArrayList();

        dateList.add(begin);

        while(!begin.equals(end)){
            //日期计算,计算指定日期的后一天对应的日期
            begin = begin.plusDays(1);
            dateList.add(begin);
        }

        //存放每天的营业额
        List<Double> turnoverList = new ArrayList<>();
        for(LocalDate date:dateList){
            //查询date日期对应的营业额,营业额是指状态为"已完成"的订单金额合计
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
            //select sum(amount) from orders where order_time > ? and order_time < ? and status = 5
            Map map =  new HashMap();
            map.put("beginTime",beginTime);
            map.put("endTime",endTime);
            map.put("status", Orders.COMPLETED);
            Double turnover = orderMapper.sumByMap(map);
            turnover = turnover == null ? 0.0 : turnover;
            turnoverList.add(turnover);
        }

        //封装返回结果
        return TurnoverReportVO
                .builder()
                .dateList(StringUtils.join(dateList, ","))//用","分隔开
                .turnoverList(StringUtils.join(turnoverList, ","))
                .build();
    }
}

dao层

2.3功能测试

通过

三、用户统计

3.1需求分析和设计

业务规则:

基于可视化报表的折线图展示用户数据,x轴为日期,y轴为用户数

根据时间选择区间,展示每天的用户总量和新增用户量数据

查看接口文档:

3.2代码开发

controller层

service层

java 复制代码
 /**
     * 统计指定时间内的新增用户和总用户数据
     * @param begin
     * @param end
     * @return
     */
    @Override
    public UserReportVO getUserReport(LocalDate begin, LocalDate end) {
        //存放从begin到end之间每天对应的日期
        List<LocalDate> dateList = new ArrayList();
        dateList.add(begin);
        while(!begin.equals(end)){
            begin = begin.plusDays(1);
            dateList.add(begin);
        }

        //存放每天的新增用户数量
        List<Integer> newUserList = new ArrayList<>();
        //存放每天总用户数量
        List<Integer> totalUserList = new ArrayList<>();

        for (LocalDate date : dateList) {
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);

            Map map =  new HashMap();
            map.put("endTime",endTime);
            Integer totalUser = userMapper.countByMap(map);//总用户数量
            totalUserList.add(totalUser);

            map.put("beginTime", beginTime);
            Integer newUser = userMapper.countByMap(map);//新增用户数量
            newUserList.add(newUser);
        }

        return UserReportVO
                .builder()
                .dateList(StringUtils.join(dateList, ","))
                .newUserList(StringUtils.join(newUserList, ","))
                .totalUserList(StringUtils.join(totalUserList, ","))
                .build();
    }

dao层

3.3功能测试

通过

四、订单统计

4.1需求分析和设计

业务规则:

有效订单指状态为"已完成"的订单

基于可视化报表的折线图展示订单数据,x轴为日期,y轴为订单数量

根据时间选择区间,展示每天的订单总数和有效订单数

展示所选时间区间内的有效订单数、总订单数、订单完成率、订单完成率=有效订单数/总订单数*100%

查看接口文档:

4.2代码开发

controller层

service层

java 复制代码
 /**
     * 统计指定时间内的订单相关数据
     * @param begin
     * @param end
     * @return
     */
    @Override
    public OrderReportVO getStatisticsReport(LocalDate begin, LocalDate end) {
        //存放从begin到end之间每天对应的日期
        List<LocalDate> dateList = new ArrayList();
        dateList.add(begin);
        while(!begin.equals(end)){
            begin = begin.plusDays(1);
            dateList.add(begin);
        }

        //存放每天的订单数量列表
        List<Integer> orderCountList = new ArrayList<>();
        //存放每天有效订单数量列表
        List<Integer> validOrderCountList = new ArrayList<>();
        //存放订单总数
        Integer totalOrderCount =0;
        //存放有效订单总数
        Integer validOrderCount =0;
        //存放订单完成率
        Double orderCompletionRate = 0.0;

        for (LocalDate date : dateList) {
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);

            Map map =  new HashMap();
            map.put("beginTime",beginTime);
            map.put("endTime",endTime);
            Integer totalOrder = orderMapper.countOrderByMap(map);//每日订单数量
            orderCountList.add(totalOrder);
            if(totalOrder!=null){
                totalOrderCount = totalOrderCount + totalOrder;
            }

            map.put("status", Orders.COMPLETED);
            Integer validOrder = orderMapper.countOrderByMap(map);//每日有效订单数
            validOrderCountList.add(validOrder);
            if(validOrder!=null){
                validOrderCount = validOrderCount + validOrder;
            }
        }
        orderCompletionRate = totalOrderCount==0 ? 0.0 :(validOrderCount*1.0/totalOrderCount);

        return OrderReportVO
                .builder()
                .dateList(StringUtils.join(dateList, ","))
                .orderCountList(StringUtils.join(orderCountList,","))
                .validOrderCountList(StringUtils.join(validOrderCountList,","))
                .orderCompletionRate(orderCompletionRate)
                .totalOrderCount(totalOrderCount)
                .validOrderCount(validOrderCount)
                .build();

    }

dao层

4.3功能测试

通过

五、销量排名Top10

5.1需求分析和设计

业务规则:

根据时间选择区间,展示销量前十的商品(包括菜品和套餐)

基于可视化报表的柱状图降序展示商品销量

此处的销量为商品销售的份数

查看接口文档:

5.2代码开发

controller层

service层

dao层

5.3功能测试

通过

六、小结

注意:MySql语句中 select sum()...是统计具体的数值总和,select count()...是统计符合记录数有几条,请勿混淆

订单统计部分业务代码还是有些复杂的,没有跟着老师走看看接口文档自己设计也能够顺畅运行。

销量排名部分的sql语句有一些长,考虑的较多。

相关推荐
野犬寒鸦1 小时前
从零起步学习计算机操作系统:I/O篇
服务器·开发语言·网络·后端·面试
易雪寒1 小时前
Java List 根据List中对象的属性值是否相同作为同一组,分割成多个连续的子List
java·数据结构·list·分组切割
朗迹 - 张伟1 小时前
UE5 UMG学习笔记
笔记·学习·ue5
小王不爱笑1322 小时前
Kubernetes(K8s)核心知识点
java
jinanwuhuaguo2 小时前
AI应用开发与自动化工具全景解析:Coze、Dify、FastGPT、n8n、MCP、Manus、Claude Code、OpenClaw
人工智能·学习·重构·新人首发·openclaw
桑榆肖物2 小时前
.NET 10 Native AOT 在 Linux 嵌入式设备上的实战
java·linux·.net·aot
墨着染霜华2 小时前
Java实战:封装Redis非阻塞分布式锁,彻底解决表单重复提交主键冲突
java·redis·分布式
EnglishJun2 小时前
ARM嵌入式学习(六) --- ARM基础介绍和相关专业术语讲解
arm开发·学习
启山智软2 小时前
【使用 Java(JSP)实现的简单商城页面前端示例】
java·前端·商城开发