谷粒商城实战笔记-279~280-商城业务-订单服务-订单验价-保存订单

文章目录

  • 一,279-商城业务-订单服务-订单验价
    • 1,创建订单时计算总价
      • 代码分析
    • 2,比较总价
  • 二,280-商城业务-订单服务-保存订单数据
    • 代码分析

一,279-商城业务-订单服务-订单验价

这一节的主要内容是验价:

  • 前端从购物车到confirm界面会算一次总价
  • 提交订单生成订单时会重新计算一次总价
  • 比较这两次总价

1,创建订单时计算总价

/**
     * 计算价格价格的方法
     * @param orderEntity
     * @param orderItemEntities
     */
    private void computePrice(OrderEntity orderEntity, List<OrderItemEntity> orderItemEntities) {

        //总价
        BigDecimal total = new BigDecimal("0.0");
        //优惠价
        BigDecimal coupon = new BigDecimal("0.0");
        BigDecimal intergration = new BigDecimal("0.0");
        BigDecimal promotion = new BigDecimal("0.0");

        //积分、成长值
        Integer integrationTotal = 0;
        Integer growthTotal = 0;

        //订单总额,叠加每一个订单项的总额信息
        for (OrderItemEntity orderItem : orderItemEntities) {
            //优惠价格信息
            coupon = coupon.add(orderItem.getCouponAmount());
            promotion = promotion.add(orderItem.getPromotionAmount());
            intergration = intergration.add(orderItem.getIntegrationAmount());

            //总价
            total = total.add(orderItem.getRealAmount());

            //积分信息和成长值信息
            integrationTotal += orderItem.getGiftIntegration();
            growthTotal += orderItem.getGiftGrowth();

        }
        //1、订单价格相关的
        orderEntity.setTotalAmount(total);
        //设置应付总额(总额+运费)
        orderEntity.setPayAmount(total.add(orderEntity.getFreightAmount()));
        orderEntity.setCouponAmount(coupon);
        orderEntity.setPromotionAmount(promotion);
        orderEntity.setIntegrationAmount(intergration);

        //设置积分成长值信息
        orderEntity.setIntegration(integrationTotal);
        orderEntity.setGrowth(growthTotal);

        //设置删除状态(0-未删除,1-已删除)
        orderEntity.setDeleteStatus(0);

    }

这段代码定义了一个名为 computePrice 的方法,其主要作用是计算和核对订单及其订单项的总价格,并更新订单实体(OrderEntity)的相关属性。

  1. 初始化价格和积分信息

    • 初始化总价 total、优惠价(包括优惠券 coupon、积分 integration 和促销 promotion)为 BigDecimal 类型的 0。
    • 初始化积分总数 integrationTotal 和成长值总数 growthTotal 为 0。
  2. 遍历订单项

    • 通过一个 for 循环遍历传入的订单项列表 orderItemEntities
  3. 累加价格和积分信息

    • 对于每个订单项,累加其优惠券金额、促销金额和积分金额到相应的总价中。
    • 将每个订单项的实际金额(RealAmount)累加到 total
    • 累加每个订单项的积分和成长值到 integrationTotalgrowthTotal
  4. 设置订单实体的价格信息

    • 设置订单的总价 totalAmount 为累加后的 total
    • 设置应付总额 payAmount 为总价加上运费 FreightAmount
    • 设置订单的优惠券金额 couponAmount、促销金额 promotionAmount 和积分金额 integrationAmount 为累加后的相应金额。
  5. 设置积分和成长值信息

    • 设置订单的积分总数 integration 和成长值总数 growth
  6. 设置删除状态

    • 设置订单的删除状态 deleteStatus 为 0,表示订单未被删除。

代码分析

  • BigDecimal 类型:使用 BigDecimal 类型来处理价格计算,以确保精度,避免浮点数运算的精度问题。

  • 累加逻辑:通过累加每个订单项的实际金额和优惠金额来计算订单的总价和应付总额。

  • 积分和成长值:订单项可能包含积分和成长值,这些值在订单创建时进行累加,以便为用户提供相应的积分和成长值。

  • 状态设置:除了价格信息,该方法还设置了订单的删除状态,这是一个好的做法,确保订单实体的完整性。

  • 参数传递:该方法接受一个订单实体和一个订单项列表作为参数,基于这些信息执行价格计算。

整体来看,computePrice 方法是订单处理流程中的一个关键步骤,确保了订单价格的准确性和订单信息的完整性。

2,比较总价

如果总价相差过大,需要用户确认。

//2、验证价格
            BigDecimal payAmount = order.getOrder().getPayAmount();
            BigDecimal payPrice = vo.getPayPrice();

            if (Math.abs(payAmount.subtract(payPrice).doubleValue()) < 0.01) {
               // 创建订单
            } else {
               // 返回给前端,提示总价有较大变化
            }

二,280-商城业务-订单服务-保存订单数据

这一节的主要内容生保存订单数据,把订单头和订单明细的数据保存到数据库中。

private void saveOrder(OrderCreateTo orderCreateTo) {

        //获取订单信息
        OrderEntity order = orderCreateTo.getOrder();
        order.setModifyTime(new Date());
        order.setCreateTime(new Date());
        //保存订单
        this.baseMapper.insert(order);

        //获取订单项信息
        List<OrderItemEntity> orderItems = orderCreateTo.getOrderItems();
        //批量保存订单项数据
        orderItemService.saveBatch(orderItems);
    }

这段代码定义了一个名为 saveOrder 的私有方法,主要用于保存订单及其相关订单项到数据库中。

  1. 获取订单信息:从 OrderCreateTo 对象中获取 OrderEntity 对象,这代表了要保存的订单数据。

  2. 设置时间戳:为订单实体设置创建时间和修改时间,均设置为当前日期和时间(new Date())。

  3. 保存订单:调用 baseMapper.insert(order) 方法将订单数据插入到数据库中。这里 baseMapper 很可能是 MyBatis 或 MyBatis-Plus 数据库操作框架中使用的 Mapper 接口,用于执行实际的数据库插入操作。

  4. 获取订单项信息:从 OrderCreateTo 对象中获取包含所有订单项的列表 orderItems

  5. 批量保存订单项:使用 orderItemService.saveBatch(orderItems) 方法批量保存所有订单项数据。这里 orderItemService 可能是一个服务层组件,负责处理订单项的保存逻辑,saveBatch 方法用于执行批量插入操作。

代码分析

  • 日期时间设置:在保存订单之前,代码设置了订单的创建和修改时间,这有助于记录订单的创建时间,并且在需要时可以用于跟踪订单的最后更新时间。

  • 数据库操作:代码使用了数据访问层(可能是 MyBatis)的 Mapper 接口来执行数据库的插入操作。这是一种常见的数据持久化方式,可以有效地将数据模型转换为数据库中的记录。

  • 批量处理:对于订单项的保存,使用了批量保存方法,这有助于提高性能,尤其是在处理包含大量订单项的订单时。

saveOrder 方法是订单服务中的一个重要环节,负责将订单及其细节持久化到数据库中。这是订单创建流程的关键步骤之一,确保了订单数据的持久化存储。

你可能感兴趣的:(谷粒商城,笔记,谷粒商城)