苍穹外卖项目实战(day11-2)-记录实战教程、问题的解决方法以及完整代码
本文介绍了两个订单统计功能的实现:1)订单统计功能,通过ReportController接收日期范围,调用ReportService统计指定时间段内的订单总数、有效订单数及完成率,涉及日期处理、数据库查询和计算逻辑;2)销量Top10查询功能,统计指定时间段内销量最高的10个商品,通过关联订单表和订单明细表,按商品名称分组统计销量并排序。两个功能均采用分层架构,包含Controller、Servi
目录
(4)订单统计
4-1、代码开发
1、ReportController
位置:sky-server/src/main/java/com/sky/controller/admin/ReportController.java
代码:
/**
* 订单统计
* @param begin
* @param end
* @return
*/
@GetMapping("/ordersStatistics")
@ApiOperation(value = "订单统计")
private Result<OrderReportVO> OrdersStatistics(
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
log.info("获取{}到{}订单统计数据:",begin, end);
OrderReportVO ordersStatistics = reportService.OrdersStatistics(begin, end);
return Result.success(ordersStatistics);
}
示意图:

2、ReportService
位置:sky-server/src/main/java/com/sky/service/ReportService.java
代码:
/**
* 获取订单统计数据
* @param begin
* @param end
* @return
*/
OrderReportVO OrdersStatistics(LocalDate begin, LocalDate end);
示意图:

3、ReportServiceImpl
位置:sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java
代码:
/**
* 获取指定时间段内的订单统计数据
* @param begin
* @param end
* @return
*/
public OrderReportVO OrdersStatistics(LocalDate begin, LocalDate end) {
//1、获取日期列表
List<LocalDate> dateList = new ArrayList();
dateList.add(begin);
while (!begin.equals(end)){
begin = begin.plusDays(1);
dateList.add(begin);
}
//2、获取每天订单总数列表
List<Integer> totalOrderCountList = new ArrayList();
//3、获取每天有效订单总数列表
List<Integer> validOrderCountList = new ArrayList();
for (LocalDate date : dateList) {
// 由于数据库的对应的字段名为order_time形式是年月日时分秒,所以需要将LocalDate转换为LocalDateTime
LocalDateTime starTime = LocalDateTime.of(date, LocalTime.MIN);// 开始时间, 00:00:00
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);// 结束时间, 23:59:59
//2、获取每天订单总数
//select count(id) from orders where order_time >= #{startTime} and order_time <= #{endTime}
Integer totalOrderCount = orderMapper.countOrdersByTime(starTime, endTime);
totalOrderCountList.add(totalOrderCount);
Map map = new HashMap();
map.put("begin", starTime);
map.put("end", endTime);
map.put("status", Orders.COMPLETED);// 订单状态为已完成
//3、获取每天有效订单总数
//select count(id) from orders where status = 5 and order_time >= #{startTime} and order_time <= #{endTime}
Integer validOrderCount = orderMapper.countOrdersByStatusAndTime(map);
validOrderCountList.add(validOrderCount);
}
//4、计算订单完成率
//计算时间段内的订单总数
Integer totalOrderCount = totalOrderCountList.stream().reduce(0, Integer::sum);
//计算时间段内的有效订单总数
Integer validOrderCount = validOrderCountList.stream().reduce(0, Integer::sum);
//计算订单完成率
Double orderCompletionRate = 0.0;
if(totalOrderCount!= 0){
orderCompletionRate = (double) validOrderCount / totalOrderCount;
}
OrderReportVO build =
OrderReportVO.builder()
.dateList(StringUtil.join(",", dateList))//日期列表
.orderCountList(StringUtil.join(",", totalOrderCountList))//订单总数列表
.validOrderCountList(StringUtil.join(",", validOrderCountList))//有效订单总数列表
.totalOrderCount(totalOrderCount)//总订单数
.validOrderCount(validOrderCount)//有效订单数
.orderCompletionRate(orderCompletionRate)//订单完成率
.build();
return build;
}
示意图:

4、OrderMapper
位置:sky-server/src/main/java/com/sky/mapper/OrderMapper.java
代码:
/**
* 根据ID统计每天订单数量
* @return
*/
Integer countOrdersByTime(LocalDateTime begin,LocalDateTime end);
/**
* 根据状态(已完成)统计每天订单数量
* @return
*/
Integer countOrdersByStatusAndTime(Map map);
示意图:

5、OrderMapper.xml
位置:sky-server/src/main/resources/mapper/OrderMapper.xml
代码:
<select id="countOrdersByTime" resultType="java.lang.Integer">
select count(id) from orders
<where>
<if test="begin != null">
and order_time >= #{begin}
</if>
<if test="end != null">
and order_time <= #{end}
</if>
</where>
</select>
<select id="countOrdersByStatusAndTime" resultType="java.lang.Integer">
select count(id) from orders
<where>
<if test="status != null">
and status = #{status}
</if>
<if test="begin != null">
and order_time >= #{begin}
</if>
<if test="end != null">
and order_time <= #{end}
</if>
</where>
</select>
示意图:

4-2、测试


(5)查询销量排名top10接口
5-1、需求分析


5-2、代码开发
1、ReportController
位置:sky-server/src/main/java/com/sky/controller/admin/ReportController.java
代码:
/**
* 销量排名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);
return Result.success(reportService.getSalesTop10(begin,end));
}
示意图:

2、ReportService
位置:sky-server/src/main/java/com/sky/service/ReportService.java
代码:
/**
* 统计指定时间区间内的销量排名前10
* @param begin
* @param end
* @return
*/
SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end);
示意图:

3、ReportServiceImpl
位置:sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java
代码:
/**
* 统计指定时间区间内的销量排名前10
* @param begin
* @param end
* @return
*/
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.getSalesTop10(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();
}
示意图:

4、OrderMapper
位置:sky-server/src/main/java/com/sky/mapper/OrderMapper.java
代码:
/**
* 统计指定时间区间内的销量排名前10
* @param begin
* @param end
* @return
*/
List<GoodsSalesDTO> getSalesTop10(LocalDateTime begin, LocalDateTime end);
示意图:

5、OrderMapper.xml
位置:sky-server/src/main/resources/mapper/OrderMapper.xml
代码:
<select id="getSalesTop10" resultType="com.sky.dto.GoodsSalesDTO">
select od.name,sum(od.number) number
from order_detail od,orders o
where od.order_id = o.id and o.status = 5
<if test="begin != null">
and o.order_time > #{begin}
</if>
<if test="end != null">
and o.order_time < #{end}
</if>
group by od.name
order by number desc
limit 0,10
</select>
示意图:

5-3、测试


火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)