• 【微服务】Day11(续 开发新增订单功能、静态资源服务器)


    续 开发新增订单功能

    开发新增订单的业务逻辑层

    我们完成订单的新增业务是比较复杂的

    可以将整个业务分成三大部分

    第一部分是信息的收集

    主要是参数类型数据的完整性验证,计算以及转换

    第二部分是数据库操作

    减少库存,删除购物车,新增订单,和新增订单项

    第三部分是收集需要的返回值

    我们新增订单成功后,要返回给前端一些信息,例如订单号,实际支付金额等

    创建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
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
  • 相关阅读:
    论文研究区域图的制作方法:ArcGIS
    安防监控系统EasyCVR视频汇聚平台设备树收藏按钮的细节优化
    神舟通用数据库
    Linux-yum
    细胞CLE19多肽荧光成像牛血清白蛋白荧光猝灭量子点的制备
    JavaScript 里的 Promise Chaining
    Java和JavaScript区别与联系
    项目管理工具的功能与帮助一览
    Github创建远程仓库(项目)
    BUUCTF-WEB-刷题记录
  • 原文地址:https://blog.csdn.net/shortcutsuccess/article/details/127429650