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

相关推荐
nashane4 分钟前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
一直不明飞行19 分钟前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker26 分钟前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
一口吃俩胖子1 小时前
【脉宽调制DCDC功率变换学习笔记021】时域性能准则
笔记·学习
你的保护色1 小时前
【无标题】
java·服务器·网络
basketball6161 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
淘矿人2 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
星浩AI2 小时前
OpenHuman 对比 OpenClaw、Hermes Agent
人工智能·后端·agent
小江的记录本2 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
来恩10032 小时前
请求转发与响应重定向的使用
java