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

相关推荐
世人万千丶17 小时前
Flutter 框架跨平台鸿蒙开发 - 恐惧清单应用
学习·flutter·华为·开源·harmonyos·鸿蒙
涡能增压发动积18 小时前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
yuzhuanhei18 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
云烟成雨TD18 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Wenweno0o18 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
于慨18 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg32132118 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
tyung18 小时前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald18 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川18 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java