苍穹外卖项目(黑马)学习笔记DAY9(作业)

目录

用户端历史订单

历史订单查询 

查询订单详情

取消一单

再来订单

商家端订单管理

各个状态的订单数量统计

订单搜索


用户端历史订单

        从产品原型,我们知道点进历史订单,需要查询订单数据,可以是全部订单 ,也可以选择查询待付款或退款的订单。因此第一接口分页查询历史订单。对每一条订单,我们还可以点击进去查询详细的信息。因此第二个接口查询订单详情。此外,还有再来一单,和取消订单的功能。

        因此,我们需要完成:查询历史订单、查询订单详情、取消订单和再来一单,四个功能,我们用四个接口来对应这些功能。

苍穹外卖项目(黑马)学习笔记DAY9(作业)_第1张图片

  • 历史订单查询 

        用什么方法请求?传入什么参数?返回什么数据?

        该请求使用get方式请求。传入分页相关的数据里面包含页面,页数,以及订单状态(用于查询全部或待付款或已取消的订单)。需要放回订单相关的数据,这些数据用OrderVO封装。

        分页查询,我们以往都是用一个DTO对象去接收前端传过来的数据。而这一次前端直接传了int page, int pageSize, Integer status。因此我们在查询的时候需要将这些数据先封装成一个DTO对象后,在进行分页查询。

        OrdersPageQueryDTO ordersPageQueryDTO=new OrdersPageQueryDTO();
        ordersPageQueryDTO.setStatus(status);
        ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
        Page listPage=orderMapper.historyOrder(ordersPageQueryDTO);
    

        查询返回来的结构是Orders,我们需要返回给前端的是OrderVO。创建一个List,这个集合是我们最终要返回给前端的。对于刚刚查询到的订单,遍历先查询到它的详细订单,然后把orders和orderdetail一块封装到orderVO最后添加到集合List

 List list = new ArrayList();
        List result = listPage.getResult();
        if(listPage !=null &&total>0){
            for (Orders order : result) {
                List orderDetails = orderDetailMapper.getByOrderId(order.getId());
                OrderVO orderVO=new OrderVO();
                orderVO.setOrderDetailList(orderDetails);
                BeanUtils.copyProperties(order,orderVO);
                list.add(orderVO);
            }
        }
  • 查询订单详情

        用什么方法请求?传入什么参数?返回什么数据?

        该请求使用get方式请求。传入的是订单id的路径参数。需要将订单状态封装成OrderVO返回给前端。

  • 取消一单

        用什么方法请求?传入什么参数?返回什么数据?

        该请求使用put方式。传入的是订单id的路径参数。无额外需要返回的数据。

    public void cancel(OrdersCancelDTO ordersCancelDTO) {
        Orders order = orderMapper.getById(ordersCancelDTO.getId());
        //支付状态
        Integer payStatus = order.getPayStatus();
        if (payStatus == 1) {
            //用户已支付,需要退款
//            String refund = weChatPayUtil.refund(
//                    order.getNumber(),
//                    order.getNumber(),
//                    new BigDecimal(0.01),
//                    new BigDecimal(0.01));
            log.info("申请退款");
        }

        // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
        Orders orders = new Orders();
        orders.setId(ordersCancelDTO.getId());
        orders.setStatus(Orders.CANCELLED);
        orders.setCancelReason(ordersCancelDTO.getCancelReason());
        orders.setCancelTime(LocalDateTime.now());
        orderMapper.update(orders);
    }

        由于微信的功能不能用,所以直接注释掉。后边直接修改数据库中订单信息即可。 

  • 再来订单

        用什么方法请求?传入什么参数?返回什么数据?

        该请求使用post方式请求。传入的是订单id的路径参数。无额外需要返回的数据。

        一开始我的思路就是,根据订单id查询订单相关的所有信息,直接往数据库添加一份数据。结果,数据添加了,但是前端页面没有变化。所有就知道出问题了。

        后来,才知道,需要把订单添加到购物车中才行。

        // 查询当前用户id
        Long userId = BaseContext.getCurrentId();

        // 根据订单id查询当前订单详情
        List orderDetailList = orderDetailMapper.getByOrderId(id);

        // 将订单详情对象转换为购物车对象
        List shoppingCartList = orderDetailList.stream().map(x -> {
            ShoppingCart shoppingCart = new ShoppingCart();

            // 将原订单详情里面的菜品信息重新复制到购物车对象中
            BeanUtils.copyProperties(x, shoppingCart, "id");
            shoppingCart.setUserId(userId);
            shoppingCart.setCreateTime(LocalDateTime.now());

            return shoppingCart;
        }).collect(Collectors.toList());

        // 将购物车对象批量添加到数据库
        shoppingCartMapper.insertBatch(shoppingCartList);

商家端订单管理

        由产品原型得该模块需要完成:订单搜索、各个状态的订单数量统计、接单、拒单、取消订单、派送订单、完成订单。从后边接单开始,其实就是更新数据库中订单状态(只需要注意订单在什么情况下,才能取消、派送、完成、接单、拒单等)这里不冗余再展开说了。

  • 各个状态的订单数量统计

        用什么方法请求?传入什么参数?返回什么数据?

         该请求使用get方式。不需要传入参数。需要放回包含待派送数量、派送中数量和待接单数量的OrderStatisticsVO。

        // 根据状态,分别查询出待接单、待派送、派送中的订单数量
        Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED);
        Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED);
        Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS);
        OrderStatisticsVO orderStatisticsVO=new OrderStatisticsVO();
        orderStatisticsVO.setToBeConfirmed(toBeConfirmed);
        orderStatisticsVO.setConfirmed(confirmed);
        orderStatisticsVO.setDeliveryInProgress(deliveryInProgress);
        return orderStatisticsVO;  
    


//xml
        @Select("select count(id) from sky_take_out.orders where status=#{status}")
        Integer countStatus(Integer status);
  • 订单搜索

        用什么方法请求?传入什么参数?返回什么数据?

         该请求使用get方式请求。传入分页相关的数据封装在ordersPageQueryDTO后传入。返回订单信息OrderVO。

        封装List的过程如下。

private List getOrderVO(Page page) {
        List orderVOList=new ArrayList<>();
        List ordersList = page.getResult();
        //先判断是否有无订单即集合是否为空
        if(!CollectionUtils.isEmpty(ordersList)){
            for (Orders orders : ordersList) {
                OrderVO orderVO=new OrderVO();
                BeanUtils.copyProperties(orders,orderVO);
                String orderDishes = getOrderDishesStr(orders);
                orderVO.setOrderDishes(orderDishes);
                orderVOList.add(orderVO);
            }
        }
        return orderVOList;
    }

如果有帮助到你,希望可以点赞收藏转发~

你可能感兴趣的:(苍穹外卖学习笔记,学习,spring,boot,笔记,spring,maven)