文章目录
概要
订单统计通过一个折现图来展现,折线图上有两根线,这根蓝色的线代表的是订单总数,而下边这根绿色的线代表的是有效订单数,指的就是状态是已完成的订单就属于有效订单,分别反映的是每一天的数据。上面还有3个数字,分别是订单总数、有效订单、订单完成率,它指的是整个时间区间之内总的数据。
原型图:
需求分析以及接口设计
业务规则:
-
有效订单指状态为 “已完成” 的订单
-
基于可视化报表的折线图展示订单数据,X轴为日期,Y轴为订单数量
-
根据时间选择区间,展示每天的订单总数和有效订单数
-
展示所选时间区间内的有效订单数、总订单数、订单完成率,订单完成率 = 有效订单数 / 总订单数 * 100%
技术细节
1.Controller层:
/**
* 订单统计
* @param begin
* @param end
* @return
*/
@ApiOperation("订单统计")
@GetMapping("/ordersStatistics")
public Result<OrderReportVO> ordersStatistics(
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end){
log.info("订单统计:{},{}",begin,end);
OrderReportVO orderReportVO = reportService.ordersStatistics(begin,end);
return Result.success(orderReportVO);
}
2.Service层:
public OrderReportVO ordersStatistics(LocalDate begin, LocalDate end) {
//日期
List<LocalDate> dateList = getDateList(begin, end);
String dateListStr = StringUtils.join(dateList, ",");
//订单数列表
ArrayList<Integer> countOrdersList = new ArrayList<>();
for (LocalDate date : dateList) {
LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
HashMap<String, Object> map = new HashMap<>();
map.put("begin",beginTime);
map.put("end",endTime);
Integer countOrders = orderMapper.countOrdersByMap(map);
countOrders = countOrders == null ? 0 : countOrders;
countOrdersList.add(countOrders);
}
String countOrdersListStr = StringUtils.join(countOrdersList, ",");
//有效订单列表
ArrayList<Integer> validOrderCountList = new ArrayList<>();
for (LocalDate date : dateList) {
LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
HashMap<String, Object> map = new HashMap<>();
map.put("begin",beginTime);
map.put("end",endTime);
map.put("status", Orders.COMPLETED);
Integer countValidOrders = orderMapper.countOrdersByMap(map);
countValidOrders = countValidOrders == null ? 0 : countValidOrders;
validOrderCountList.add(countValidOrders);
}
//订单总数
HashMap<String, Object> map = new HashMap<>();
Integer totalOrderCount = orderMapper.countOrdersByMap(map);
totalOrderCount = totalOrderCount == null ? 0 : totalOrderCount;
//有效订单数
HashMap<String, Object> validMap = new HashMap<>();
validMap.put("status",Orders.COMPLETED);
Integer validOrderCount = orderMapper.countOrdersByMap(validMap);
String validOrderCountListStr = StringUtils.join(validOrderCountList, ",");
//订单完成率 = 有效订单数 / 总订单数 * 100%
Double orderCompletionRate = 0.0;
if(totalOrderCount != 0){
orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;
}
return OrderReportVO.builder()
.dateList(dateListStr)
.orderCountList(countOrdersListStr)
.validOrderCountList(validOrderCountListStr)
.totalOrderCount(totalOrderCount)
.validOrderCount(validOrderCount)
.orderCompletionRate(orderCompletionRate)
.build();
}
3.Mapper层
<select id="countOrdersByMap" resultType="java.lang.Integer">
select count(*) from `sky-take-out`.orders
<where>
<if test="begin != null">and order_time > #{begin}</if>
<if test="end != null">and order_time < #{end}</if>
<if test="status != null">and status = #{status}</if>
</where>
</select>