当前位置: 首页 > news >正文

【苍穹外卖-day11】

《苍穹外卖-day11》

0. 今日总结

  1. 完成了营业额统计功能开发
  2. 完成了用户统计功能开发
  3. 完成了订单统计功能开发
  4. 完成了销量排名top统计功能开发

1. 营业额统计

1.1 需求分析和设计

  • 业务规则

    1. 营业额指订单状态为已完成的订单金额合计

    2. 基于可视化报表的折线图展示营业额数据,x轴为日期,轴为营业额

    3. 根据时间选择区间,展示每天的营业额数据

  • 接口设计

1.2 代码开发

  • VO设计

  • controller

    1. 用TurnoverReportVO接收数据
    2. 用LocalDate接收前端传来的begin和end,表示统计的开始日期和结束日期,并用DateTimeFormat注解将日期转换为固定的格式
    3. 调用service层接口,将begin和end传入,并进行查询
  • service

    1. 创建List集合,泛型为LocalDate,用于存放日期数据
    2. 通过循环以及plusDays方法对begin递增1天,并将每天的数据add到dateList集合中
    3. 创建List集合,泛型为Double,用于存放营业额
    4. 遍历date,逐天统计
    5. 调用LocalDateTime.of方法,获取对应date的开始时间和结束时间
    6. 创建Map集合,用于一次性将begin,end,status传给Mapper
    7. 调用mapper层接口,查询begin-end内每一天的营业额之和
    8. 判断,若营业为空,则置为0,否则为查询的值
    9. 将营业额add到turnoverList中
    10. 返回一个新的TurnoverReportVO对象,设置dateList和turnoverList值,按前端的要求,用","分隔并将值用apache的StringUtils工具类的join转化为字符串
  • mapper

    根据开始时间和结束时间以及状态值查询营业额

1.3 功能测试

2. 用户统计

2.1 需求分析

2.2 代码开发

  • VO设计

思路和营业额统计完全相同,不赘述代码

2.3 功能测试

3. 订单统计

3.1 需求分析

  • 业务规则

    1. 有效订单指状态为“已完成”的订单
    2. 基于可视化报表的折线图展示订单数据,x轴为日期,Y轴为订单数量
    3. 根据时间选择区间,展示每天的订单总数和有效订单数
    4. 展示所选时间区间内的有效订单数、总订单数、订单完成率,订单完成率=有效订单数/总订单数*100%
  • 接口设计

3.2 代码开发

  • VO接口设计

  • controller

    1. 接收日期数据
    2. 将日期传给service层,并返回orderReportVO对象
  • service

    publicOrderReportVOorderReport(LocalDatebegin,LocalDateend){//封装日期集合List<LocalDate>dateTimeList=newArrayList<>();dateTimeList.add(begin);while(!begin.equals(end)){begin=begin.plusDays(1);dateTimeList.add(begin);}//查询每天订单数据doubleorderCompletionRate;//有效订单率List<Double>totalOrdersList=newArrayList<>();//订单数列表List<Double>totalCompletionOrdersList=newArrayList<>();//有效订单数列表doubletotalOrders=0;//订单总数doubletotalCompletionOrders=0;//有效订单总数for(LocalDatedate:dateTimeList){doubletotalOrder;//订单总数doubletotalCompletionOrder;//有效订单总数LocalDateTimebeginTime=LocalDateTime.of(date,LocalTime.MIN);LocalDateTimeendTime=LocalDateTime.of(date,LocalTime.MAX);Mapmap=newHashMap();map.put("begin",beginTime);map.put("end",endTime);map.put("status",null);totalOrder=orderMapper.getByBeginAndEnd(map);//查询订单总数map.put("status",Orders.COMPLETED);totalCompletionOrder=orderMapper.getByBeginAndEnd(map);//查询有效订单数totalOrdersList.add(totalOrder);totalCompletionOrdersList.add(totalCompletionOrder);totalOrders+=totalOrder;totalCompletionOrders+=totalCompletionOrder;}orderCompletionRate=totalCompletionOrders/totalOrders;returnOrderReportVO.builder().dateList(StringUtils.join(dateTimeList,",")).totalOrderCount((int)totalOrders).validOrderCount((int)totalCompletionOrders).orderCountList(StringUtils.join(totalOrdersList,",")).validOrderCountList(StringUtils.join(totalCompletionOrdersList,",")).orderCompletionRate(orderCompletionRate).build();}
    1. 封装日期集合
    2. 查询每天订单数据
      1. 查询status = null的数据,表示订单总数,并添加到list集合
      2. 查询status = 5的数据,表示有效订单总数,并添加到list集合
      3. 累加到时间段内订单总数和时间段内有效订单总数
    3. 计算有效订单率
  • mapper

    统计时间段内对应status的数据

3.3 功能测试

4. 销量排名Top10

4.1 需求分析

  • 业务规则

    1. 根据时间选择区间,展示销量前10的商品(包括菜品和套餐)
    2. 基于可视化报表的柱状图降序展示商品销量
    3. 此处的销量为商品销售的份数
  • 接口设计

4.2 代码开发

  • VO接口设计

  • controller

    1. 接收日期数据
    2. 将日期传给service层,并返回SalesTop10ReportVO对象
  • service

    1. 多表查询,获取订单数和订单名称

    2. 利用Stream流和StringUtils将数据转换为String类型的数据

      StringnameList=StringUtils.join(goodsSalesDTOList.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()),",");
      1. goodsSalesDTOList.stream()获取Stream流
      2. .map(GoodsSalesDTO::getName),转换流中的数据类型,转换为getName的返回值类型
      3. 通过collect收集流,转化为list类型
  • mapper

    多表查询,根据名字和总数分组并排序

4.3 功能测试

http://www.cnnetsun.cn/news/4669.html

相关文章:

  • Speechless终极指南:三分钟掌握微博内容永久备份技巧 [特殊字符][特殊字符]
  • 通达信缠论分析插件使用指南
  • STM32编程必备:stlink工具完全使用指南
  • 三星固件管理的终极解决方案:跨平台工具完整教程
  • CherryUSB嵌入式USB协议栈终极指南:5大核心优势与实战部署技巧
  • 如何轻松实现Minecraft跨平台存档转换:Chunker完整指南
  • 266. Java 集合 - ArrayList vs LinkedList 内存使用深度剖析
  • 快手可图与华中科技大学提出VGT, 让任意 VLM 摇身一变成为 SOTA 图像生成模型!
  • Kingfisher在macOS Sequoia中的滚动冲突解决方案技术指南
  • 为什么顶尖团队都在关注PHP 8.6的协程调度改进?
  • LAMP项目部署——8day
  • Path of Building PoE2完全掌握手册:从入门到精通的实用指南
  • 超实用macOS安装包下载神器:告别复杂命令的终极解决方案
  • 如何快速搭建专业电商后台:mall-admin-web完整使用指南
  • ChatDev终极指南:5分钟快速上手AI多智能体软件开发平台
  • Muview2磁学数据可视化:5分钟掌握3D磁畴分析神器
  • Flutter微信项目开发实战:构建跨平台即时通讯应用
  • 快速上手VibeVoice-1.5B语音生成模型
  • Sketch Palettes终极指南:让色彩管理变得简单高效 ✨
  • 终极P2P传输方案:为什么iroh是WebRTC的完美替代品
  • 【C++】Scoop 包管理器与 MinGW 工具链详解
  • Wan2.2-T2V-A14B为盲人用户提供触觉反馈视频转换设想
  • LabelPlus漫画翻译工具:如何用这款神器让翻译效率翻倍
  • LangChain教育革命:5大核心技术重塑智能学习新时代
  • 5分钟搞定NAT穿透:手把手教你构建游戏加速专用网络
  • 如何快速掌握Qwen3-32B-MLX-8bit:AI大模型双模式切换的完整指南
  • DeepFlow可观测性平台终极指南:从零基础到实战部署
  • 生物信息学甲基化分析实战指南(R语言全流程精讲)
  • Docker一键部署Flatnas,比Sun-Panel更优雅
  • docker一键部署 Homarr 导航页