SpringBoot微信點餐-訂單-Server層
阿新 • • 發佈:2018-12-24
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 {
}
}
訂單主表新增成功
訂單詳情表測試成功