一,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
)的相关属性。
-
初始化价格和积分信息:
- 初始化总价
total
、优惠价(包括优惠券coupon
、积分integration
和促销promotion
)为BigDecimal
类型的 0。 - 初始化积分总数
integrationTotal
和成长值总数growthTotal
为 0。
- 初始化总价
-
遍历订单项:
- 通过一个
for
循环遍历传入的订单项列表orderItemEntities
。
- 通过一个
-
累加价格和积分信息:
- 对于每个订单项,累加其优惠券金额、促销金额和积分金额到相应的总价中。
- 将每个订单项的实际金额(
RealAmount
)累加到total
。 - 累加每个订单项的积分和成长值到
integrationTotal
和growthTotal
。
-
设置订单实体的价格信息:
- 设置订单的总价
totalAmount
为累加后的total
。 - 设置应付总额
payAmount
为总价加上运费FreightAmount
。 - 设置订单的优惠券金额
couponAmount
、促销金额promotionAmount
和积分金额integrationAmount
为累加后的相应金额。
- 设置订单的总价
-
设置积分和成长值信息:
- 设置订单的积分总数
integration
和成长值总数growth
。
- 设置订单的积分总数
-
设置删除状态:
- 设置订单的删除状态
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
的私有方法,主要用于保存订单及其相关订单项到数据库中。
-
获取订单信息:从
OrderCreateTo
对象中获取OrderEntity
对象,这代表了要保存的订单数据。 -
设置时间戳:为订单实体设置创建时间和修改时间,均设置为当前日期和时间(
new Date()
)。 -
保存订单:调用
baseMapper.insert(order)
方法将订单数据插入到数据库中。这里baseMapper
很可能是 MyBatis 或 MyBatis-Plus 数据库操作框架中使用的 Mapper 接口,用于执行实际的数据库插入操作。 -
获取订单项信息:从
OrderCreateTo
对象中获取包含所有订单项的列表orderItems
。 -
批量保存订单项:使用
orderItemService.saveBatch(orderItems)
方法批量保存所有订单项数据。这里orderItemService
可能是一个服务层组件,负责处理订单项的保存逻辑,saveBatch
方法用于执行批量插入操作。
代码分析
-
日期时间设置:在保存订单之前,代码设置了订单的创建和修改时间,这有助于记录订单的创建时间,并且在需要时可以用于跟踪订单的最后更新时间。
-
数据库操作:代码使用了数据访问层(可能是 MyBatis)的 Mapper 接口来执行数据库的插入操作。这是一种常见的数据持久化方式,可以有效地将数据模型转换为数据库中的记录。
-
批量处理:对于订单项的保存,使用了批量保存方法,这有助于提高性能,尤其是在处理包含大量订单项的订单时。
saveOrder
方法是订单服务中的一个重要环节,负责将订单及其细节持久化到数据库中。这是订单创建流程的关键步骤之一,确保了订单数据的持久化存储。