From 911a52f5541027b8429fa81179a46b96b8189b84 Mon Sep 17 00:00:00 2001 From: dzq Date: Wed, 23 Apr 2025 11:11:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=AE=A2=E5=8D=95):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=AE=A2=E5=8D=95ID=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=98=8E=E7=BB=86=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BA=93=E5=AD=98=E6=89=A3=E5=87=8F=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增`selectByOrderId`方法用于根据订单ID查询商品明细,并将库存扣减逻辑从订单创建时移至支付成功后执行,以避免未支付时库存被占用的问题。 --- .../shop/order/OrderApplicationService.java | 25 +++--------- .../shop/order/db/ShopOrderGoodsMapper.java | 4 ++ .../shop/order/db/ShopOrderGoodsService.java | 4 ++ .../order/db/ShopOrderGoodsServiceImpl.java | 7 ++++ .../domain/shop/order/model/OrderModel.java | 38 +++++++++++++++++-- .../shop/order/model/OrderModelFactory.java | 10 +++-- 6 files changed, 63 insertions(+), 25 deletions(-) diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java index b476d72..285b961 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java @@ -217,12 +217,17 @@ public class OrderApplicationService { // 计算商品金额并验证库存 goodsModel.calculateTotal(); goodsModel.validateQuantity(); + CabinetCellEntity cabinetCellEntity = cabinetCellService.getById(goodsModel.getCellId()); + if (cabinetCellEntity == null || cabinetCellEntity.getStock() < goodsModel.getQuantity()) { + throw new ApiException(ErrorCode.FAILED, "柜子库存不足"); + } // 保存订单商品 goodsModel.insert(); // 扣减库存 - deductGoodsStock(goodsModel.getGoodsId(), goodsModel.getQuantity(), goodsModel.getCellId()); + // 改为收到支付成功后扣减库存 +// deductGoodsStock(goodsModel.getGoodsId(), goodsModel.getQuantity(), goodsModel.getCellId()); totalAmount = totalAmount.add(goodsModel.getTotalAmount()); } @@ -233,24 +238,6 @@ public class OrderApplicationService { orderModel.updateById(); } - private void deductGoodsStock(Long goodsId, Integer quantity, Long cellId) { - CabinetCellEntity cabinetCellEntity = cabinetCellService.getById(cellId); - if (cabinetCellEntity == null || cabinetCellEntity.getStock() < quantity) { - throw new ApiException(ErrorCode.FAILED, "柜子库存不足"); - } - - ShopGoodsEntity goods = goodsService.getById(goodsId); - if (goods == null || goods.getStock() < quantity) { - throw new ApiException(ErrorCode.FAILED, "商品库存不足"); - } - - // 扣减库存 - cabinetCellEntity.setStock(cabinetCellEntity.getStock() - quantity); - cabinetCellService.updateById(cabinetCellEntity); - goods.setStock(goods.getStock() - quantity); - goodsService.updateById(goods); - } - @Transactional public void cancelOrder(Long orderId) { OrderModel orderModel = orderModelFactory.loadById(orderId); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java index a807897..aeed0b4 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Select; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** *

* 订单商品明细表 Mapper 接口 @@ -18,4 +20,6 @@ public interface ShopOrderGoodsMapper extends BaseMapper { @Select("SELECT * FROM shop_order_goods WHERE order_id = #{orderId} AND goods_id = #{goodsId} LIMIT 1") ShopOrderGoodsEntity selectByOrderIdAndGoodsId(@Param("orderId") Long orderId, @Param("goodsId") Long goodsId); + @Select("SELECT * FROM shop_order_goods WHERE order_id = #{orderId} AND deleted = 0") + List selectByOrderId(@Param("orderId") Long orderId); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java index cf6b3f7..78180f6 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java @@ -2,6 +2,8 @@ package com.agileboot.domain.shop.order.db; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** *

* 订单商品明细表 服务类 @@ -12,4 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ShopOrderGoodsService extends IService { ShopOrderGoodsEntity getByOrderIdAndGoodsId(Long orderId, Long goodsId); + + List selectByOrderId(Long orderId); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java index 8279a31..ee37df4 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java @@ -3,6 +3,8 @@ package com.agileboot.domain.shop.order.db; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import java.util.List; + /** *

* 订单商品明细表 服务实现类 @@ -19,4 +21,9 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl selectByOrderId(Long orderId) { + return baseMapper.selectByOrderId(orderId); + } + } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModel.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModel.java index ccb92c8..55475ab 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModel.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModel.java @@ -5,6 +5,10 @@ import cn.hutool.core.date.DateUtil; import com.agileboot.common.config.AgileBootConfig; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.cabinet.cell.db.CabinetCellEntity; +import com.agileboot.domain.cabinet.cell.db.CabinetCellService; +import com.agileboot.domain.shop.goods.db.ShopGoodsEntity; +import com.agileboot.domain.shop.goods.db.ShopGoodsService; import com.agileboot.domain.shop.order.db.ShopOrderEntity; import com.agileboot.domain.shop.order.db.ShopOrderGoodsService; import com.agileboot.domain.shop.order.db.ShopOrderService; @@ -21,18 +25,23 @@ public class OrderModel extends ShopOrderEntity { private ShopOrderService orderService; private ShopOrderGoodsService orderGoodsService; + private CabinetCellService cabinetCellService; + private ShopGoodsService goodsService; public OrderModel(ShopOrderEntity entity, ShopOrderService orderService, - ShopOrderGoodsService orderGoodsService) { - this(orderService, orderGoodsService); + ShopOrderGoodsService orderGoodsService, CabinetCellService cabinetCellService, ShopGoodsService goodsService) { + this(orderService, orderGoodsService, cabinetCellService, goodsService); if (entity != null) { BeanUtil.copyProperties(entity, this); } } - public OrderModel(ShopOrderService orderService, ShopOrderGoodsService orderGoodsService) { + public OrderModel(ShopOrderService orderService, ShopOrderGoodsService orderGoodsService, + CabinetCellService cabinetCellService, ShopGoodsService goodsService) { this.orderService = orderService; this.orderGoodsService = orderGoodsService; + this.cabinetCellService = cabinetCellService; + this.goodsService = goodsService; } public void calculateTotalAmount(List goodsIds) { @@ -85,6 +94,11 @@ public class OrderModel extends ShopOrderEntity { log.error("支付时间转换失败", e); } this.updateById(); + + orderGoodsService.selectByOrderId(this.getOrderId()).forEach(orderGoods -> { + // 扣减库存 + deductGoodsStock(orderGoods.getGoodsId(), orderGoods.getQuantity(), orderGoods.getCellId()); + }); } public void handleRefundSuccess() { @@ -92,4 +106,22 @@ public class OrderModel extends ShopOrderEntity { this.setPayStatus(4); this.updateById(); } + + private void deductGoodsStock(Long goodsId, Integer quantity, Long cellId) { + CabinetCellEntity cabinetCellEntity = cabinetCellService.getById(cellId); + if (cabinetCellEntity == null || cabinetCellEntity.getStock() < quantity) { + throw new ApiException(ErrorCode.FAILED, "柜子库存不足"); + } + + ShopGoodsEntity goods = goodsService.getById(goodsId); + if (goods == null || goods.getStock() < quantity) { + throw new ApiException(ErrorCode.FAILED, "商品库存不足"); + } + + // 扣减库存 + cabinetCellEntity.setStock(cabinetCellEntity.getStock() - quantity); + cabinetCellService.updateById(cabinetCellEntity); + goods.setStock(goods.getStock() - quantity); + goodsService.updateById(goods); + } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModelFactory.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModelFactory.java index 97e66fa..6173ed6 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModelFactory.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/model/OrderModelFactory.java @@ -2,6 +2,8 @@ package com.agileboot.domain.shop.order.model; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.cabinet.cell.db.CabinetCellService; +import com.agileboot.domain.shop.goods.db.ShopGoodsService; import com.agileboot.domain.shop.order.db.ShopOrderEntity; import com.agileboot.domain.shop.order.db.ShopOrderGoodsService; import com.agileboot.domain.shop.order.db.ShopOrderService; @@ -14,13 +16,15 @@ public class OrderModelFactory { private final ShopOrderService orderService; private final ShopOrderGoodsService orderGoodsService; + private final CabinetCellService cabinetCellService; + private final ShopGoodsService goodsService; public OrderModel create(ShopOrderEntity entity) { - return new OrderModel(entity, orderService, orderGoodsService); + return new OrderModel(entity, orderService, orderGoodsService, cabinetCellService, goodsService); } public OrderModel create() { - return new OrderModel(orderService, orderGoodsService); + return new OrderModel(orderService, orderGoodsService, cabinetCellService, goodsService); } public OrderModel loadById(Long orderId) { @@ -28,6 +32,6 @@ public class OrderModelFactory { if (entity == null) { throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, orderId, "订单"); } - return new OrderModel(entity, orderService, orderGoodsService); + return new OrderModel(entity, orderService, orderGoodsService, cabinetCellService, goodsService); } } \ No newline at end of file