订单与订单详情
/**单价需要从数据库取出而不是从前端取出*
* 查询数量,单价
* 计算总价
* 写入订单数据库
* 扣库存
* name: "张三"
* phone: "18868822111"
* address: "慕课网总部"
* openid: "ew3euwhd7sjw9diwkq"
* items: [{
* productId: "1423113435324",
* productQuantity: 2
* }]
*/
@Override
@Transactional
public OrderDTO create(OrderDTO orderDTO) {
String orderId = KeyUtil.genUniqueKey();
List<OrderDetail> orderDetailList = orderDTO.getOrderDetailList();
BigDecimal orderAmount = new BigDecimal(BigInteger.ZERO);
for(OrderDetail orderDetail : orderDetailList){
ProductInfo productInfo = productService.findOne(orderDetail.getProductId());
if(productInfo == null){
throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
}
orderAmount = productInfo.getProductPrice().multiply(new BigDecimal(orderDetail.getProductQuantity()))
.add(orderAmount);
orderDetail.setDetailId(KeyUtil.genUniqueKey()); //传过来的订单详细列表只有商品id和数量
orderDetail.setOrderId(orderId); //为每一个商品设置订单号,实现一对多的关系
BeanUtils.copyProperties(productInfo,orderDetail); //将商品的名称,价格等属性拷贝到订单详情表中
orderDetailRepository.save(orderDetail); //需要优化为批量插入
}
//把新生成的orderid和计算出的总价写入,其中支付状态和订单状态在orderMaster中默认
OrderMaster orderMaster = new OrderMaster();
BeanUtils.copyProperties(orderDTO,orderMaster); //注意这个方法要先执行,否则会覆盖orderId为null。
orderMaster.setOrderId(orderId);
orderMaster.setOrderAmount(orderAmount);
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;
}