学习目标:
开发订单模块
了解希尔排序的基本原理
学习内容:
完成了创建订单的接口的开发与测试。
package com.imooc.mall.Service.impl; import com.imooc.mall.Service.CartService; import com.imooc.mall.Service.OrderService; import com.imooc.mall.common.Constant; import com.imooc.mall.exception.ImoocMallException; import com.imooc.mall.exception.ImoocMallExceptionEnum; import com.imooc.mall.filter.UserFilter; import com.imooc.mall.model.dao.CartMapper; import com.imooc.mall.model.dao.OrderItemMapper; import com.imooc.mall.model.dao.OrderMapper; import com.imooc.mall.model.dao.ProductMapper; import com.imooc.mall.model.pojo.Order; import com.imooc.mall.model.pojo.OrderItem; import com.imooc.mall.model.pojo.Product; import com.imooc.mall.model.request.CreateOrderReq; import com.imooc.mall.model.vo.CartVO; import com.imooc.mall.util.OrderCodeFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; /** * 描述: 订单Service实现类 */ @Service public class OrderServiceImpl implements OrderService { @Autowired CartService cartService; @Autowired ProductMapper productMapper; @Autowired CartMapper cartMapper; @Autowired OrderMapper orderMapper; @Autowired OrderItemMapper orderItemMapper; @Override 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_PAIY.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); order.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()); orderItemList.add(orderItem); } 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); } } } }
学习时间:
08:20-11:10 15:00 -17:00 18:00 -20:00
学习产出:
对于添加订单这一个复杂的业务逻辑进行了实现,其中包括数据库的多表关联查询,对象的转换与扣库存,还有状态枚举等。