Bootstrap

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

目录

用户端历史订单

历史订单查询 

查询订单详情

取消一单

再来订单

商家端订单管理

各个状态的订单数量统计

订单搜索


用户端历史订单

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

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

  • 历史订单查询 

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

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

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

        OrdersPageQueryDTO ordersPageQueryDTO=new OrdersPageQueryDTO();
        ordersPageQueryDTO.setStatus(status);
        ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
        Page<Orders> listPage=orderMapper.historyOrder(ordersPageQueryDTO);
    <select id="historyOrder" resultType="orders">
        select * from orders
        <where>
            <if test="number != null and number!=''">
                and number like concat('%',#{number},'%')
            </if>
            <if test="phone != null and phone!=''">
                and phone like concat('%',#{phone},'%')
            </if>
            <if test="userId != null">
                and user_id = #{userId}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="beginTime != null">
                and order_time &gt;= #{beginTime}
            </if>
            <if test="endTime != null">
                and order_time &lt;= #{endTime}
            </if>
        </where>
        order by order_time desc
    </select>

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

 List<OrderVO> list = new ArrayList();
        List<Orders> result = listPage.getResult();
        if(listPage !=null &&total>0){
            for (Orders order : result) {
                List<OrderDetail> 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<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);

        // 将订单详情对象转换为购物车对象
        List<ShoppingCart> 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<OrderVO>的过程如下。

private List<OrderVO> getOrderVO(Page<Orders> page) {
        List<OrderVO> orderVOList=new ArrayList<>();
        List<Orders> 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;
    }

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

;