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
  • 相关阅读:
    Luogu3227 HNOI2013切糕
    Luogu1646 happiness
    Luogu5038 SCOI2012奇怪的游戏
    Luogu3324 星际战争
    Luogu2472 SCOI2007蜥蜴
    NOI Online#3 解题报告
    Luogu6478 游戏
    1,[VS入门教程] 使用Visual Studio写c语言 入门与技巧精品文~~~~下载安装篇
    Windows开机自动登陆 开/关:登录需按Ctrl+Alt+del的功能
    官方入门教程和文档 | Visual Studio
  • 原文地址:https://www.cnblogs.com/shouyaya/p/13138401.html
Copyright © 2011-2022 走看看