苍穹外卖笔记09

目录

用户端订单模块

查询历史订单


用户端订单模块

查询历史订单

user/OrderController

    /**
     * 历史订单查询
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/historyOrders")
    public Result page(int page,int pageSize,
                                   Integer status){
        PageResult pageResult = orderService.pageQuery4User(page,pageSize,status);
        return Result.success(pageResult);

    }

int page: 当前页码,表示分页查询的第几页。
int pageSize: 每页显示的记录数,用于控制每页返回的数据量。
Integer status: 订单状态(可选参数),用于过滤特定状态的订单。

调用orderService.pageQuery4User(page, pageSize, status)方法:
将分页参数和订单状态传递给服务层,执行具体的分页查询逻辑。
返回一个PageResult对象,包含分页数据(如总记录数、当前页数据列表等)。

使用Result.success(pageResult)包装查询结果:
Result是一个通用的响应封装类,通常包含状态码、消息和数据。
将分页查询结果pageResult作为数据部分返回给前端。

接口:

 /**
     * 用户端历史订单分页查询
     * @param page
     * @param pageSize
     * @param status
     * @return
     */
    PageResult pageQuery4User(int page, int pageSize, Integer status);

实现类:

/**
     * 用户端历史订单分页查询
     * @param pageNum
     * @param pageSize
     * @param status
     * @return
     */
    public PageResult pageQuery4User(int pageNum, int pageSize, Integer status) {
        //设置分页
        PageHelper.startPage(pageNum,pageSize);
        //封装一个DTO用于存放查询条件
        OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();

        ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
        ordersPageQueryDTO.setStatus(status);

        //分页查询条件
        Page page =  orderMapper.pageQuery(ordersPageQueryDTO);

        //创建一个 ArrayList 用于存储封装好的 OrderVO 对象。
        List list = new ArrayList<>();

        //查询出订单明细,并封装进orderVO进行响应
        if (page != null && page.getTotal() > 0){
            //使用 for-each 循环遍历 page 中的每个 Orders 对象
            for (Orders orders : page) {
                Long orderId = orders.getId();

                //查询订单明细
                //根据订单 ID 调用 orderDetailMapper
                // 的 getByOrderId 方法查询该订单的所有明细。
                List orderDetails = orderDetailMapper.getByOrderId(orderId);

                //创建一个 OrderVO 对象,使用 BeanUtils.copyProperties
                // 方法将 Orders 对象的属性复制到 OrderVO 中,
                // 然后将查询到的订单明细列表设置到 OrderVO 中。
                OrderVO orderVO = new OrderVO();
                BeanUtils.copyProperties(orders,orderVO);
                orderVO.setOrderDetailList(orderDetails);
                list.add(orderVO);
            }
        }
        return new PageResult(page.getTotal(),list);
    }

   PageHelper.startPage(pageNum, pageSize);

使用PageHelper工具类开启分页功能,传入当前页码和每页记录数。

   OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO();
   ordersPageQueryDTO.setUserId(BaseContext.getCurrentId());
   ordersPageQueryDTO.setStatus(status);

创建一个OrdersPageQueryDTO对象,用于封装查询条件。
设置当前用户的ID(通过BaseContext.getCurrentId()获取)和订单状态。

使用PageQuery 分页查询

    /**
     * 分页查询
     * @param ordersPageQueryDTO
     * @return
     */
    Page pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);

xml:


    

根据UserId查询订单数据。

   List list = new ArrayList<>();
   if (page != null && page.getTotal() > 0) {
       for (Orders orders : page) {
           Long orderId = orders.getId();
           List orderDetails = orderDetailMapper.getByOrderId(orderId);

           OrderVO orderVO = new OrderVO();
           BeanUtils.copyProperties(orders, orderVO);
           orderVO.setOrderDetailList(orderDetails);
           list.add(orderVO);
       }
   }

创建一个 List 用于存储封装的 VO 对象。

遍历分页查询结果中的每个Orders对象。
根据订单ID调用orderDetailMapper.getByOrderId方法,查询该订单的所有明细。
创建一个OrderVO对象,将Orders对象的属性复制到OrderVO中,并将订单明细列表设置到OrderVO中。
将封装好的OrderVO对象添加到结果列表中。

   return new PageResult(page.getTotal(), list);

使用PageResult封装分页结果,包含总记录数和当前页的订单数据列表。

查询订单详情

OrderoController:

   /**
     * 查询订单详情
     * @param id
     * @return
     */
    @GetMapping("/orderDetail/{id}")
    public Result details(@PathVariable("id") Long id){
            OrderVO orderVO = orderService.details(id);
            return Result.success(orderVO);
    }

使用@PathVariable("id") Long id 表示从URL路径中提取 id 参数,并将其转换为 Long 类型

根据前端传入的id调用details方法查询订单详情,并将其存储在 OrderVO 对象中,返回给客户端

接口:

    /**
     * 查看订单详情
     * @param id
     * @return
     */
    OrderVO details(Long id);

实现类:

 /**
     * 查看订单详情
     * @param id
     * @return
     */
    public OrderVO details(Long id) {
        //根据订单id查询订单
        Orders orders = orderMapper.getById(id);
        //查询该订单对应的菜品/套餐明细
        List orderDetailList =
                orderDetailMapper.getByOrderId(orders.getId());
        //将订单及其详情封装进OrderVO并返回
        OrderVO orderVO = new OrderVO();
        BeanUtils.copyProperties(orders,orderVO);
        orderVO.setOrderDetailList(orderDetailList);
        return orderVO;
    }

getById方法:

    /**
     * 根据订单id查询订单
     * @param id
     * @return
     */
    @Select("select * from orders where id = #{id}")
    Orders getById(Long id);

调用 orderDetailMapper.getByOrderId(orders.getId()) 方法,根据订单ID查询该订单的菜品或套餐明细。

    /**
     * 查询订单明细
     * @param orderId
     * @return
     */
    @Select("select * from order_detail where order_id = #{orderId}")
    List getByOrderId(Long orderId);


OrderDetail 是一个实体类,表示订单中每个菜品或套餐的详细信息。

创建一个 OrderVO 对象,用于封装订单的详细信息。
使用 BeanUtils.copyProperties(orders, orderVO) 将 Orders 对象的属性复制到 OrderVO 中。
将查询到的订单明细列表 orderDetailList 设置到 OrderVO 对象的 orderDetailList 属性中。

返回封装好的 OrderVO 对象,包含订单的基本信息和菜品/套餐明细。

取消订单

    /**
     * 删除订单
     * @param id
     * @return
     * @throws Exception
     */
    @PutMapping("/cancel/{id}")
    @ApiOperation("取消订单")
    public Result cancel(@PathVariable("id") Long id) throws Exception{
        orderService.userCancelById(id);
        return Result.success();
    }

调用userCancelById方法,取消传入的id的订单

    /**
     * 删除订单
     * @param id
     */
    void userCancelById(Long id) throws Exception;

实现类:

  /**
     * 用户取消订单
     * @param id
     */
    public void userCancelById(Long id) throws Exception{
        //根据id订单查询
        Orders ordersDB = orderMapper.getById(id);
        //校验订单是否存在
        if (ordersDB == null){
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        //订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
        if (ordersDB.getStatus() > 2){
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        Orders orders = new Orders();
        orders.setId(ordersDB.getId());
        //订单处于待接单状态下取消,需要进行退款
        if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)){
            //调用微信支付退款接口
            weChatPayUtil.refund(
                    ordersDB.getNumber(),
                    ordersDB.getNumber(),
                    new BigDecimal(0.01),
                    new BigDecimal(0.01));
        }
        //支付状态为 退款
        orders.setPayStatus(Orders.REFUND);
        //更新订单状态、取消原因、取消时间
        orders.setStatus(Orders.CANCELLED);
        orders.setCancelReason("用户取消");
        orders.setCancelTime(LocalDateTime.now());
        orderMapper.update(orders);
    }

调用 orderMapper.getById(id) 方法,从数据库中查询订单的基本信息。
Orders 是一个实体类,表示订单的基本信息。

if (ordersDB == null) {
    throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}

如果查询到的订单为 null,说明订单不存在,抛出 OrderBusinessException 异常,提示“订单未找到”。

if (ordersDB.getStatus() > 2) {
    throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}

订单状态为:
1:待付款
2:待接单
3:已接单
4:派送中
5:已完成
6:已取消
如果订单状态大于 2(即已接单、派送中、已完成或已取消),则抛出 OrderBusinessException 异常,提示“订单状态错误”

Orders orders = new Orders();
orders.setId(ordersDB.getId());

创建一个新的 Orders 对象,用于更新订单信息

if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
    weChatPayUtil.refund(
        ordersDB.getNumber(),
        ordersDB.getNumber(),
        new BigDecimal(0.01),
        new BigDecimal(0.01));
}

如果订单状态为“待接单”(Orders.TO_BE_CONFIRMED),则需要调用微信支付退款接口 weChatPayUtil.refund 进行退款。
退款金额为 0.01 元(示例值,实际金额应根据业务逻辑调整)

Orders orders = new Orders();
orders.setId(ordersDB.getId());
orders.setPayStatus(Orders.REFUND);
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("用户取消");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);

创建一个新的 Orders 对象,用于更新订单状态。
设置订单的支付状态为“退款”(Orders.REFUND)。
设置订单状态为“已取消”(Orders.CANCELLED)。
设置取消原因为“用户取消”。
设置取消时间为当前时间。
调用 orderMapper.update(orders) 方法,更新数据库中的订单信息。

update方法通过 XML 映射文件实现更新操作,不再赘述。

再来一单

Controller:


    /**
     * 再来一单
     * @param id
     * @return
     */
    @PostMapping("/repetition/{id}")
    @ApiOperation("再来一单")
    public Result repetition(@PathVariable Long id){
        orderService.repetition(id);
        return Result.success();

    }

id:订单的唯一标识符,类型为 Long,通过 @PathVariable 从 URL 路径中提取。
返回值:Result 对象,表示操作结果,通常包含状态码和消息。

调用 orderService.repetition(id) 方法,将订单中的菜品重新加入购物车。

接口:

    /**
     * 再来一单
     * @param id
     */
    void repetition(Long id);

实现类:

 /**
     * 再来一单
     * @param id
     */
    public void repetition(Long 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);
    }

查询订单详情:

OrderDetail 是一个实体类,表示订单中每个菜品或套餐的详细信息。

    /**
     * 查询订单明细
     * @param orderId
     * @return
     */
    @Select("select * from order_detail where order_id = #{orderId}")
    List getByOrderId(Long orderId);

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());

使用 stream().map() 方法,将 OrderDetail 对象转换为 ShoppingCart 对象。
BeanUtils.copyProperties(x, shoppingCart, "id"):将 OrderDetail 对象的属性复制到 ShoppingCart 对象中,忽略 id 属性。
设置购物车对象的用户ID为当前用户ID。
设置购物车对象的创建时间为当前时间。

stream().map() 是 Stream API 的核心方法之一,用于对集合中的元素进行 转换(映射)。它接受一个函数式接口(Function),将流中的每个元素 T 转换为新的元素 R,生成一个新的流。

List result = list.stream()
    .map(element -> 转换逻辑)
    .collect(Collectors.toList());
  • stream():将集合转换为流。

  • map():对每个元素应用映射函数。

  • collect():将流转换回集合或其他数据结构

shoppingCartMapper.insertBatch(shoppingCartList);

调用 shoppingCartMapper.insertBatch(shoppingCartList) 方法,将购物车对象批量插入到数据库中。
shoppingCartMapper 是购物车数据访问对象(DAO),用于操作数据库中的购物车表。

    
        insert into shopping_cart
        (name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount,
         create_time)
        VALUES
        
            (#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},
             #{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime})
        
    

你可能感兴趣的:(笔记,java,javascript)