|
|
@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* https://www.mall4j.com/
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 未经允许,不可做商业用途!
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 版权所有,侵权必究!
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package com.yami.shop.api.listener; // 定义类所在的包
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.yami.shop.bean.app.dto.ShopCartItemDto; // 引入购物车项目DTO
|
|
|
|
|
|
|
|
import com.yami.shop.bean.app.dto.ShopCartOrderDto; // 引入购物车订单DTO
|
|
|
|
|
|
|
|
import com.yami.shop.bean.app.param.OrderParam; // 引入订单参数
|
|
|
|
|
|
|
|
import com.yami.shop.bean.event.ConfirmOrderEvent; // 引入确认订单事件
|
|
|
|
|
|
|
|
import com.yami.shop.bean.model.Product; // 引入商品模型
|
|
|
|
|
|
|
|
import com.yami.shop.bean.model.Sku; // 引入SKU模型
|
|
|
|
|
|
|
|
import com.yami.shop.bean.model.UserAddr; // 引入用户地址模型
|
|
|
|
|
|
|
|
import com.yami.shop.bean.order.ConfirmOrderOrder; // 引入确认订单顺序
|
|
|
|
|
|
|
|
import com.yami.shop.common.exception.YamiShopBindException; // 引入自定义异常类
|
|
|
|
|
|
|
|
import com.yami.shop.common.util.Arith; // 引入算术工具类
|
|
|
|
|
|
|
|
import com.yami.shop.security.api.util.SecurityUtils; // 引入安全工具类
|
|
|
|
|
|
|
|
import com.yami.shop.service.ProductService; // 引入商品服务类
|
|
|
|
|
|
|
|
import com.yami.shop.service.SkuService; // 引入SKU服务类
|
|
|
|
|
|
|
|
import com.yami.shop.service.TransportManagerService; // 引入运输管理服务类
|
|
|
|
|
|
|
|
import com.yami.shop.service.UserAddrService; // 引入用户地址服务类
|
|
|
|
|
|
|
|
import lombok.AllArgsConstructor; // 引入Lombok的@AllArgsConstructor注解
|
|
|
|
|
|
|
|
import org.springframework.context.event.EventListener; // 引入Spring的事件监听注解
|
|
|
|
|
|
|
|
import org.springframework.core.annotation.Order; // 引入Spring的Order注解
|
|
|
|
|
|
|
|
import org.springframework.stereotype.Component; // 引入Spring的Component注解
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 确认订单信息时的默认操作
|
|
|
|
|
|
|
|
* ConfirmOrderListener类处理确认订单时的默认操作,包括计算订单金额、商品检查和运费计算等。
|
|
|
|
|
|
|
|
* @作者 LGH
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Component("defaultConfirmOrderListener") // 标注这是一个Spring组件,并且以defaultConfirmOrderListener为组件名称
|
|
|
|
|
|
|
|
@AllArgsConstructor // 使用Lombok注解生成全参构造函数
|
|
|
|
|
|
|
|
public class ConfirmOrderListener {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final UserAddrService userAddrService; // 自动注入用户地址服务类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final TransportManagerService transportManagerService; // 自动注入运输管理服务类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final ProductService productService; // 自动注入商品服务类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final SkuService skuService; // 自动注入SKU服务类
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 计算订单金额
|
|
|
|
|
|
|
|
* @param event 确认订单事件
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@EventListener(ConfirmOrderEvent.class) // 标注这是一个事件监听器,监听ConfirmOrderEvent事件
|
|
|
|
|
|
|
|
@Order(ConfirmOrderOrder.DEFAULT) // 设置事件监听的顺序
|
|
|
|
|
|
|
|
public void defaultConfirmOrderEvent(ConfirmOrderEvent event) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ShopCartOrderDto shopCartOrderDto = event.getShopCartOrderDto(); // 获取购物车订单DTO
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OrderParam orderParam = event.getOrderParam(); // 获取订单参数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String userId = SecurityUtils.getUser().getUserId(); // 获取当前用户ID
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 订单的地址信息
|
|
|
|
|
|
|
|
UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double total = 0.0; // 总金额
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int totalCount = 0; // 总商品数量
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double transfee = 0.0; // 总运费
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (ShopCartItemDto shopCartItem : event.getShopCartItems()) {
|
|
|
|
|
|
|
|
// 获取商品信息
|
|
|
|
|
|
|
|
Product product = productService.getProductByProdId(shopCartItem.getProdId());
|
|
|
|
|
|
|
|
// 获取sku信息
|
|
|
|
|
|
|
|
Sku sku = skuService.getSkuBySkuId(shopCartItem.getSkuId());
|
|
|
|
|
|
|
|
if (product == null || sku == null) {
|
|
|
|
|
|
|
|
throw new YamiShopBindException("购物车包含无法识别的商品"); // 商品或SKU为空,抛出异常
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (product.getStatus() != 1 || sku.getStatus() != 1) {
|
|
|
|
|
|
|
|
throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架"); // 商品或SKU已下架,抛出异常
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
totalCount = shopCartItem.getProdCount() + totalCount; // 累加商品数量
|
|
|
|
|
|
|
|
total = Arith.add(shopCartItem.getProductTotalAmount(), total); // 累加商品总金额
|
|
|
|
|
|
|
|
// 用户地址如果为空,则表示该用户从未设置过任何地址相关信息
|
|
|
|
|
|
|
|
if (userAddr != null) {
|
|
|
|
|
|
|
|
// 每个产品的运费相加
|
|
|
|
|
|
|
|
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); // 设置订单总运费
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|