zoukankan      html  css  js  c++  java
  • 关于订单创建的service层

    1.代码的实现

    package com.yzy.sell.Service.Impl;
    import com.yzy.sell.DTO.CateDTO;
    import com.yzy.sell.DTO.OrderDTO;
    import com.yzy.sell.Entity.OrderDetail;
    import com.yzy.sell.Entity.OrderMaster;
    import com.yzy.sell.Entity.ProductInfo;
    import com.yzy.sell.Enums.OrderStatusEnum;
    import com.yzy.sell.Enums.PayStatusEnum;
    import com.yzy.sell.Enums.ResultEnum;
    import com.yzy.sell.Repository.OrderDetailRepository;
    import com.yzy.sell.Repository.OrderMasterRepository;
    import com.yzy.sell.Repository.ProductInfoRepository;
    import com.yzy.sell.Service.OrderService;
    import com.yzy.sell.Service.ProductService;
    import com.yzy.sell.exception.SellException;
    import com.yzy.sell.utils.KeyUtil;
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.util.List;
    import java.util.stream.Collectors;
    
    @Service
    public class OrderServiceImpl implements OrderService {
        @Autowired
        private ProductInfoRepository productInfoRepository;
        @Autowired
        private  ProductService productService;
        @Autowired
        private OrderDetailRepository orderDetailRepository;
        @Autowired
        private OrderMasterRepository orderMasterRepository;
    
        @Override
        @Transactional  //添加此标签后,发生异常数据库会回滚操作
        public OrderDTO create(OrderDTO orderDTO) {
            String orderId= KeyUtil.genUniqueKey();
            List<OrderDetail> orderDetailList = orderDTO.getOrderDetailList();
            BigDecimal orderAmount=new BigDecimal(BigInteger.ZERO);
            //1.获取商品价格、名字
            for(OrderDetail orderDetail:orderDetailList){
                ProductInfo productInfo = productInfoRepository.findById(orderDetail.getProductId()).get();
                if(productInfo==null){
                    new SellException(ResultEnum.PRODUCT_NO_EXIST);
                }
                //2.计算订单总价
                orderAmount=productInfo.getProductPrice().multiply(new BigDecimal(orderDetail.getProductQuantity()))
                            .add(orderAmount);
    
                //3.1写入订单详情(orderDetail)数据库
                orderDetail.setDetailId(KeyUtil.genUniqueKey());
                orderDetail.setOrderId(orderId);
                BeanUtils.copyProperties(productInfo,orderDetail);
                orderDetailRepository.save(orderDetail);
            }
            //3.2写入订单(orderMaster)数据库
            OrderMaster orderMaster=new OrderMaster();
            orderDTO.setOrderId(orderId);
            BeanUtils.copyProperties(orderDTO,orderMaster);
            orderMaster.setOrderAmount(orderAmount);
            orderMaster.setOrderStatus(OrderStatusEnum.NEW.getCode());
            orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode());
            orderMasterRepository.save(orderMaster);
            //4.减库存
            List<CateDTO> cateDTOList=orderDetailList.stream().map(e-> new CateDTO(e.getProductId(),e.getProductQuantity()))
                    .collect(Collectors.toList());
            productService.decreaseStock(cateDTOList);
    
            return orderDTO;
        }

    2.关于@Transactional的使用

     3.关于lambda表达式的使用 

    @Transactional
  • 相关阅读:
    解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法
    关于时间复杂度
    关于如何在MyEclipse下修改项目名包名,以及类
    Error filterStart
    类A是公共的,应在名为A.java的文件中声明错误
    Eclipse快捷键大全
    JVM 是用什么语言写的?
    退出cmd命令
    Java 如何对文件进行多个Object对象流的读写操作
    SublimeText2 快捷键一览表
  • 原文地址:https://www.cnblogs.com/shouyaya/p/13138401.html
Copyright © 2011-2022 走看看