续 开发新增订单功能
开发新增订单的业务逻辑层
我们完成订单的新增业务是比较复杂的
可以将整个业务分成三大部分
第一部分是信息的收集
主要是参数类型数据的完整性验证,计算以及转换
第二部分是数据库操作
减少库存,删除购物车,新增订单,和新增订单项
第三部分是收集需要的返回值
我们新增订单成功后,要返回给前端一些信息,例如订单号,实际支付金额等
创建OmsOrderServiceImpl类,代码如下
// 后期秒杀业务也需要生成订单,可以直接调用当前类中的方法
@DubboService
@Service
@Slf4j
public class OmsOrderServiceImpl implements IOmsOrderService {
@Autowired
private OmsOrderMapper omsOrderMapper;
@Autowired
private OmsOrderItemMapper omsOrderItemMapper;
@Autowired
private IOmsCartService omsCartService;
@DubboReference
private IForOrderSkuService dubboSkuService;
// 新增订单的方法
// 这个方法调用了product模块的数据库操作功能,
// 运行发送异常时,必须依靠分布式事务组件(seata)进行回滚,以保证事务的原子性
// 我们要利用注解激活Seata的分布式事务功能
@GlobalTransactional
@Override
public OrderAddVO addOrder(OrderAddDTO orderAddDTO) {
// 第一部分:收集信息,准备数据
// 先实例化OmsOrder对象
OmsOrder order=new OmsOrder();
// 将当前方法参数OrderAddDTO类型对象的同名属性赋值给OmsOrder对象
BeanUtils.copyProperties(orderAddDTO,order);
// orderAddDTO中的属性较少,order对象还有一些属性不能被赋值,需要我们手动计算或赋值
// 我们可以专门编写一个方法,在这个方法中处理
loadOrder(order);
// 运行完上面的方法,order的赋值就完成了
// 下面开始为当前订单包含的订单项OmsOrderItem赋值
// orderAddDTO中包含了一个OrderItemAddDTO类型的集合
// 我们需要将这个集合转换为OmsOrderItem类型
// 首先如果OrderItemAddDTO集合是空,是要抛出异常的
List<OrderItemAddDTO> itemAddDTOs=orderAddDTO.getOrderItems();
if(itemAddDTOs==null || itemAddDTOs.isEmpty()){
// 如果订单参数中一件商品都没有,就无法继续生成订单了
throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,
"订单中必须至少包含一件商品");
}
// 先将要获得的最终结果的集合实例化
List<OmsOrderItem> omsOrderItems=new ArrayList<>();
// 遍历DTO的集合
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);
// 第二部分:执行数据库操作
// 我们减少库存和删除选中的购物车信息都是有skuId作为依据的
// 所以上述两个操作在当前循环中继续编写即可
// 1.减少库存
// 获得skuId
Long skuId=orderItem.getSkuId();
// 执行减少库存的方法(dubbo调用product模块写好的功能)
int rows=dubboSkuService.reduceStockNum(skuId,orderItem.getQuantity());
// 判断执行修改影响的行数
if(rows==0){
log.</