订单统计

文章目录

概要

订单统计通过一个折现图来展现,折线图上有两根线,这根蓝色的线代表的是订单总数,而下边这根绿色的线代表的是有效订单数,指的就是状态是已完成的订单就属于有效订单,分别反映的是每一天的数据。上面还有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 &gt; #{begin}</if>
           <if test="end != null">and order_time &lt; #{end}</if>
           <if test="status != null">and status = #{status}</if>
       </where>
    </select>

效果展示

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值