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

苍穹外卖(数据统计-图形报表)

数据统计(图形报表)

营业额统计

接口设计

代码开发

设计对应的VO

创建ReportController

创建ReportService接口,声明getTurnover方法

创建ReportServiceImpl实现类,实现getTurnover方法

在OrderMapper接口声明sumByMap方法

在OrderMapper.xml文件中编写动态SQL

功能测试

用户统计

接口设计

代码开发

设计VO

在ReportController中创建userStatistics方法

在ReportService接口中声明getUserStatistics方法

在ReportServiceImpl实现类中实现getUserStatistics方法

在UserMapper接口中声明countByMap方法

在UserMapper.xml文件中编写动态SQL

功能测试

订单统计

接口设计

代码开发

设计VO

在ReportController中根据订单统计接口创建orderStatistics方法

在ReportService接口中声明getOrderStatistics方法

在ReportServiceImpl实现类中实现getOrderStatistics方法

在OrderMapper接口中声明countByMap方法

在OrderMapper.xml文件中编写动态SQL

功能测试

销量排名Top10

接口设计

代码开发

设计VO

在ReportController中根据销量排名接口创建top10方法

在ReportService接口中声明getSalesTop10方法

在ReportServiceImpl实现类中实现getSalesTop10方法

在OrderMapper接口中声明getSalesTop10方法

在OrderMapper.xml文件中编写动态SQL

功能测试


营业额统计

接口设计

代码开发

设计对应的VO

初始代码已提供

创建ReportController

创建ReportService接口,声明getTurnover方法

创建ReportServiceImpl实现类,实现getTurnover方法

在OrderMapper接口声明sumByMap方法

/** * 根据动态条件统计营业额数据 * @param map * @return */ Double sumByMap(Map map);

在OrderMapper.xml文件中编写动态SQL

功能测试

用户统计

接口设计

代码开发

设计VO

初始代码已提供

在ReportController中创建userStatistics方法

/** * 用户统计 * @param begin * @param end * @return */ @GetMapping("/userStatistics") @ApiOperation("用户统计") public Result<UserReportVO> userStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { log.info("用户数据统计, begin:{}, end:{}", begin, end); return Result.success(reportService.getUserStatistics(begin, end)); }

在ReportService接口中声明getUserStatistics方法

/** * 统计指定时间区间内的用户数据 * @param begin * @param end * @return */ UserReportVO getUserStatistics(LocalDate begin, LocalDate end);

在ReportServiceImpl实现类中实现getUserStatistics方法

需要注入userMapper对象

/** * 统计指定时间区间内的用户数据 * @param begin * @param end * @return */ @Override public UserReportVO getUserStatistics(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); } //当前集合用于存放从begin到end的每一天的新增用户数 select count(id) from user where create_time<? and create_time>? List<Integer> newUserList=new ArrayList<>(); //当前集合用于存放从begin到end的每一天的总用户数 select count(id) from user where create_time<=? 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("end", endTime); //总用户数量 Integer totalUser = userMapper.countByMap(map); //新增用户数量 map.put("begin", beginTime); Integer newUser = userMapper.countByMap(map); totalUserList.add(totalUser); newUserList.add(newUser); } return UserReportVO .builder() .dateList(StringUtils.join(dateList, ",")) .totalUserList(StringUtils.join(totalUserList, ",")) .newUserList(StringUtils.join(newUserList, ",")) .build(); }

在UserMapper接口中声明countByMap方法

/** * 根据动态条件统计用户数量 * @param map * @return */ Integer countByMap(Map map);

在UserMapper.xml文件中编写动态SQL

<select id="countByMap" resultType="java.lang.Integer"> select count(id) from sky_take_out.user <where> <if test="begin != null"> and create_time &gt;= #{begin} </if> <if test="end != null"> and create_time &lt;= #{end} </if> </where> </select>

功能测试

订单统计

接口设计

代码开发

设计VO

初始代码以提供

package com.sky.vo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @Builder @NoArgsConstructor @AllArgsConstructor public class OrderReportVO implements Serializable { //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 private String dateList; //每日订单数,以逗号分隔,例如:260,210,215 private String orderCountList; //每日有效订单数,以逗号分隔,例如:20,21,10 private String validOrderCountList; //订单总数 private Integer totalOrderCount; //有效订单数 private Integer validOrderCount; //订单完成率 private Double orderCompletionRate; }

在ReportController中根据订单统计接口创建orderStatistics方法

ctrl+n可以直接搜索类

/** * 订单统计 * * @param begin * @param end * @return */ @GetMapping("/ordersStatistics") @ApiOperation("订单统计") public Result<OrderReportVO> orderStatistics( @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { log.info("订单数据统计, begin:{}, end:{}", begin, end); return Result.success(reportService.getOrderStatistics(begin, end)); }

在ReportService接口中声明getOrderStatistics方法

/** * 统计指定时间区间内的订单数据 * @param begin * @param end * @return */ OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end);

在ReportServiceImpl实现类中实现getOrderStatistics方法

这里将查询每一天的订单总数和有效数量的代码单独提取到了getOrderCount方法中

/** * 统计指定时间区间内的订单数据 * * @param begin * @param end * @return */ @Override public OrderReportVO getOrderStatistics(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); } //当前集合用于存放从begin到end的每一天的订单总数 List<Integer> orderCountList = new ArrayList<>(); //当前集合用于存放从begin到end的每一天的有效订单数 List<Integer> validOrderCountList = new ArrayList<>(); //遍历dateList,获取每一天的有效订单数、订单总数 for (LocalDate date : dateList) { //查询每天的订单总数select count(id) from orders where order_time>? and order_time<? LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); Integer orderCount = getOrderCount(beginTime, endTime, null); //查询每天的有效订单数select count(id) from orders where order_time>? and order_time<? and status=5 Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED); orderCountList.add(orderCount); validOrderCountList.add(validOrderCount); } //计算时间区间内的订单总数 Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get(); //计算时间区间内的有效订单数 Integer validOrderCount = validOrderCountList.stream().reduce(Integer::sum).get(); //计算有效订单率 Double orderCompletionRate = 0.0; if (totalOrderCount != 0) { orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount * 100; } return OrderReportVO.builder() .dateList(StringUtils.join(dateList, ",")) .orderCountList(StringUtils.join(orderCountList, ",")) .validOrderCountList(StringUtils.join(validOrderCountList, ",")) .totalOrderCount(totalOrderCount) .validOrderCount(validOrderCount) .orderCompletionRate(orderCompletionRate) .build(); } /** * 根据条件统计订单数量 * * @param begin * @param end * @param status * @return */ private Integer getOrderCount(LocalDateTime begin, LocalDateTime end, Integer status) { Map map = new HashMap(); map.put("begin", begin); map.put("end", end); map.put("status", status); return orderMapper.countByMap(map); }

在OrderMapper接口中声明countByMap方法

/** * 根据动态条件统计订单数量 * @param map * @return */ Integer countByMap(Map map);

在OrderMapper.xml文件中编写动态SQL

<select id="countByMap" resultType="java.lang.Integer"> select count(id) from sky_take_out.orders <where> <if test="begin != null"> and order_time &gt; #{begin} </if> <if test="end != null"> and order_time &lt; #{end} </if> <if test="status != null"> and status = #{status} </if> </where> </select>

功能测试

销量排名Top10

接口设计

代码开发

设计VO

初始代码已提供

package com.sky.vo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @Builder @NoArgsConstructor @AllArgsConstructor public class SalesTop10ReportVO implements Serializable { //商品名称列表,以逗号分隔,例如:鱼香肉丝,宫保鸡丁,水煮鱼 private String nameList; //销量列表,以逗号分隔,例如:260,215,200 private String numberList; }

在ReportController中根据销量排名接口创建top10方法

/** * 销售Top10 * @param begin * @param end * @return */ @GetMapping("/top10") @ApiOperation("销售Top10") public Result<SalesTop10ReportVO> top10( @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { log.info("销售Top10数据统计, begin:{}, end:{}", begin, end); return Result.success(reportService.getSalesTop10(begin, end)); }

在ReportService接口中声明getSalesTop10方法

/** * 统计指定时间区间内的销售排行榜top10 * @param begin * @param end * @return */ SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end);

在ReportServiceImpl实现类中实现getSalesTop10方法

/** * 统计指定时间区间内的销售排行榜top10 * @param begin * @param end * @return */ @Override public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) { LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN); LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX); List<GoodsSalesDTO> salesTop10 = orderMapper.getSaleTop10(beginTime, endTime); List<String> names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()); String nameList = StringUtils.join(names, ","); List<Integer> numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList()); String numberList = StringUtils.join(numbers, ","); //封装返回结果数据 return SalesTop10ReportVO .builder() .nameList(nameList) .numberList(numberList) .build(); }

在OrderMapper接口中声明getSalesTop10方法

/** * 统计指定时间区间内的销量排名前10 * @param begin * @param end * @return */ List<GoodsSalesDTO> getSaleTop10(LocalDateTime begin,LocalDateTime end);

在OrderMapper.xml文件中编写动态SQL

<select id="getSaleTop10" resultType="com.sky.dto.GoodsSalesDTO"> select od.name,sum(od.number) number from sky_take_out.order_detail od,sky_take_out.orders o where od.order_id = o.id and o.status=5 <if test="begin != null"> and o.order_time &gt; #{begin} </if> <if test="end != null"> and o.order_time &lt; #{end} </if> group by od.name order by number desc limit 10 </select>

功能测试

http://www.jsqmd.com/news/468413/

相关文章:

  • 苍穹外卖(数据统计–Excel报表)
  • 蓝桥杯 整数变换
  • OpenTelemetry Operator避坑指南:从TLS证书配置到Sidecar自动注入的全流程解析
  • 算法训练-模拟
  • Java(API与算法篇)
  • 量化交易策略的运行
  • 蓝桥杯 定时任务
  • 医疗影像分割实战:从原理到代码,全面解析surface-distance评估指标
  • 蓝桥杯 火车运输
  • ArcGIS实战:从XYZ坐标点到等高线的全流程解析
  • OpenVINO模型量化实战:用NNCF搞定PaddleOCR文本检测模型(附完整代码)
  • 为什么消息队列不像数据库那样可以配置读写分离?
  • Halcon 3D视觉实战:从点云预处理到精准定位的完整流程解析
  • 蓝桥杯 最大区间
  • 大端小端检测实战:5分钟用联合体写出CPU字节序测试工具(附结构体对比)
  • 量化交易系统技术方案设计
  • pr 3dmax ae au 达芬奇等各类安装包需要的自提,
  • swift- Swift中常见的面试题
  • Electron-build进阶技巧:利用NSIS脚本实现安装包注册表操作与文件管理
  • TL5000BCJ激光器参数解析与常见应用场景(含线宽与功率优化技巧)
  • Kafka topic 中的 partition 数据倾斜问题
  • 点云配准避坑指南:ICP算法中点到点/面/线的5个实战误区
  • Protobuf编码实战:从TLV到ZigZag,手把手解析二进制流
  • SDC命令实战:get_lib_cells在Design Compiler中的高效查询技巧
  • 智能基座智享未来ep01:openGauss使用指南
  • 我不允许有人不知道 Win11 专业版密钥,简易 Win11 专业版密钥
  • 1.26 PowerBI数据刷新实战:从报错定位到高效修复
  • OGG经典模式下不停机同步新增表的完整流程(含SCN号获取与数据导出导入)
  • 深入解析RTL8111H网络指示灯驱动修改实战
  • 282个企业级skills,108个本体|滴普科技全新升级发布Deepexi企业大模型与DeepexiOS AI级企业操作系统