一、新建订单接口
包含以下内容:
- 创建订单
OrderDTO create(OrderDTO orderDTO);
- 查询单个订单
OrderDTO findOne(String orderId);
- 查询订单列表
Page<OrderDTO> findList(String buyerOpenid, Pageable pageable);
- 取消订单
OrderDTO cancel(OrderDTO orderDTO);
- 完结订单
OrderDTO finished(OrderDTO orderDTO);
- 订单支付
OrderDTO paid(OrderDTO orderDTO);
这里指的注意,为什么我们用的新建的一个订单实体类 OrderDTO
而不是直接使用订单表。主要是不够方便,因为订单表对订单详情表是一对多的,即订单详情表可以包含多个订单,所以我们要在订单的实体类还要加一个属性:
List<OrderDetail> orderDetailList;
但直接加到 OrderMaster
是不合理的,也会报错,因为OrderMaster
存的都是数据库里的字段,并没有orderDetailList
这个字段(报错的话可以加个注解@Transient
,作用是忽略数据库对应的字段)。
所以我们直接新建一个对象 dto(数据传输对象),新建类 OrderDTO
。
二、新建订单实现类,注意加上@Service
注解
@Autowired
private ProductService productService;
@Autowired
private OrderDetailRepository orderDetailRepository;
@Autowired
private OrderMasterRepository orderMasterRepository;
- 创建订单
//先定义一个总价
BigDecimal orderAmount = new BigDecimal(BigInteger.ZERO);
- 查询商品(数量、价格)
//遍历商品
for (OrderDetail orderDetail:orderDTO.getOrderDetailList()){
ProductInfo productInfo = productService.findOne(orderDetail.getProductId());
//判断是否有商品,即数据库中是否有信息,若为空,说明商品不存在
if (productInfo == null){
throw new SellException(ResultEnum.PRODUCT_CODE_EXIST);
}
- 计算订单总价
//先计算某一件商品的总价乘以商品数量再加上原来的总价
orderAmount = productInfo.getProductPrice().multiply(new BigDecimal(orderDetail.getProductQuantity())).add(orderAmount);
- 订单详情入库(orderMaster和orderDetail)
orderDetail.setOrderId(KeyUtil.genUniqueKey());
orderDetail.setDetailId(orderId);
BeanUtils.copyProperties(productInfo,orderDetail);
orderDetailRepository.save(orderDetail);
- 订单写入数据库
OrderMaster orderMaster = new OrderMaster();
BeanUtils.copyProperties(orderDTO,orderMaster);
orderMaster.setOrderId(orderId);
orderMaster.setOrderAmount(orderAmount);
orderMaster.setOrderStatus(OrderStatusEnum.NEW.getCode());
orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode());
orderMasterRepository.save(orderMaster);
- 下单成功,扣库存
List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream().map(e -> new CartDTO(e.getProductId(),e.getProductQuantity())).collect(Collectors.toList());
productService.decreaseStock(cartDTOList);
return orderDTO;
- 查询单个订单
- 查询订单列表
- 取消订单
- 完结订单
- 支付订单