feat(订单): 新增根据订单ID查询商品明细功能并调整库存扣减逻辑

新增`selectByOrderId`方法用于根据订单ID查询商品明细,并将库存扣减逻辑从订单创建时移至支付成功后执行,以避免未支付时库存被占用的问题。
This commit is contained in:
dzq 2025-04-23 11:11:55 +08:00
parent 365d7dfc11
commit 911a52f554
6 changed files with 63 additions and 25 deletions

View File

@ -217,12 +217,17 @@ public class OrderApplicationService {
// 计算商品金额并验证库存 // 计算商品金额并验证库存
goodsModel.calculateTotal(); goodsModel.calculateTotal();
goodsModel.validateQuantity(); goodsModel.validateQuantity();
CabinetCellEntity cabinetCellEntity = cabinetCellService.getById(goodsModel.getCellId());
if (cabinetCellEntity == null || cabinetCellEntity.getStock() < goodsModel.getQuantity()) {
throw new ApiException(ErrorCode.FAILED, "柜子库存不足");
}
// 保存订单商品 // 保存订单商品
goodsModel.insert(); goodsModel.insert();
// 扣减库存 // 扣减库存
deductGoodsStock(goodsModel.getGoodsId(), goodsModel.getQuantity(), goodsModel.getCellId()); // 改为收到支付成功后扣减库存
// deductGoodsStock(goodsModel.getGoodsId(), goodsModel.getQuantity(), goodsModel.getCellId());
totalAmount = totalAmount.add(goodsModel.getTotalAmount()); totalAmount = totalAmount.add(goodsModel.getTotalAmount());
} }
@ -233,24 +238,6 @@ public class OrderApplicationService {
orderModel.updateById(); 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 @Transactional
public void cancelOrder(Long orderId) { public void cancelOrder(Long orderId) {
OrderModel orderModel = orderModelFactory.loadById(orderId); OrderModel orderModel = orderModelFactory.loadById(orderId);

View File

@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/** /**
* <p> * <p>
* 订单商品明细表 Mapper 接口 * 订单商品明细表 Mapper 接口
@ -18,4 +20,6 @@ public interface ShopOrderGoodsMapper extends BaseMapper<ShopOrderGoodsEntity> {
@Select("SELECT * FROM shop_order_goods WHERE order_id = #{orderId} AND goods_id = #{goodsId} LIMIT 1") @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); ShopOrderGoodsEntity selectByOrderIdAndGoodsId(@Param("orderId") Long orderId, @Param("goodsId") Long goodsId);
@Select("SELECT * FROM shop_order_goods WHERE order_id = #{orderId} AND deleted = 0")
List<ShopOrderGoodsEntity> selectByOrderId(@Param("orderId") Long orderId);
} }

View File

@ -2,6 +2,8 @@ package com.agileboot.domain.shop.order.db;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 订单商品明细表 服务类 * 订单商品明细表 服务类
@ -12,4 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface ShopOrderGoodsService extends IService<ShopOrderGoodsEntity> { public interface ShopOrderGoodsService extends IService<ShopOrderGoodsEntity> {
ShopOrderGoodsEntity getByOrderIdAndGoodsId(Long orderId, Long goodsId); ShopOrderGoodsEntity getByOrderIdAndGoodsId(Long orderId, Long goodsId);
List<ShopOrderGoodsEntity> selectByOrderId(Long orderId);
} }

View File

@ -3,6 +3,8 @@ package com.agileboot.domain.shop.order.db;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* <p> * <p>
* 订单商品明细表 服务实现类 * 订单商品明细表 服务实现类
@ -19,4 +21,9 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl<ShopOrderGoodsMapper,
return baseMapper.selectByOrderIdAndGoodsId(orderId, goodsId); return baseMapper.selectByOrderIdAndGoodsId(orderId, goodsId);
} }
@Override
public List<ShopOrderGoodsEntity> selectByOrderId(Long orderId) {
return baseMapper.selectByOrderId(orderId);
}
} }

View File

@ -5,6 +5,10 @@ import cn.hutool.core.date.DateUtil;
import com.agileboot.common.config.AgileBootConfig; import com.agileboot.common.config.AgileBootConfig;
import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode; 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.ShopOrderEntity;
import com.agileboot.domain.shop.order.db.ShopOrderGoodsService; import com.agileboot.domain.shop.order.db.ShopOrderGoodsService;
import com.agileboot.domain.shop.order.db.ShopOrderService; import com.agileboot.domain.shop.order.db.ShopOrderService;
@ -21,18 +25,23 @@ public class OrderModel extends ShopOrderEntity {
private ShopOrderService orderService; private ShopOrderService orderService;
private ShopOrderGoodsService orderGoodsService; private ShopOrderGoodsService orderGoodsService;
private CabinetCellService cabinetCellService;
private ShopGoodsService goodsService;
public OrderModel(ShopOrderEntity entity, ShopOrderService orderService, public OrderModel(ShopOrderEntity entity, ShopOrderService orderService,
ShopOrderGoodsService orderGoodsService) { ShopOrderGoodsService orderGoodsService, CabinetCellService cabinetCellService, ShopGoodsService goodsService) {
this(orderService, orderGoodsService); this(orderService, orderGoodsService, cabinetCellService, goodsService);
if (entity != null) { if (entity != null) {
BeanUtil.copyProperties(entity, this); BeanUtil.copyProperties(entity, this);
} }
} }
public OrderModel(ShopOrderService orderService, ShopOrderGoodsService orderGoodsService) { public OrderModel(ShopOrderService orderService, ShopOrderGoodsService orderGoodsService,
CabinetCellService cabinetCellService, ShopGoodsService goodsService) {
this.orderService = orderService; this.orderService = orderService;
this.orderGoodsService = orderGoodsService; this.orderGoodsService = orderGoodsService;
this.cabinetCellService = cabinetCellService;
this.goodsService = goodsService;
} }
public void calculateTotalAmount(List<Long> goodsIds) { public void calculateTotalAmount(List<Long> goodsIds) {
@ -85,6 +94,11 @@ public class OrderModel extends ShopOrderEntity {
log.error("支付时间转换失败", e); log.error("支付时间转换失败", e);
} }
this.updateById(); this.updateById();
orderGoodsService.selectByOrderId(this.getOrderId()).forEach(orderGoods -> {
// 扣减库存
deductGoodsStock(orderGoods.getGoodsId(), orderGoods.getQuantity(), orderGoods.getCellId());
});
} }
public void handleRefundSuccess() { public void handleRefundSuccess() {
@ -92,4 +106,22 @@ public class OrderModel extends ShopOrderEntity {
this.setPayStatus(4); this.setPayStatus(4);
this.updateById(); 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);
}
} }

View File

@ -2,6 +2,8 @@ package com.agileboot.domain.shop.order.model;
import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode; 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.ShopOrderEntity;
import com.agileboot.domain.shop.order.db.ShopOrderGoodsService; import com.agileboot.domain.shop.order.db.ShopOrderGoodsService;
import com.agileboot.domain.shop.order.db.ShopOrderService; import com.agileboot.domain.shop.order.db.ShopOrderService;
@ -14,13 +16,15 @@ public class OrderModelFactory {
private final ShopOrderService orderService; private final ShopOrderService orderService;
private final ShopOrderGoodsService orderGoodsService; private final ShopOrderGoodsService orderGoodsService;
private final CabinetCellService cabinetCellService;
private final ShopGoodsService goodsService;
public OrderModel create(ShopOrderEntity entity) { public OrderModel create(ShopOrderEntity entity) {
return new OrderModel(entity, orderService, orderGoodsService); return new OrderModel(entity, orderService, orderGoodsService, cabinetCellService, goodsService);
} }
public OrderModel create() { public OrderModel create() {
return new OrderModel(orderService, orderGoodsService); return new OrderModel(orderService, orderGoodsService, cabinetCellService, goodsService);
} }
public OrderModel loadById(Long orderId) { public OrderModel loadById(Long orderId) {
@ -28,6 +32,6 @@ public class OrderModelFactory {
if (entity == null) { if (entity == null) {
throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, orderId, "订单"); throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, orderId, "订单");
} }
return new OrderModel(entity, orderService, orderGoodsService); return new OrderModel(entity, orderService, orderGoodsService, cabinetCellService, goodsService);
} }
} }