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 {
}
}
訂單主表添加成功
訂單詳情表測試成功