JSD-2204-(业务逻辑开发)-新增订单-查询订单-Day11

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.删除购物车信息
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值