生成订单

来源:8-3 创建订单-对象转化与扣库存

慕工程3164992

2022-03-16 10:41:53

老师您好:

        为什么要把购物车对象转为订单item对象,我这儿看不懂也不理解。

public String create(CreateOrderReq createOrderReq) {
    //拿到用户Id
    Integer userId = UserFilter.currentUser.getId();
    //从购物车查找已近勾选的商品
    List<CartVO> cartVOList = cartService.list(userId);
    ArrayList<CartVO> cartVOListTemp = new ArrayList<>();
    for (int i = 0; i < cartVOList.size(); i++) {
        CartVO cartVO = cartVOList.get(i);
        if (cartVO.getSelected().equals(Constant.Cart.SELECTED)) {
            cartVOListTemp.add(cartVO);
        }
    }
    cartVOList = cartVOListTemp;
    //如果购物车勾选的为空,报错
    if (CollectionUtils.isEmpty(cartVOList)) {
        throw new HkcException(HkcExceptionEnum.CART_EMPTY);
    }
    //判断商品是否存在、上下架状态、库存
    validSaleStatusAndStock(cartVOList);
    //把购物车对象转为订单item对象
    List <OrderItem> orderItemList=cartVOListToOrderItemList(cartVOList);
    //扣库存
     for (int i=0;i<orderItemList.size();i++){
         OrderItem orderItem=orderItemList.get(i);
         Product product=productMapper.selectByPrimaryKey(orderItem.getProductId());
         int stock=product.getStock()-orderItem.getQuantity();
         if (stock<0){
            throw  new HkcException(HkcExceptionEnum.NOT_ENOUGH);
         }
         product.setStock(stock);
         productMapper.updateByPrimaryKeySelective(product);
     }
    //把购物车中已勾选商品删除
     cleanCart(cartVOList);
    //生成订单
    Order order=new Order();
    //生成订单号,有独立的规则
   String orderNo =OrderCodeFactory.getOrderCode(Long.valueOf(userId));
   order.setOrderNo(orderNo);
   order.setUserId(userId);
   order.setTotalPrice(totaPrice(orderItemList));
   order.setReceiverName(createOrderReq.getReceiverName());
   order.setReceiverMobile(createOrderReq.getReceiverMobile());
   order.setReceiverAddress(createOrderReq.getReceiverAddress());
   order.setOrderStatus(Constant.OrderStatusEnum.NOT_PAID.getCode());
   order.setPostage(0);
   order.setPaymentType(1);
   //插入到order表
    orderMapper.insertSelective(order);
    //循环保存每个商品到order_item表
    for (int i=0;i<orderItemList.size();i++){
        OrderItem orderItem=orderItemList.get(i);
        orderItem.setOrderNo(order.getOrderNo());
        orderItemMapper.insertSelective(orderItem);
    }
    return orderNo;
    //把结果返回
}

private Integer totaPrice(List<OrderItem> orderItemList) {
    Integer totalPrice=0;
    for(int i=0;i<orderItemList.size();i++){
        OrderItem orderItem=orderItemList.get(i);
        totalPrice+=orderItem.getTotalPrice();
    }
    return totalPrice;
}

private void cleanCart(List<CartVO> cartVOList) {
    for (int i=0;i<cartVOList.size();i++){
        CartVO cartVO=cartVOList.get(i);
        cartMapper.deleteByPrimaryKey(cartVO.getId());
    }
}

private List<OrderItem> cartVOListToOrderItemList(List<CartVO> cartVOList) {
    List<OrderItem> orderItemList=new ArrayList<>();
    for (int i=0;i<cartVOList.size();i++){
        CartVO cartVO=cartVOList.get(i);
        OrderItem orderItem=new OrderItem();
        orderItem.setProductId(cartVO.getProductId());
        //记录商品快照信息
        orderItem.setProductName(cartVO.getProductName());
        orderItem.setProductImg(cartVO.getProductImage());
        orderItem.setUnitPrice(cartVO.getPrice());
        orderItem.setQuantity(cartVO.getQuantity());
        orderItem.setTotalPrice(cartVO.getTotalPrice());
        orderItemList.add(orderItem);
    }
    return orderItemList;
}


写回答

1回答

好帮手慕小尤

2022-03-16

同学你好,我们在购买商品时,一般情况下会先添加到购物车或直接购买。第一种情况,需要在购物车中选中商品然后生成订单进行付钱。所以此时需要将购物车对象转为订单item对象。

祝学习愉快!

0

0 学习 · 9886 问题

查看课程