【烘焙坊项目】后端搭建(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语句有一些长,考虑的较多。

相关推荐
呱牛do it19 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 7)
java·vue
NE_STOP19 小时前
Redis--SDS字符串与集合的底层实现原理
java
直奔標竿19 小时前
Java开发者AI转型第二十二课!Spring AI 个人知识库实战(一)——架构搭建与核心契约落地
java·人工智能·后端·spring·架构
身如柳絮随风扬19 小时前
深入理解Java IO与NIO的区别:从BIO到NIO的演进
java·nio
清汤饺子19 小时前
【译】我的 AI 进阶之路:从怀疑到深度整合
前端·javascript·后端
A-Jie-Y20 小时前
JAVA设计模式-抽象工厂模式
java·设计模式
@insist12320 小时前
信息安全工程师-密码学专题(下):构建可信网络空间的核心机制
java·大数据·密码学·软考·信息安全工程师·软件水平考试
无厚20 小时前
Spring Boot中LLM流式交互的核心原理
后端·设计
摇滚侠20 小时前
Java 零基础全套视频教程,面向对象(高级),笔记 105-120
java·开发语言·笔记