Update ConfirmOrderListener.java

cyj
pbvfus8to 8 months ago
parent a22c1decd0
commit cbe72dfc20

@ -31,69 +31,105 @@ import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
*
* ConfirmOrderEvent
*
*
*
* @author LGH
*/
@Component("defaultConfirmOrderListener")
@AllArgsConstructor
public class ConfirmOrderListener {
// 通过Lombok生成的构造函数注入UserAddrService用于根据用户地址ID和用户ID获取用户地址信息
// 在后续计算运费等操作中会用到该地址信息。
private final UserAddrService userAddrService;
// 注入TransportManagerService用于根据购物车商品项和用户地址计算运费是订单金额计算的重要组成部分。
private final TransportManagerService transportManagerService;
// 注入ProductService用于根据商品ID获取商品详细信息以验证商品状态以及参与订单金额计算等操作。
private final ProductService productService;
// 注入SkuService用于根据商品规格SkuID获取商品规格详细信息同样用于验证商品状态和相关金额计算等操作。
private final SkuService skuService;
/**
*
* ConfirmOrderEvent
* @EventListener 使
* @Order
*
* 1. ShopCartOrderDtoOrderParam
* 2. IDIDID
* 3. IDIDUserAddrService
* 4.
* - ProductServiceSkuService
* - 1
* -
* - TransportManagerService
* -
*
* @param event
*/
@EventListener(ConfirmOrderEvent.class)
@Order(ConfirmOrderOrder.DEFAULT)
public void defaultConfirmOrderEvent(ConfirmOrderEvent event) {
// 从确认订单事件对象中获取购物车订单信息,包含了订单整体的一些汇总信息以及后续需要更新的金额等相关属性。
ShopCartOrderDto shopCartOrderDto = event.getShopCartOrderDto();
// 从确认订单事件对象中获取订单参数其中包含了如用户选择的收货地址ID等关键信息用于后续查询地址等操作。
OrderParam orderParam = event.getOrderParam();
// 通过SecurityUtils工具类获取当前用户的ID用于后续根据用户ID来查询与之相关的用户地址等信息。
String userId = SecurityUtils.getUser().getUserId();
// 订单的地址信息
// 根据订单参数中的地址ID和当前用户ID通过UserAddrService获取用户地址信息该地址信息将用于计算运费等操作若不存在地址则返回null。
UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId);
// 初始化订单总金额为0.0,后续会累加每个商品项的金额得到最终的订单总金额。
double total = 0.0;
// 初始化商品总数量为0在遍历购物车商品项时会累加每个商品项的数量得到总的商品数量。
int totalCount = 0;
// 初始化运费为0.0,后续会根据每个商品项以及用户地址计算运费并累加得到总的运费。
double transfee = 0.0;
// 遍历购物车中的每个商品项,对每个商品项进行相关的信息获取、状态验证以及金额计算等操作。
for (ShopCartItemDto shopCartItem : event.getShopCartItems()) {
// 获取商品信息
// 通过ProductService根据商品ID获取商品详细信息,用于后续验证商品状态以及参与金额计算等操作。
Product product = productService.getProductByProdId(shopCartItem.getProdId());
// 获取sku信息
// 通过SkuService根据商品规格ID获取商品规格详细信息同样用于验证商品状态和参与金额计算等操作。
Sku sku = skuService.getSkuBySkuId(shopCartItem.getSkuId());
if (product == null || sku == null) {
throw new YamiShopBindException("购物车包含无法识别的商品");
}
if (product.getStatus() != 1 || sku.getStatus() != 1) {
if (product.getStatus()!= 1 || sku.getStatus()!= 1) {
throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架");
}
// 累加商品数量,将当前商品项的数量累加到总商品数量中。
totalCount = shopCartItem.getProdCount() + totalCount;
// 使用Arith工具类可能是自定义的用于精确计算的工具类将当前商品项的金额累加到总金额中得到订单的商品总金额。
total = Arith.add(shopCartItem.getProductTotalAmount(), total);
// 用户地址如果为空,则表示该用户从未设置过任何地址相关信息
if (userAddr != null) {
// 每个产品的运费相加
// 用户地址如果不为空,则表示用户设置了收货地址,需要计算该商品项对应的运费并累加到总运费中。
if (userAddr!= null) {
// 调用TransportManagerService的方法计算当前商品项对应的运费传入商品项和用户地址信息作为参数
// 并将计算得到的运费累加到总运费中,实现运费的累加计算。
transfee = Arith.add(transfee, transportManagerService.calculateTransfee(shopCartItem, userAddr));
}
// 设置商品项的实际总价(这里暂设置为商品项原本的金额,可能后续还有其他逻辑调整)。
shopCartItem.setActualTotal(shopCartItem.getProductTotalAmount());
// 更新购物车订单信息中的实际总价,将商品总金额和运费相加得到最终的实际总价。
shopCartOrderDto.setActualTotal(Arith.add(total, transfee));
// 更新购物车订单信息中的总金额,即商品总金额(不包含运费)。
shopCartOrderDto.setTotal(total);
// 更新购物车订单信息中的商品总数量。
shopCartOrderDto.setTotalCount(totalCount);
// 更新购物车订单信息中的运费。
shopCartOrderDto.setTransfee(transfee);
}
}
}
}
Loading…
Cancel
Save