Update SubmitOrderListener.java

cyj
pbvfus8to 2 months ago
parent 9ec893deb7
commit fe3a23381f

@ -38,6 +38,8 @@ import java.util.*;
/** /**
* *
*
*
* *
* @author LGH * @author LGH
*/ */
@ -45,114 +47,141 @@ import java.util.*;
@AllArgsConstructor @AllArgsConstructor
public class SubmitOrderListener { public class SubmitOrderListener {
// 用于处理用户地址相关的订单服务,比如保存用户地址信息等操作
private final UserAddrOrderService userAddrOrderService; private final UserAddrOrderService userAddrOrderService;
// 用于处理商品相关业务逻辑的服务,例如获取商品信息等
private final ProductService productService; private final ProductService productService;
// 用于处理商品库存单元SKU相关业务逻辑的服务比如获取SKU信息等
private final SkuService skuService; private final SkuService skuService;
// 雪花算法工具类,用于生成唯一的订单编号等
private final Snowflake snowflake; private final Snowflake snowflake;
// 订单商品项数据访问层接口,用于操作订单商品项相关的数据,比如插入、更新等操作
private final OrderItemMapper orderItemMapper; private final OrderItemMapper orderItemMapper;
// SKU数据访问层接口用于操作SKU相关的数据比如更新库存等操作
private final SkuMapper skuMapper; private final SkuMapper skuMapper;
// 商品数据访问层接口,用于操作商品相关的数据,比如更新库存等操作
private final ProductMapper productMapper; private final ProductMapper productMapper;
// 订单数据访问层接口,用于操作订单相关的数据,比如插入、更新订单信息等操作
private final OrderMapper orderMapper; private final OrderMapper orderMapper;
// 订单结算数据访问层接口,用于操作订单结算相关的数据,比如插入订单结算记录等操作
private final OrderSettlementMapper orderSettlementMapper; private final OrderSettlementMapper orderSettlementMapper;
// 购物车数据访问层接口,用于操作购物车相关的数据,比如删除购物车中的商品等操作
private final BasketMapper basketMapper; private final BasketMapper basketMapper;
/** /**
* *
* SubmitOrderEvent
*
*
* @param event
*/ */
@EventListener(SubmitOrderEvent.class) @EventListener(SubmitOrderEvent.class)
@Order(SubmitOrderOrder.DEFAULT) @Order(SubmitOrderOrder.DEFAULT)
public void defaultSubmitOrderListener(SubmitOrderEvent event) { public void defaultSubmitOrderListener(SubmitOrderEvent event) {
// 获取当前时间,用于后续设置创建时间等时间相关的属性
Date now = new Date(); Date now = new Date();
// 获取当前登录用户的ID用于关联订单与用户等操作
String userId = SecurityUtils.getUser().getUserId(); String userId = SecurityUtils.getUser().getUserId();
// 获取合并后的订单信息对象,包含了多个店铺的订单以及相关的商品、地址等信息
ShopCartOrderMergerDto mergerOrder = event.getMergerOrder(); ShopCartOrderMergerDto mergerOrder = event.getMergerOrder();
// 订单商品参数 // 订单商品参数,即包含了各个店铺下的订单商品信息列表
List<ShopCartOrderDto> shopCartOrders = mergerOrder.getShopCartOrders(); List<ShopCartOrderDto> shopCartOrders = mergerOrder.getShopCartOrders();
// 用于存储需要删除的购物车商品ID列表后续会根据这个列表删除购物车中的对应商品
List<Long> basketIds = new ArrayList<>(); List<Long> basketIds = new ArrayList<>();
// 商品skuId为key 需要更新的sku为value的map // 以商品SKU的ID为键需要更新的SKU对象为值的映射表用于记录商品SKU库存等信息的变化方便后续统一更新库存
Map<Long, Sku> skuStocksMap = new HashMap<>(16); Map<Long, Sku> skuStocksMap = new HashMap<>(16);
// 商品productId为key 需要更新的product为value的map // 以商品的ID为键需要更新的商品对象为值的映射表用于记录商品库存等信息的变化方便后续统一更新库存
Map<Long, Product> prodStocksMap = new HashMap<>(16); Map<Long, Product> prodStocksMap = new HashMap<>(16);
// 把订单地址保存到数据库 // 把订单地址保存到数据库
// 通过属性拷贝将合并订单中的用户地址信息复制到用户地址订单对象中
UserAddrOrder userAddrOrder = BeanUtil.copyProperties(mergerOrder.getUserAddr(), UserAddrOrder.class); UserAddrOrder userAddrOrder = BeanUtil.copyProperties(mergerOrder.getUserAddr(), UserAddrOrder.class);
if (userAddrOrder == null) { if (userAddrOrder == null) {
// 如果地址信息为空,则抛出异常,提示用户需要填写收货地址
throw new YamiShopBindException("请填写收货地址"); throw new YamiShopBindException("请填写收货地址");
} }
userAddrOrder.setUserId(userId); userAddrOrder.setUserId(userId);
userAddrOrder.setCreateTime(now); userAddrOrder.setCreateTime(now);
// 调用服务层方法保存用户地址订单信息到数据库中
userAddrOrderService.save(userAddrOrder); userAddrOrderService.save(userAddrOrder);
// 订单地址id // 获取保存后的订单地址ID后续订单信息会关联该地址ID
Long addrOrderId = userAddrOrder.getAddrOrderId(); Long addrOrderId = userAddrOrder.getAddrOrderId();
// 每个店铺生成一个订单,遍历各个店铺的订单商品信息列表进行订单创建等操作
// 每个店铺生成一个订单
for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) { for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) {
createOrder(event, now, userId, basketIds, skuStocksMap, prodStocksMap, addrOrderId, shopCartOrderDto); createOrder(event, now, userId, basketIds, skuStocksMap, prodStocksMap, addrOrderId, shopCartOrderDto);
} }
// 删除购物车的商品信息 // 如果存在需要删除的购物车商品ID则调用购物车数据访问层方法删除购物车中对应商品
if (!basketIds.isEmpty()) { if (!basketIds.isEmpty()) {
basketMapper.deleteShopCartItemsByBasketIds(userId, basketIds); basketMapper.deleteShopCartItemsByBasketIds(userId, basketIds);
} }
// 遍历SKU库存映射表更新每个SKU的库存信息
// 更新sku库存
skuStocksMap.forEach((key, sku) -> { skuStocksMap.forEach((key, sku) -> {
// 调用SKU数据访问层的方法更新库存如果更新的行数为0表示库存更新失败可能库存不足等原因
if (skuMapper.updateStocks(sku) == 0) { if (skuMapper.updateStocks(sku) == 0) {
// 如果库存更新失败清除对应SKU的缓存通过SKU服务层方法并抛出库存不足的异常提示用户对应商品库存不足
skuService.removeSkuCacheBySkuId(key, sku.getProdId()); skuService.removeSkuCacheBySkuId(key, sku.getProdId());
throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足"); throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足");
} }
}); });
// 更新商品库存 // 遍历商品库存映射表,更新每个商品库存信息
prodStocksMap.forEach((prodId, prod) -> { prodStocksMap.forEach((prodId, prod) -> {
// 调用商品数据访问层的方法更新库存如果更新的行数为0表示库存更新失败可能库存不足等原因
if (productMapper.updateStocks(prod) == 0) { if (productMapper.updateStocks(prod) == 0) {
// 如果库存更新失败,清除对应商品的缓存(通过商品服务层方法),并抛出库存不足的异常,提示用户对应商品库存不足
productService.removeProductCacheByProdId(prodId); productService.removeProductCacheByProdId(prodId);
throw new YamiShopBindException("商品:[" + prod.getProdName() + "]库存不足"); throw new YamiShopBindException("商品:[" + prod.getProdName() + "]库存不足");
} }
}); });
} }
/**
*
*
* ID
*
* @param event
* @param now
* @param userId ID
* @param basketIds ID
* @param skuStocksMap SKUIDSKUSKU
* @param prodStocksMap ID
* @param addrOrderId ID
* @param shopCartOrderDto
*/
private void createOrder(SubmitOrderEvent event, Date now, String userId, List<Long> basketIds, Map<Long, Sku> skuStocksMap, Map<Long, Product> prodStocksMap, Long addrOrderId, ShopCartOrderDto shopCartOrderDto) { private void createOrder(SubmitOrderEvent event, Date now, String userId, List<Long> basketIds, Map<Long, Sku> skuStocksMap, Map<Long, Product> prodStocksMap, Long addrOrderId, ShopCartOrderDto shopCartOrderDto) {
// 使用雪花算法生成的订单号 // 使用雪花算法生成唯一的订单,并转换为字符串类型
String orderNumber = String.valueOf(snowflake.nextId()); String orderNumber = String.valueOf(snowflake.nextId());
shopCartOrderDto.setOrderNumber(orderNumber); shopCartOrderDto.setOrderNumber(orderNumber);
// 获取店铺的ID用于关联订单与店铺
Long shopId = shopCartOrderDto.getShopId(); Long shopId = shopCartOrderDto.getShopId();
// 订单商品名称 // 用于构建订单商品名称字符串,将各个商品名称拼接起来,方便展示订单包含的商品信息
StringBuilder orderProdName = new StringBuilder(100); StringBuilder orderProdName = new StringBuilder(100);
// 用于存储该订单下的各个订单商品项信息,后续会将这些商品项关联到订单对象中
List<OrderItem> orderItems = new ArrayList<>(); List<OrderItem> orderItems = new ArrayList<>();
// 获取店铺订单下的商品折扣信息列表,每个商品折扣信息对象包含了多个商品项信息
List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts(); List<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts();
for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) { for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
// 获取每个商品折扣信息对象下的商品项信息列表
List<ShopCartItemDto> shopCartItems = shopCartItemDiscount.getShopCartItems(); List<ShopCartItemDto> shopCartItems = shopCartItemDiscount.getShopCartItems();
for (ShopCartItemDto shopCartItem : shopCartItems) { for (ShopCartItemDto shopCartItem : shopCartItems) {
// 检查并获取商品的SKU信息同时更新SKU库存映射表如果需要并处理库存不足等异常情况
Sku sku = checkAndGetSku(shopCartItem.getSkuId(), shopCartItem, skuStocksMap); Sku sku = checkAndGetSku(shopCartItem.getSkuId(), shopCartItem, skuStocksMap);
// 检查并获取商品信息,同时更新商品库存映射表(如果需要),并处理库存不足等异常情况
Product product = checkAndGetProd(shopCartItem.getProdId(), shopCartItem, prodStocksMap); Product product = checkAndGetProd(shopCartItem.getProdId(), shopCartItem, prodStocksMap);
// 根据获取到的商品、SKU以及其他相关信息构建订单商品项对象
OrderItem orderItem = getOrderItem(now, userId, orderNumber, shopId, orderProdName, shopCartItem, sku, product); OrderItem orderItem = getOrderItem(now, userId, orderNumber, shopId, orderProdName, shopCartItem, sku, product);
orderItems.add(orderItem); orderItems.add(orderItem);
@ -161,20 +190,19 @@ public class SubmitOrderListener {
basketIds.add(shopCartItem.getBasketId()); basketIds.add(shopCartItem.getBasketId());
} }
} }
} }
// 对订单商品名称字符串进行处理,截取合适的长度,并去除末尾多余的逗号(如果有)
orderProdName.subSequence(0, Math.min(orderProdName.length() - 1, 100)); orderProdName.subSequence(0, Math.min(orderProdName.length() - 1, 100));
if (orderProdName.lastIndexOf(Constant.COMMA) == orderProdName.length() - 1) { if (orderProdName.lastIndexOf(Constant.COMMA) == orderProdName.length() - 1) {
orderProdName.deleteCharAt(orderProdName.length() - 1); orderProdName.deleteCharAt(orderProdName.length() - 1);
} }
// 根据订单相关信息构建订单对象包括店铺ID、订单编号、商品名称、用户ID、金额等各种属性
// 订单信息
com.yami.shop.bean.model.Order order = getOrder(now, userId, addrOrderId, shopCartOrderDto, orderNumber, shopId, orderProdName, orderItems); com.yami.shop.bean.model.Order order = getOrder(now, userId, addrOrderId, shopCartOrderDto, orderNumber, shopId, orderProdName, orderItems);
event.getOrders().add(order); event.getOrders().add(order);
// 插入订单结算表
// 插入订单结算数据构建订单结算对象并设置相关属性如用户ID、是否结算、创建时间、订单编号、支付金额等然后插入到数据库中
OrderSettlement orderSettlement = new OrderSettlement(); OrderSettlement orderSettlement = new OrderSettlement();
orderSettlement.setUserId(userId); orderSettlement.setUserId(userId);
orderSettlement.setIsClearing(0); orderSettlement.setIsClearing(0);
@ -186,19 +214,35 @@ public class SubmitOrderListener {
orderSettlementMapper.insert(orderSettlement); orderSettlementMapper.insert(orderSettlement);
} }
/**
*
* IDIDID
* IDID
*
* @param now
* @param userId IDID
* @param addrOrderId IDID
* @param shopCartOrderDto
* @param orderNumber
* @param shopId IDID
* @param orderProdName
* @param orderItems
* @return
*/
private com.yami.shop.bean.model.Order getOrder(Date now, String userId, Long addrOrderId, ShopCartOrderDto shopCartOrderDto, String orderNumber, Long shopId, StringBuilder orderProdName, List<OrderItem> orderItems) { private com.yami.shop.bean.model.Order getOrder(Date now, String userId, Long addrOrderId, ShopCartOrderDto shopCartOrderDto, String orderNumber, Long shopId, StringBuilder orderProdName, List<OrderItem> orderItems) {
com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order(); com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order();
order.setShopId(shopId); order.setShopId(shopId);
order.setOrderNumber(orderNumber); order.setOrderNumber(orderNumber);
// 订单商品名称 // 设置订单商品名称属性
order.setProdName(orderProdName.toString()); order.setProdName(orderProdName.toString());
// 用户id // 设置用户ID属性
order.setUserId(userId); order.setUserId(userId);
// 商品总额 // 设置商品总额属性,从店铺订单信息中获取
order.setTotal(shopCartOrderDto.getTotal()); order.setTotal(shopCartOrderDto.getTotal());
// 实际总额 // 设置实际总额属性,从店铺订单信息中获取
order.setActualTotal(shopCartOrderDto.getActualTotal()); order.setActualTotal(shopCartOrderDto.getActualTotal());
// 设置订单状态为未支付状态(通过枚举值表示)
order.setStatus(OrderStatus.UNPAY.value()); order.setStatus(OrderStatus.UNPAY.value());
order.setUpdateTime(now); order.setUpdateTime(now);
order.setCreateTime(now); order.setCreateTime(now);
@ -206,6 +250,7 @@ public class SubmitOrderListener {
order.setDeleteStatus(0); order.setDeleteStatus(0);
order.setProductNums(shopCartOrderDto.getTotalCount()); order.setProductNums(shopCartOrderDto.getTotalCount());
order.setAddrOrderId(addrOrderId); order.setAddrOrderId(addrOrderId);
// 计算并设置优惠金额属性,通过商品总额、运费和实际总额进行计算
order.setReduceAmount(Arith.sub(Arith.add(shopCartOrderDto.getTotal(), shopCartOrderDto.getTransfee()), shopCartOrderDto.getActualTotal())); order.setReduceAmount(Arith.sub(Arith.add(shopCartOrderDto.getTotal(), shopCartOrderDto.getTransfee()), shopCartOrderDto.getActualTotal()));
order.setFreightAmount(shopCartOrderDto.getTransfee()); order.setFreightAmount(shopCartOrderDto.getTransfee());
order.setRemarks(shopCartOrderDto.getRemarks()); order.setRemarks(shopCartOrderDto.getRemarks());
@ -214,90 +259,14 @@ public class SubmitOrderListener {
return order; return order;
} }
private OrderItem getOrderItem(Date now, String userId, String orderNumber, Long shopId, StringBuilder orderProdName, ShopCartItemDto shopCartItem, Sku sku, Product product) { /**
OrderItem orderItem = new OrderItem(); *
orderItem.setShopId(shopId); * IDIDSKU
orderItem.setOrderNumber(orderNumber); * IDIDSKU IDSKUID
orderItem.setProdId(sku.getProdId()); *
orderItem.setSkuId(sku.getSkuId()); * @param now
orderItem.setSkuName(sku.getSkuName()); * @param userId IDID
orderItem.setProdCount(shopCartItem.getProdCount()); * @param orderNumber
orderItem.setProdName(sku.getProdName()); * @param shopId IDID
orderItem.setPic(StrUtil.isBlank(sku.getPic()) ? product.getPic() : sku.getPic()); * @param orderProdName
orderItem.setPrice(shopCartItem.getPrice()); * @param shopCartItem
orderItem.setUserId(userId);
orderItem.setProductTotalAmount(shopCartItem.getProductTotalAmount());
orderItem.setRecTime(now);
orderItem.setCommSts(0);
orderItem.setBasketDate(shopCartItem.getBasketDate());
orderProdName.append(orderItem.getProdName()).append(",");
//推广员卡号
orderItem.setDistributionCardNo(shopCartItem.getDistributionCardNo());
return orderItem;
}
@SuppressWarnings({"Duplicates"})
private Product checkAndGetProd(Long prodId, ShopCartItemDto shopCartItem, Map<Long, Product> prodStocksMap) {
Product product = productService.getProductByProdId(prodId);
if (product == null) {
throw new YamiShopBindException("购物车包含无法识别的商品");
}
if (product.getStatus() != 1) {
throw new YamiShopBindException("商品[" + product.getProdName() + "]已下架");
}
// 商品需要改变的库存
Product mapProduct = prodStocksMap.get(prodId);
if (mapProduct == null) {
mapProduct = new Product();
mapProduct.setTotalStocks(0);
mapProduct.setProdId(prodId);
mapProduct.setProdName(product.getProdName());
}
if (product.getTotalStocks() != -1) {
mapProduct.setTotalStocks(mapProduct.getTotalStocks() + shopCartItem.getProdCount());
prodStocksMap.put(product.getProdId(), mapProduct);
}
// -1为无限库存
if (product.getTotalStocks() != -1 && mapProduct.getTotalStocks() > product.getTotalStocks()) {
throw new YamiShopBindException("商品:[" + product.getProdName() + "]库存不足");
}
return product;
}
@SuppressWarnings({"Duplicates"})
private Sku checkAndGetSku(Long skuId, ShopCartItemDto shopCartItem, Map<Long, Sku> skuStocksMap) {
// 获取sku信息
Sku sku = skuService.getSkuBySkuId(skuId);
if (sku == null) {
throw new YamiShopBindException("购物车包含无法识别的商品");
}
if (sku.getStatus() != 1) {
throw new YamiShopBindException("商品[" + sku.getProdName() + "]已下架");
}
// -1为无限库存
if (sku.getStocks() != -1 && shopCartItem.getProdCount() > sku.getStocks()) {
throw new YamiShopBindException("商品:[" + sku.getProdName() + "]库存不足");
}
if (sku.getStocks() != -1) {
Sku mapSku = new Sku();
mapSku.setProdId(sku.getProdId());
// 这里的库存是改变的库存
mapSku.setStocks(shopCartItem.getProdCount());
mapSku.setSkuId(sku.getSkuId());
mapSku.setProdName(sku.getProdName());
skuStocksMap.put(sku.getSkuId(), mapSku);
}
return sku;
}
}
Loading…
Cancel
Save