1.续 开发新增订单功能
1.1开发新增订单的业务逻辑层
我们完成订单的新增业务是比较复杂的
可以将整个业务分成三大部分
第一部分是信息的收集
主要是参数类型数据的完整性验证,计算以及转换
第二部分是数据库操作
减少库存,删除购物车,新增订单,和新增订单项
第三部分是收集需要的返回值
我们新增订单成功后,要返回给前端一些信息,例如订单号,实际支付金额等
创建OmsOrderServiceImpl类,代码如下
// 后期秒杀功能会调用这个生成订单的方法
@DubboService
@Service
@Slf4j
public class OmsOrderServiceImpl implements IOmsOrderService {
@Autowired
private OmsOrderMapper omsOrderMapper;
@Autowired
private OmsOrderItemMapper omsOrderItemMapper;
@DubboReference
private IForOrderSkuService dubboSkuService;
@Autowired
private IOmsCartService omsCartService;
// 当前方法调用了product模块的数据库操作
// 当有运行异常时,所有数据库操作都需要回滚,保证事务的原子性
// 所以要激活分布式事务Seata的功能
@GlobalTransactional
@Override
public OrderAddVO addOrder(OrderAddDTO orderAddDTO) {
// 第一部分:收集信息,准备数据
// OrderAddDTO对象中包含订单和订单项的集合
// 我们要先获得其中订单的信息,做订单的新增
OmsOrder order=new OmsOrder();
// 同名属性赋值过去
BeanUtils.copyProperties(orderAddDTO,order);
// 可以对比OrderAddDTO和OmsOrder类的属性,发现若干属性需要我们来手动赋值
// 以为赋值属性较多,建议单独编写一个方法处理
loadOrder(order);
// 到此为止,order赋值完成
// 下面开始为orderAddDTO对象中的OrderItemAddDTO的集合转换和赋值
// 首先检查它是不是null
List<OrderItemAddDTO> itemAddDTOs=orderAddDTO.getOrderItems();
if(itemAddDTOs==null || itemAddDTOs.isEmpty()){
// 订单中的订单项如果为空,那么抛出异常,终止订单新增业务
throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,
"订单中必须包含至少一件商品");
}
// 我们确认订单中有商品后,需要将现在itemAddDTOs集合中的对象转换为OmsOrderItem类型
// 还需要将不存在的属性赋上值,最后才能进行数据库新增操作
// 所以我们要实例化一个OmsOrderItem类型的集合,接收转换后的对象
List<OmsOrderItem> omsOrderItems=new ArrayList<>();
// 遍历itemAddDTOs
for(OrderItemAddDTO addDTO : itemAddDTOs){
// 还是先将当前遍历的addDTO对象的同名属性赋值给OmsOrderItem
OmsOrderItem orderItem=new OmsOrderItem();
BeanUtils.copyProperties(addDTO,orderItem);
// 赋值id
Long itemId=IdGeneratorUtils.getDistributeId("order_item");
orderItem.setId(itemId);
// 赋值orderid
orderItem.setOrderId(order.getId());
// 将赋好值的orderItem对象添加到集合中
omsOrderItems.add(orderItem);
// 第二部分:执行数据库操作
// 1.减少sku库存
// 获得skuId
Long skuId=orderItem.getSkuId();
// 执行减少库存的方法
int rows=dubboSkuService.reduceStockNum(
skuId,orderItem.getQuantity());
// 判断执行修改影响的行数
if(rows==0){
log.warn("商品skuId:{},库存不足",skuId);
// 库存不足导致运行失败,抛出异常
// Seata会在抛出异常时终止事务
throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,
"库存不足!");
}
// 2.删除购物车信息