苍穹外卖--开发记录day11

目录

  • 苍穹外卖day11
    • 一:apache-Echarts简单了解
    • 二:营业额统计
    • 四:用户统计
    • 五:订单统计
    • 六:销量排名统计
  • 总结

苍穹外卖day11

一:apache-Echarts简单了解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二:营业额统计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个地方传入的是起始和终止时间,我们要再写一个接口来完成这个功能:

controller:

@GetMapping("/turnoverStatistics")
public Result turnover(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){TurnoverReportVO turnoverReportVO= reportService.turnover(begin,end);return Result.success(turnoverReportVO);
}

这里为了保证传入的时间格式和我们想要的一样,最后把时间格式使用DateTimeFormat转化一下,然后调用方法获取我们的vo对象,vo对象中有日期字符串,还有我们的营业额的数据

service:

@Override
public TurnoverReportVO turnover(LocalDate begin, LocalDate end) {List<LocalDate> dates=new ArrayList<>();while (!begin.equals(end)){dates.add(begin);begin=begin.plusDays(1);}dates.add(end);List<Long> counts=new ArrayList<>();for (LocalDate date : dates) {Long count= orderMapper.sumTurnover(date);if (count==null){count=0L;}counts.add(count);}String dateList = StringUtils.join(dates, ",");String turnoverList = StringUtils.join(counts, ",");TurnoverReportVO turnoverReportVO = TurnoverReportVO.builder().dateList(dateList).turnoverList(turnoverList).build();return turnoverReportVO;}

这里我们首先获取字符串集合,如何获取呢:我们知道首和尾,我们获取中间的只需要首每次加一天就行,直到等于尾,那么我们使用循环来获取,将日期的数据放入集合,然后我们再遍历日期集合,根据日期来获取当前的营业额,然后如果没有营业额返回的是null,最好将其转成0这样在折线图中显示的好看些,然后使用string’utils中的join方法将集合转成字符串;然后再封装好就行了;

mapper:

@Select("select sum(amount) from orders where DATE_FORMAT(order_time,'%Y-%m-%d')=#{date} and status=6 ")
Long sumTurnover(LocalDate date);

因为获取营业额,我们使用的是sum来对当天的营业额求和,然后我们数据库中的日期和我们传入的日期格式不同,我们要进行转换,然后就能进行比较了,然后营业额统计的是已完成的订单,所有对status也有限制;

四:用户统计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

controller:

@GetMapping("/userStatistics")
public Result userOver(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){UserReportVO userReportVO= reportService.userOver(begin,end);return Result.success(userReportVO);
}

一样的把日期的格式转换一下;

service:

@Override
public UserReportVO userOver(LocalDate begin,LocalDate end) {List<LocalDate>dateList=new ArrayList<>();while (!begin.equals(end)){dateList.add(begin);begin=begin.plusDays(1);}dateList.add(end);List<Long> totalUserList= new ArrayList<>();List<Long> newUserList=new ArrayList<>();for (LocalDate localDate : dateList) {Long l=  userMapper.select(localDate);Long newNumber=  userMapper.selectByCreatTime(localDate);totalUserList.add(l);newUserList.add(newNumber);}String totalUserLists = StringUtils.join(totalUserList, ",");String newUserLists = StringUtils.join(newUserList, ",");String dateLists = StringUtils.join(dateList, ",");UserReportVO userReportVO = UserReportVO.builder().totalUserList(totalUserLists).newUserList(newUserLists).dateList(dateLists).build();return userReportVO;
}

这里也是先去将日期的所有值通过循环全部加入到集合中,然后再遍历日期,查找当前日期的新增用户数和用户总数;最后再使用工具类将集合转成字符串,然后再封装到vo对象中;

mapper:

@Select("select count(*) from sky_take_out.user where date_format(create_time,'%Y-%m-%d')<=#{localDate}")
Long select(LocalDate localDate);
@Select("select count(*) from sky_take_out.user where date_format(create_time,'%Y-%m-%d') =#{localDate}")
Long selectByCreatTime(LocalDate localDate);

用户总数就是当前日期前创建所有的用户数,新增用户是当前日期创建的用户

注意:这里count的结果可以为0,不会为空的,所以不用再判断是否为空转换了

五:订单统计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

controller:

@GetMapping("/ordersStatistics")
public Result orderOver(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){OrderReportVO orderReportVO= reportService.orderOver(begin,end);return Result.success(orderReportVO);}

这里和之前一样就行。

service:

@Override
public OrderReportVO orderOver(LocalDate begin, LocalDate end) {List<LocalDate> localDates=new ArrayList<>();while (!begin.equals(end)){localDates.add(begin);begin=begin.plusDays(1);}localDates.add(end);List<Long> orderCountList=new ArrayList<>();List<Long> validOrderCountList=new ArrayList<>();for (LocalDate localDate : localDates) {Long orderCountDate=  orderMapper.count(localDate,null);orderCountList.add(orderCountDate);Long validCountDate = orderMapper.count(localDate, Orders.COMPLETED);validOrderCountList.add(validCountDate);}Long orderCount=orderMapper.count(null,null);Long validOrderCount=orderMapper.count(null,Orders.COMPLETED);Double orderCompletionRate=0.0;if (orderCount != 0) {orderCompletionRate=(double)validOrderCount/orderCount;}OrderReportVO orderReportVO = OrderReportVO.builder().orderCompletionRate(orderCompletionRate).totalOrderCount(Math.toIntExact(orderCount)).dateList(StringUtils.join(localDates, ",")).orderCountList(StringUtils.join(orderCountList, ",")).validOrderCountList(StringUtils.join(validOrderCountList, ",")).validOrderCount(Math.toIntExact(validOrderCount)).build();return orderReportVO;
}

这里要查的数据比较多一共有6个,第一个是日期的字符串,我们先将其存在集合中,同样的先通过循环把日期值传给集合;第二个和第三个是有效订单和总订单的字符串,同样的因为是求一天的所以我们遍历日期集合,然后将日期数据传入到mapper中,因为是动态sql所以我们传入的参数有区别,有效订单要限制订单的状态,必须是已完成,这个我们要传入进去,而总订单没有限制我们只需要传入日期,状态设为null就行,第四个是订单总数:我们直接将其传入mapper,然后参数都为空就是全部的订单数,第五个是有效订单数,这个呢就是要限定状态,然后就是订单的有效率是有效订单数/订单总数,这里我们获得的订单总数和有效订单数都是long的整形数组,所以我们如果直接除结果可能是0,我们可以对其中一个进行类型转换,这样结果的类型也会转换,这里设计到除法就要判断一下除数是否为0,否则会报错;然后我们将其封装到vo对象,其中的集合我们使用stringutils将其转成字符串;

mapper:

我们使用动态sql上面4句sql调用的都是同一个方法,提高方法的利用率:

</select>
<select id="count" resultType="java.lang.Long">select count(id) from orders<where><if test="localDate!=null">date_format(order_time,'%Y-%m-%d') =#{localDate}</if><if test="status!=null">and  status=#{status}</if></where>
</select>

一共就两个可变参数;

六:销量排名统计

这部分的sql是整个项目里最复杂的,涉及到聚合函数,分组查询,排序查询,分页查询。我们来看一下:

controller:

@GetMapping("/top10")
public Result salesTop10(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){SalesTop10ReportVO reportVO= reportService.salesTop10(begin,end);return Result.success(reportVO);
}

同样是接收指定格式的日期字符串,然后调用service的方法;

service:

@Override
public SalesTop10ReportVO salesTop10(LocalDate begin, LocalDate end) {List<String> names = ordeiDetailMapper.reportName(begin, end);List<Long> numbers = ordeiDetailMapper.reportNumber(begin, end);String name = StringUtils.join(names, ",");String number = StringUtils.join(numbers, ",");SalesTop10ReportVO reportVO = SalesTop10ReportVO.builder().nameList(name).numberList(number).build();return reportVO;
}

这里service层我写的就比较简单了,通过两个sql一个获取菜品名称,一个获取菜品的销量;然后再将集合转成字符串,再封装成vo对象传给controller;

mapper:

@Select("select d.name  from sky_take_out.order_detail d left  join sky_take_out.orders o on o.id = d.order_id" +" where date_format(o.order_time,'%Y-%m-%d')>=#{begin} and date_format(o.order_time,'%Y-%m-%d')<=#{end} and o.status=5 group by d.name order by sum(d.number) desc limit 0,10")
List<String> reportName(LocalDate begin, LocalDate end);
@Select("select sum(d.number) from sky_take_out.order_detail d left  join sky_take_out.orders o on o.id = d.order_id" +" where date_format(o.order_time,'%Y-%m-%d')>=#{begin} and date_format(o.order_time,'%Y-%m-%d')<=#{end} and o.status=5 group by d.name order by sum(d.number) desc limit 0,10")
List<Long> reportNumber(LocalDate begin, LocalDate end);

大体思路是这样的,我们首先要查询订单详情表,因为只有那里有菜品或者套餐的信息,然后因为我们要返回的是某个时间段的销量,而订单详情表没有日期相关信息,我们只能通过逻辑外键来联系订单表获取下单时间,同时订单的状态是已完成的才能计入销量,所以我们首先要多表查询,然后因为整个订单详情表中菜品的可以有多条数据,我们统计的是每个菜品的销量,所以我们按照菜品的名称进行分组,然后我们还要查询销量排名前十的所以首先要进行排序,排序的依据就是每组的number求和,前十我们就是要进行分页查询;这就是大体的思路。


总结

今天对前端的技术:echarts进行了简单了解,然后进行了营业额统计,用户统计,订单统计,还有top10的排名统计

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析C++游戏开发:从基础到高级应用

目录 深入解析C游戏开发&#xff1a;从基础到高级应用 目录 为何选择C进行游戏开发 高性能与高效率 强大的内存管理 广泛的库和框架支持 丰富的社区资源 C游戏开发基础 C基础知识 面向对象编程 常用设计模式 游戏开发流程 设计与规划 选择引擎和工具 架构设计 …

Data+AI━━隐私都没了,还不懂用户画像吗?

DataAI━━隐私都没了&#xff0c;还不懂用户画像吗&#xff1f; 前言用户画像是什么&#xff1f;用户画像的应用场景DataAI下如何构建用户画像 前言 数据驱动的时代&#xff0c;用户画像已经成为商业和技术领域的热门话题。无论你在电商、金融、广告还是社交媒体&#xff0c;…

从零开始学python必看,最强“Python编程三剑客(pdf)”

目录 三剑客PDF传送门&#xff1a;三剑客 第一本&#xff1a;《Python编程&#xff1a;从入门到实践》 1.1《Python编程&#xff1a;从入门到实践》第一部分&#xff1a;基础知识 1.2《Python编程&#xff1a;从入门到实践》第二部分&#xff1a;项目 第二本&#xff1a;《…

css模糊遮罩效果

原图&#xff1a; 模糊后的图片&#xff1a; html: <div class"bj"><div class"mengban"></div> </div> css: .bj {width: 750rpx;height: 643rpx;background-image:url(https://onlinekc.a.hlidc.cn/uploads/20241023/9e552fc…

大话网络协议:HTTPS协议和HTTP协议有何不同?为什么HTTPS更安全

大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。 理解HTTP协议 要解释 https 协议,当…

FPGA采集adc,IP核用法,AD驱动(上半部分)

未完结&#xff0c;明天补全 IP核&#xff1a;集成的一个现有的模块 串口写好后基本不会再修改串口模块内部的一些逻辑&#xff0c;将串口.v文件添加进来&#xff0c;之后通过他的上层的接口去对他进行使用&#xff0c;所以我们打包IP&#xff0c;之后就不用去添加源文件了&a…

无人机和鸟数据集,无人机数据集+鸟数据集 yolo格式,可以直接用于模型的训练。7000张,图片自己打的标签 yolov5-yolov10通用

无人机和鸟数据集&#xff0c;无人机数据集鸟数据集 yolo格式&#xff0c;可以直接用于模型的训练。7000张&#xff0c;图片自己打的标签 yolov5-yolov10通用 无人机及鸟类目标检测数据集规模&#xff1a; 总图像数量&#xff1a;约7,000张类别&#xff1a;2类检测目标 Drone&…

从一个简单的计算问题,看国内几个大语言模型推理逻辑能力

引言 首先&#xff0c;来看问题&#xff1a; 123456*987654等于多少&#xff0c;给出你计算的过程。 从openai推出chatgpt以来&#xff0c;大模型发展的很快&#xff0c;笔者也经常使用免费的大语言模型辅助进行文档编写和编码工作。大模型推出时间也好久了&#xff0c;笔者想…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

易控天地|易控天地标准版3.0(EconTNT STD3.0)安装记录

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 以前使用过的组态软件WinCC、杰控、MCGS、组态王、KingSCADA、KingFunsion等&#xff0c; 关于易控天地去年在现场见到过&#xff0c;接下来安装体验下易控天地&#xff1b; 以下为安装笔记。 01 解压缩 下载完安装…

【YOLO模型】(1)--YOLO是什么

一、什么是YOLO YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;由Joseph Redmon等人于2016年提出。 1. 核心思想 它的核心思想是将目标检测问题转化为一个回归问题&#xff0c;通过一个神经网络直接预测目标的类别和位置。 …

[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)

前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器&#xff0c;通过yum安装软件&#xff0c;可以自动解决包依赖的问题&#xff0c;免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系&#xff0c;默认为mirrorlist.centos.org&#xf…

1208. 尽可能使字符串相等

Problem: 1208. 尽可能使字符串相等 题目描述 给定两个相同长度的字符串 s 和 t&#xff0c;将字符串 s 转换为字符串 t 需要消耗开销&#xff0c;开销是两个字符的 ASCII 码差值的绝对值。还有一个最大预算 maxCost&#xff0c;我们需要在这个预算范围内&#xff0c;找到 s 中…

时钟分频电路之Innovus自动产生的_clock_gen skew group盘点

我们在查看时钟树综合的log时会发现工具会自动生成一些skew group&#xff0c;这些skew group的名字都是以_clock_gen开头的。 skew_group _clock_gen_CLK_CORE_PLL_clk_reg_1/func: insertion delay [min0.020, max0.064, avg0.038, sd0.022], skew [0.045 vs 0.050], 100% {…

SSL证书有免费的吗?在哪里可以申请到?——附带申请步骤

申请免费的SSL证书通常可以通过以下几个步骤完成&#xff0c;这里以使用JoySSL为例进行说明&#xff0c;因为JoySSL提供了一个免费、自动化和开放的证书颁发机构&#xff08;CA&#xff09;来促进网站从HTTP向HTTPS的转换。 步骤&#xff1a; 选择工具&#xff1a; 访问JoySSL…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

汽车免拆诊断案例 | 2019 款奥迪 A6L 车行驶中偶发熄火

故障现象  一辆2019款奥迪A6L车&#xff0c;搭载2.0T发动机&#xff0c;累计行驶里程约为9万km。车主反映&#xff0c;车辆行驶中偶发熄火&#xff0c;故障频率较高。 故障诊断  接车后试车&#xff0c;起动发动机&#xff0c;可以正常起动着机。使用故障检测仪检测&#x…

Vue项目的创建

安装Vue工具 Vue CLI Vue CLI Vue.js 开发的标准工具&#xff0c;Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 npm install -g vue/cli安装之后&#xff0c;你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue&#xff0c;看看是否展示出了一份所有可用命令的…

基于SSM邮票鉴赏系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;邮票信息管理&#xff0c;邮票分类管理&#xff0c;文章信息管理&#xff0c;系统管理&#xff0c;个人分享管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

【正点原子K210连载】第四十八章 自学习分类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十八章 自学习分类实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了MNIST的手写数据识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的自学习分类。通过本章的学习&#xff0c;读者将学习到自学习分类应用在CanMV上的实现。 本章分为如下几个小节&#xf…