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
  • 相关阅读:
    终于有人把 Docker 讲清楚了,万字详解!
    Java 14 可能带来什么新特性?
    我 45 岁还写代码,怎么了?
    傻傻分不清?Integer、new Integer() 和 int 的面试题
    showModalDialog打开页面有缓存,不走action
    ajax,下拉框级联
    jsp中<!DOCTYPE>标签
    struts配置文件中如何从一个package的action跳到另一个package中的某个action
    jsp通过s:hidden传值给后台,后台数据出现了若干逗号问题
    struts2.0整合json
  • 原文地址:https://www.cnblogs.com/shouyaya/p/13138401.html
Copyright © 2011-2022 走看看