苍穹外卖Day12——总结12

前期文章

文章标题地址
苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359
苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126
苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/136378883
苍穹外卖Day05——总结5https://blog.csdn.net/qq_43751200/article/details/136436080
苍穹外卖Day06——总结6https://blog.csdn.net/qq_43751200/article/details/137025980
苍穹外卖Day07——总结7https://lushimeng.blog.csdn.net/article/details/137026381
苍穹外卖Day8——总结8xx
苍穹外卖Day10——总结10https://lushimeng.blog.csdn.net/article/details/137469984
苍穹外卖Day11——总结11https://lushimeng.blog.csdn.net/article/details/137518413

苍穹外卖Day12

  • 1. 工作台展示
    • 1.1 今日数据的接口设计
    • 1.2 订单管理的接口设计
    • 1.3 菜品总览的接口设计
    • 1.4 套餐总览的接口设计
  • 2. 导出运营数据Excel报表

本篇文章思路:工作台展示以及使用Apache POI进行报表输出

工作台展示整体效果

在这里插入图片描述

1. 工作台展示

工作台展示的数据

  • 今日数据
  • 订单管理
  • 菜品总览
  • 套餐总览

1.1 今日数据的接口设计

在这里插入图片描述

WorkSpaceController层:

 /**
     * 查看今日数据接口
     * @return
     */
    @GetMapping("/businessData")
    @ApiOperation("查看今日数据接口")
    public Result<BusinessDataVO> businessData(){
        //获得当天的开始时间
        LocalDateTime begin = LocalDateTime.now().with(LocalTime.MIN);
        //获得当天的结束时间
        LocalDateTime end = LocalDateTime.now().with(LocalTime.MAX);
        BusinessDataVO businessDataVO = workspaceService.businessData(begin, end);
        return Result.success(businessDataVO);
    }

WorkSpaceService层

  /**
     * 今日数据查看
     * @return
     */
    BusinessDataVO businessData(LocalDateTime begin, LocalDateTime end);

WorkSpaceServiceImpl层

 /**
     * 今日数据查看
     * @return
     */
    public BusinessDataVO businessData(LocalDateTime begin, LocalDateTime end) {
        /**
         * 营业额:当日已完成订单的总金额
         * 有效订单:当日已完成订单的数量
         * 订单完成率:有效订单数 / 总订单数
         * 平均客单价:营业额 / 有效订单数
         * 新增用户:当日新增用户的数量
         */

        Map map = new HashMap();
        map.put("begin",begin);
        map.put("end",end);

        //查询总订单数
        Integer totalOrderCount = reportMapper.getOrdersByTime(map);

        map.put("status", Orders.COMPLETED);
        //营业额
        Double turnover = reportMapper.getTurnoverByTime(map);
        turnover = turnover == null? 0.0 : turnover;

        //有效订单数
        Integer validOrderCount = orderMapper.countByMap(map);

        Double unitPrice = 0.0;

        Double orderCompletionRate = 0.0;
        if(totalOrderCount != 0 && validOrderCount != 0){
            //订单完成率
            orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;
            //平均客单价
            unitPrice = turnover / validOrderCount;
        }

        //新增用户数
        Integer newUsers = userMapper.countByMap(map);

        return BusinessDataVO.builder()
                .turnover(turnover)
                .validOrderCount(validOrderCount)
                .orderCompletionRate(orderCompletionRate)
                .unitPrice(unitPrice)
                .newUsers(newUsers)
                .build();
    }

1.2 订单管理的接口设计

在这里插入图片描述

WorkSpaceController层:

    /**
     * 订单管理接口设计
     * @return
     */
    @GetMapping("/overviewOrders")
    @ApiOperation("订单管理接口设计")
    public Result<OrderOverViewVO> overviewOrders(){
        OrderOverViewVO orderOverViewVO = workspaceService.overviewOrders();
        return Result.success(orderOverViewVO);
    }

WorkSpaceService层


    /**
     * 订单管理接口设计
     * @return
     */
    OrderOverViewVO overviewOrders();

WorkSpaceServiceImpl层

    /**
     * 订单管理接口设计
     * @return
     */
    public OrderOverViewVO overviewOrders() {
        Map map = new HashMap();
        // 待接单数量
        map.put("status", Orders.TO_BE_CONFIRMED);
        Integer waitingOrders = orderMapper.countByMap(map);

        // 待派送数量
        map.put("status", Orders.DELIVERY_IN_PROGRESS);
        Integer deliveredOrders = orderMapper.countByMap(map);

        // 已完成数量
        map.put("status", Orders.COMPLETED);
        Integer completedOrders = orderMapper.countByMap(map);

        // 已取消数量
        map.put("status", Orders.CANCELLED);
        Integer cancelledOrders = orderMapper.countByMap(map);

        // 全部订单
        map.put("status", null);
        Integer allOrders = orderMapper.countByMap(map);

        return OrderOverViewVO.builder()
                .waitingOrders(waitingOrders)
                .deliveredOrders(deliveredOrders)
                .completedOrders(completedOrders)
                .cancelledOrders(cancelledOrders)
                .allOrders(allOrders)
                .build();
    }

OrderMapper层

    /**
     * 统计有效订单总数
     * @param map
     * @return
     */
    Integer countByMap(Map map);
    
    <select id="countByMap" resultType="java.lang.Integer" parameterType="java.util.Map">
        select count(*) from orders
        <where>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="begin != null">
                and order_time &gt;= #{begin}
            </if>
            <if test="end != null">
                and order_time &lt;= #{end}
            </if>
        </where>
    </select>

1.3 菜品总览的接口设计

在这里插入图片描述

WorkSpaceController层:

    /**
     * 菜品总览接口设计
     * @return
     */
    @GetMapping("/overviewDishes")
    @ApiOperation("菜品总览接口设计")
    public Result<DishOverViewVO> overviewDishes(){
        DishOverViewVO dishOverViewVO = workspaceService.overviewDishes();
        return Result.success(dishOverViewVO);
    }

WorkSpaceService层

    /**
     * 菜品总览接口
     * @return
     */
    DishOverViewVO overviewDishes();   

WorkSpaceServiceImpl层

 /**
     * 菜品总览接口
     * @return
     */
    public DishOverViewVO overviewDishes() {
        Integer status = 1;
        Integer sold = dishMapper.countStatus(status);
        status = 0;
        Integer discontinued = dishMapper.countStatus(status);
        return DishOverViewVO.builder()
                .sold(sold)
                .discontinued(discontinued)
                .build();
    }

DishMapper层

    /**
     * 统计菜品销售状态
     * @param status
     * @return
     */
    @Select("select count(*) from dish where status = #{status}")
    Integer countStatus(Integer status);

1.4 套餐总览的接口设计

在这里插入图片描述

WorkSpaceController层:

    /**
     * 套餐总览接口设计
     * @return
     */
    @GetMapping("/overviewSetmeals")
    @ApiOperation("菜品总览接口设计")
    public Result<SetmealOverViewVO> overviewSetmeals(){
        SetmealOverViewVO setmealOverViewVO = workspaceService.overviewSetmeals();
        return Result.success(setmealOverViewVO);
    }

WorkSpaceService层

 /**
     * 套餐总览接口
     * @return
     */
    SetmealOverViewVO overviewSetmeals();

WorkSpaceServiceImpl层

/**
     * 套餐总览接口
     * @return
     */
    public SetmealOverViewVO overviewSetmeals() {
        Integer status = 1;
        Integer sold = setmealMapper.countStatus(status);
        status = 0;
        Integer discontinued = setmealMapper.countStatus(status);
        return SetmealOverViewVO.builder()
                .sold(sold)
                .discontinued(discontinued)
                .build();
    }

SetmealMapper层

    /**
     * 查看套餐状态
     * @param status
     * @return
     */
    @Select("select count(*) from setmeal where status = #{status}")
    Integer countStatus(Integer status);

2. 导出运营数据Excel报表

在数据统计页面,有一个数据导出的按钮,点击该按钮时,其实就会下载一个文件。这个文件实际上是一个Excel形式的文件,文件中主要包含最近30日运营相关的数据。表格的形式已经固定,主要由概览数据和明细数据两部分组成。真正导出这个报表之后,相对应的数字就会填充在表格中,就可以进行存档。

在这里插入图片描述

导出的Excel报表格式:

在这里插入图片描述

业务规则

  • 导出Excel形式的报表文件
  • 导出最近30天的运营数据

Controller层: 根据接口定义,在ReportController中创建export方法

	/**
     * 导出运营数据报表
     * @param response
     */
    @GetMapping("/export")
    @ApiOperation("导出运营数据报表")
    public void export(HttpServletResponse response){
        reportService.exportBusinessData(response);
    }

Service层接口:在ReportService接口中声明导出运营数据报表的方法

	/**
     * 导出近30天的运营数据报表
     * @param response
     **/
    void exportBusinessData(HttpServletResponse response);

Service层实现类:在ReportServiceImpl实现类中实现导出运营数据报表的方法,提前将资料中的运营数据报表模板.xlsx拷贝到项目的resources/template目录中

    /**导出近30天的运营数据报表
     * @param response
     **/
    public void exportBusinessData(HttpServletResponse response) {
        LocalDate begin = LocalDate.now().minusDays(30);
        LocalDate end = LocalDate.now().minusDays(1);
        //查询概览运营数据,提供给Excel模板文件
        BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
        try {
            //基于提供好的模板文件创建一个新的Excel表格对象
            XSSFWorkbook excel = new XSSFWorkbook(inputStream);
            //获得Excel文件中的一个Sheet页
            XSSFSheet sheet = excel.getSheet("Sheet1");

            sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end);
            //获得第4行
            XSSFRow row = sheet.getRow(3);
            //获取单元格
            row.getCell(2).setCellValue(businessData.getTurnover());
            row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row.getCell(6).setCellValue(businessData.getNewUsers());
            row = sheet.getRow(4);
            row.getCell(2).setCellValue(businessData.getValidOrderCount());
            row.getCell(4).setCellValue(businessData.getUnitPrice());
            for (int i = 0; i < 30; i++) {
                LocalDate date = begin.plusDays(i);
               //准备明细数据
                businessData = workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
                row = sheet.getRow(7 + i);
                row.getCell(1).setCellValue(date.toString());
                row.getCell(2).setCellValue(businessData.getTurnover());
                row.getCell(3).setCellValue(businessData.getValidOrderCount());
                row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
                row.getCell(5).setCellValue(businessData.getUnitPrice());
                row.getCell(6).setCellValue(businessData.getNewUsers());
            }
            //通过输出流将文件下载到客户端浏览器中
            ServletOutputStream out = response.getOutputStream();
            excel.write(out);
            //关闭资源
            out.flush();
            out.close();
            excel.close();

        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 文件函数

目录 1. 文件的打开和关闭 2. 文件的顺序读写 2.1 顺序读写函数介绍 2.2读文件&#xff08;读文件只能读一次&#xff09; 2.3写文件 3. 文件的随机读写 3.1 fseek 3.2 ftell 3.3 rewind 4.文件读取结束的判定 4.1 被错误使误的 feof 我对读写的理解&#xff1a;(从…

【机器学习】决策树(Decision Tree,DT)算法介绍:原理与案例实现

前言 决策树算法是机器学习领域中的一种重要分类方法&#xff0c;它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点&#xff0c;在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理&#xff0c;包括熵和信息熵的相关概念&#xff0c;以及几种经典的…

Git分布式版本控制系统——Git常用命令(一)

一、获取Git仓库--在本地初始化仓库 执行步骤如下&#xff1a; 1.在任意目录下创建一个空目录&#xff08;例如GitRepos&#xff09;作为我们的本地仓库 2.进入这个目录中&#xff0c;点击右键打开Git bash窗口 3.执行命令git init 如果在当前目录中看到.git文件夹&#x…

el-table合计行添加按钮操作

针对于el-table中合计功能中的操作栏也可以按钮&#xff0c;并且可以添加点击事件 ElTable源码里footer部分是&#xff0c;这种方式渲染的&#xff0c;也就是 支持传递VNode。使用h第一个参数传递 组件&#xff0c;可以把组件转成VNode&#xff0c;比如现在要在右下角加一个 详…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.2 月末操作:GR/IR重组

2.6.2 月末操作&#xff1a;GR/IR重组 SAP在采购订单收货和发票校验时分别产生凭证&#xff0c;中间采用GR/IR过渡。GR即为收货&#xff0c;IR即为收票。月末&#xff0c;GR/IR的余额根据收货和收票的情况进行判断&#xff0c;转入“应付暂估”或“在途物资”&#xff0c;次月自…

CFS: A Distributed File System for Large Scale Container Platforms——论文泛读

SIGMOD 2019 Paper 分布式元数据论文阅读笔记整理 问题 随着容器化和微服务的出现&#xff0c;越来越多的应用程序转移到容器化环境中。在每组容器上运行的微服务通常独立于本地磁盘存储&#xff0c;虽然将计算与存储脱钩允许更有效的扩展容器资源&#xff0c;但也带来了对单…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

【Spring进阶系列丨第八篇】Spring整合junit 面向切面编程(AOP)详解

文章目录 一、Spring整合junit1.1、导入spring整合junit的jar1.2、在测试类上添加注解1.3、说明 二、面向切面编程(AOP)2.1、问题引出2.2、AOP2.2.1、概念2.2.2、作用2.2.3、优势2.2.4、实现方式2.2.5、专业术语2.2.5.1、连接点2.2.5.2、切入点2.2.5.3、通知/增强2.2.5.4、织入…

梯度下降小结

1.梯度下降法&#xff08;Batch Gradient Desent&#xff0c;BGD&#xff09;&#xff1a; 总体m个样本&#xff0c;损失函数&#xff1a; 计算损失函数梯度&#xff1a; 参数更新&#xff1a; 2.随机梯度下降法&#xff08;Stochastic Gradient Desent&#xff0c;SGD&#x…

GEE图表案例——不同区域各地类面积直方图分布图表(矢量面积叠加直方图图)

简介 在GEE中对不同区域面积统计的直方图绘制具体流程如下: 数据准备: 首先,需要准备用于面积统计的地理数据,可以是矢量数据,如行政边界、土地使用类型等。也可以是栅格数据,如分类结果、土地覆盖数据等。 区域划分: 根据需要统计的区域,将数据进行区域划分。可以使用…

微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索

目录 引言&#xff1a;LLMs在强化学习中的探索能力探究 研究背景&#xff1a;LLMs的在情境中学习能力及其重要性 实验设计&#xff1a;多臂老虎机环境中的LLMs探索行为 实验结果概览&#xff1a;LLMs在探索任务中的普遍失败 成功案例分析&#xff1a;Gpt-4在特定配置下的探…

基于Java+SpringBoot+Vue幼儿园管理系统(源码+文档+部署+讲解)

一.系统概述 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种教 学生信息、学生考勤、健康记录…

智慧粮仓监测系统解决方案

一、概述 粮食储备是每个国家战略物资中最为重要的一项储备&#xff1b;而随着现代化农业的快速发展以及国家经济发展的需要&#xff0c;我国粮食产量和储备量长期处于世界前列。传统的粮仓由于修建年代久远&#xff0c;可能存在着设施落后&#xff0c;实时监控不到位的现象&am…

谷粒商城实战(011 业务-异步多线程)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第193p-第p202的内容 介绍 继承Thread 继承Runnable接口 继承callable FutureTask继承的就是runnable 线程池 代表有10个线程来等待接收我们的…

高并发秒杀系统

六种手段&#xff1a; 1.页面静态化 商品秒杀页面做静态化处理&#xff0c;常规请求不会到服务端。 2.cdn内容分发 将前端资源缓存到cdn上&#xff0c;就近分发给不同区域的客户端&#xff1b; 秒杀开始后将新的js文件同步到cdn上&#xff1b; 前端加一个控制器&#xff…

看看《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制山鸢尾萼片长度和萼片宽度的小提琴图

使用MATLAB绘制鸢尾花数据集&#xff08; fisheriris&#xff09;中山鸢尾&#xff08; Iris Setosa&#xff09;的萼片长度和 萼片宽度的小提琴图。这将帮助我们更好地了解山鸢尾的这两个特征的数据分布情况&#xff0c;包括它们的 中位数、四分位范围及密度估计。这种可视化工…

老杜spring6自己笔记

精讲 【Spring视频零基础入门到高级&#xff0c;spring全套视频教程详解】 https://www.bilibili.com/video/BV1Ft4y1g7Fb/?p12&share_sourcecopy_web&vd_source833390c85450e4ff7747a5f16c02cc1e 老杜spring6网盘资料&#xff1a; 链接&#xff1a;https://pan.bai…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

CF938Div3(A-F)

A: 买n个酸奶&#xff0c;一次一瓶a元,一次买两瓶可以优惠价b元,也可以a元,问恰好买n瓶需要多少钱. void solve() {int n, a, b;cin >> n >> a >> b;int ans min(a * n, n / 2 * b n % 2 * a);cout << ans << endl; } B: 给你一个数组,问能…

pdfjs-4.0.379-dist直接打开viewer.html报错

下载了pdfjs-4.0.379-dist&#xff0c;但是直接打开viewer.html报错。解决方法&#xff1a;安装live Sever&#xff0c;并用live Server打开 打开浏览器截图 错误提示如下&#xff1a; Access to image at file:///D:/work/web-common/car-knowledge-base-web/static/pdfjs-4…