添加商品失败

来源:8-4 创建订单-状态枚举与自测

最甜的冰

2022-01-01 21:43:57

问题描述:

数据库中没有添加上orderItem的数据,但是创建订单成功

相关截图:

https://img.mukewang.com/climg/61d0585f0992a54805380359.jpg

/**
 * 创建订单
 * @param createOrderReq
 * @return
 */
@PostMapping("order/create")
public ApiRestResponse create(@RequestBody CreateOrderReq createOrderReq){
    String orderNO = orderService.create(createOrderReq);
    return ApiRestResponse.success(orderNO);
}
@Override
//数据库事务
@Transactional(rollbackFor = Exception.class)
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.CHECKED)) {
            cartVOListTemp.add(cartVO);
        }
    }
    cartVOList = cartVOListTemp;
    //如果购物车已勾选的为空,报错
    if (CollectionUtils.isEmpty(cartVOList)) {
        throw new ImoocMallException(ImoocMallExceptionEnum.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 ImoocMallException(ImoocMallExceptionEnum.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(totalPrice(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 totalPrice(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());

    }
    return orderItemList;
}

private void validSaleStatusAndStock(List<CartVO> cartVOList) {
    for (int i = 0; i < cartVOList.size(); i++) {
        CartVO cartVO = cartVOList.get(i);
        Product product = productMapper.selectByPrimaryKey(cartVO.getProductId());
        //判断商品是否存在,商品是否上架
        if (product == null || product.getStatus().equals(Constant.SaleStatus.NOT_SALE)) {
            throw new ImoocMallException(ImoocMallExceptionEnum.NOT_SALE);
        }
        //判断商品库存
        if (cartVO.getQuantity() > product.getStock()) {
            throw new ImoocMallException(ImoocMallExceptionEnum.NOT_ENOUGH);
        }
    }

}
//OrderItemMapper的sql代码
<select id="selectByOrderNo" parameterType="java.lang.String"
        resultMap="BaseResultMap">
  select
  <include refid="Base_Column_List"/>
  from imooc_mall_order_item
  where order_no=#{orderNo}
</select>
//OrderMapper的sql代码
<select id="selectByOrderNo" parameterType="java.lang.String"
        resultMap="BaseResultMap">
  select
  <include refid="Base_Column_List"/>
  from imooc_mall_order
  where order_no=#{orderNo}
</select>
           
下载视频          
写回答

1回答

好帮手慕小脸

2022-01-04

同学你好,建议同学下载课程源码,替换一下添加商品这部分的代码然后进行测试试一下

祝学习愉快~

0

0 学习 · 9886 问题

查看课程