1. 程式人生 > >SpringBoot微信點餐-訂單-Server層

SpringBoot微信點餐-訂單-Server層

1.在Server建立interface類,OrderService。首先儘量寫出能想到的有關訂單的方法。

package com.imooc.service;

import com.imooc.dto.OrderDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * Created by 廖師兄
 * 2017-06-11 18:23
 */
public interface OrderService {

    /** 建立訂單. */
    OrderDTO create(OrderDTO orderDTO);

    /** 查詢單個訂單. */
    OrderDTO findOne(String orderId);

    /** 查詢訂單列表. */
    Page<OrderDTO> findList(String buyerOpenid,Pageable pageable);

    /** 取消訂單. */
    OrderDTO cancel(OrderDTO orderDTO);

    /** 完結訂單. */
    OrderDTO finish(OrderDTO orderDTO);

    /** 支付訂單. */

    OrderDTO paid (OrderDTO orderDTO);
    /** 查詢訂單列表. */


}
OrderDTO是根據訂單主表設計的,如果長期使用跟資料有關的實體類,不方便。單獨建立了一個用來資料傳輸的實體類。而且因為返回的時候可多個訂單,因此根據訂單詳情,設定了訂單詳情的List<OrderDetail>型別的orderDetailList變數。
package com.imooc.dto;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.imooc.Utils.serializer.Date2LongSerializer;
import com.imooc.dataobject.OrderDetail;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

//import com.imooc.utils.EnumUtil;
//import com.imooc.utils.serializer.Date2LongSerializer;

/**
 * Created by 廖師兄
 * 2017-06-11 18:30
 * D:資料T:傳輸O:物件
 */
@Data
//@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
//@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

    /** 訂單id. */
    private String orderId;

    /** 買家名字. */
    private String buyerName;

    /** 買家手機號. */
    private String buyerPhone;

    /** 買家地址. */
    private String buyerAddress;

    /** 買家微信Openid. */
    private String buyerOpenid;

    /** 訂單總金額. */
    private BigDecimal orderAmount;

    /** 訂單狀態, 預設為0新下單. */
    private Integer orderStatus;

    /** 支付狀態, 預設為0未支付. */
    private Integer payStatus;

    /** 建立時間. */
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date createTime;

    /** 更新時間. */
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date updateTime;

    /**訂單詳情*/
    List<OrderDetail> orderDetailList;

//    @JsonIgnore
//    public OrderStatusEnum getOrderStatusEnum() {
//        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
//    }
//
//    @JsonIgnore
//    public PayStatusEnum getPayStatusEnum() {
//        return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
//    }
}
建立Server類的實現類,因為用到訂單查詢的幾個方法,所以必須引入。
package com.imooc.service.Impl;

import com.imooc.Utils.KeyUtil;
import com.imooc.dataobject.OrderDetail;
import com.imooc.dataobject.OrderMaster;
import com.imooc.dataobject.ProductInfo;
import com.imooc.dto.CartDTO;
import com.imooc.dto.OrderDTO;
import com.imooc.enums.OrderStatusEnum;
import com.imooc.enums.PayStatusEnum;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.repository.OrderDetailRepository;
import com.imooc.repository.OrderMasterRepository;
import com.imooc.service.OrderService;
import com.imooc.service.ProductService;
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;

/**
 * Created by Cdy1234 on 2018/8/18.
 * 訂單表的Service層
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private ProductService productService;

    @Autowired
    private OrderDetailRepository orderDetailRepository;

    @Autowired
    private OrderMasterRepository orderMasterRepository;
   /**
     * 建立訂單
     */
    @Override
    @Transactional
    public OrderDTO create(OrderDTO orderDTO) {

//生成訂單id
        String orderId=KeyUtil.genUniqueKey();
        BigDecimal orderAmount=new BigDecimal(BigInteger.ZERO);
//        List<CartDTO> cartDTOList=new ArrayList<>();
        //1.查詢商品(數量,價格)
         for(OrderDetail orderDetail:orderDTO.getOrderDetailList()){
             ProductInfo productInfo= productService.findOne(orderDetail.getProductId());
             if (productInfo==null){
                 throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
             }
             //2.計算總價
             orderAmount= productInfo.getProductPrice().multiply(new BigDecimal(orderDetail.getProductQuantity())).add(orderAmount);

             //訂單詳情入庫。
             orderDetail.setDetailId(KeyUtil.genUniqueKey());
             orderDetail.setOrderId(orderId);
             BeanUtils.copyProperties(productInfo,orderDetail);
             orderDetailRepository.save(orderDetail);

         }



        //3.寫入訂單資料庫(orderMaster和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);

        //4.扣庫存
        List<CartDTO> cartDTOList=orderDTO.getOrderDetailList().stream().map(e->new CartDTO(e.getProductId(),e.getProductQuantity())).collect(Collectors.toList());

        productService.decreaseStock(cartDTOList);


        return orderDTO;
    }

    @Override
    public OrderDTO findOne(String orderId) {
        return null;
    }

    @Override
    public Page<OrderDTO> findList(String buyerOpenid, Pageable pageable) {
        return null;
    }

    @Override
    public OrderDTO cancel(OrderDTO orderDTO) {
        return null;
    }

    @Override
    public OrderDTO finish(OrderDTO orderDTO) {
        return null;
    }

    @Override
    public OrderDTO paid(OrderDTO orderDTO) {
        return null;
    }
}

測試建立訂單的方法,模擬使用者建立訂單,購物車只需要傳商品ID和商品的數量,因為可能同時下單多個商品。所以也必須使用陣列來建立。

package com.imooc.service.Impl;

import com.imooc.dataobject.OrderDetail;
import com.imooc.dto.OrderDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Cdy1234 on 2018/8/18.
 */
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class OrderServiceImplTest {


    @Autowired
    private OrderServiceImpl orderService;

    private final String BUYER_OPENID="110110";

    @Test
    public void testCreate() throws Exception {
        OrderDTO orderDTO=new OrderDTO();
        orderDTO.setBuyerAddress("廈門大夏408");
        orderDTO.setBuyerName("邱芬芳");
        orderDTO.setBuyerPhone("153xxxxx55");
        orderDTO.setBuyerOpenid(BUYER_OPENID);

        //購物車
        List<OrderDetail>orderDetailList =new ArrayList<>();

        OrderDetail o1=new OrderDetail();
        o1.setProductQuantity(2);
        o1.setProductId("123459");

        OrderDetail o2 = new OrderDetail();
        o2.setProductId("123453");
        o2.setProductQuantity(2);

        orderDetailList.add(o1);
        orderDetailList.add(o2);
        orderDTO.setOrderDetailList(orderDetailList);
        OrderDTO result= orderService.create(orderDTO);
        log.info("【建立訂單】result={}", result);
        Assert.assertNotNull(result);

    }

    @Test
    public void testFindOne() throws Exception {

    }

    @Test
    public void testFindList() throws Exception {

    }

    @Test
    public void testCancel() throws Exception {

    }

    @Test
    public void testFinish() throws Exception {

    }

    @Test
    public void testPaid() throws Exception {

    }
}

訂單主表新增成功

訂單詳情表測試成功