Browse Source

fix: product order stock check by product type (physical only)

Xiaogang Liao 2 months ago
parent
commit
50ec6503b7

+ 20 - 12
cfc-backend/src/main/java/com/etotem/cfc/service/ProductOrderService.java

@@ -74,7 +74,10 @@ public class ProductOrderService {
         if (!"on_shelf".equals(product.getStatus())) {
         if (!"on_shelf".equals(product.getStatus())) {
             return Result.error("商品已下架");
             return Result.error("商品已下架");
         }
         }
-        if (product.getStock() != null && product.getStock() < dto.getQuantity()) {
+        // 实物商品校验库存;虚拟商品/优惠券跳过库存检查
+        if ("physical".equals(product.getProductType())
+                && product.getStock() != null
+                && product.getStock() < dto.getQuantity()) {
             return Result.error("库存不足");
             return Result.error("库存不足");
         }
         }
 
 
@@ -122,7 +125,10 @@ public class ProductOrderService {
             if (!"on_shelf".equals(product.getStatus())) {
             if (!"on_shelf".equals(product.getStatus())) {
                 return Result.error("商品已下架: " + product.getName());
                 return Result.error("商品已下架: " + product.getName());
             }
             }
-            if (product.getStock() != null && product.getStock() < item.getQuantity()) {
+            // 实物商品校验库存;虚拟商品/优惠券跳过库存检查
+            if ("physical".equals(product.getProductType())
+                    && product.getStock() != null
+                    && product.getStock() < item.getQuantity()) {
                 return Result.error("库存不足: " + product.getName());
                 return Result.error("库存不足: " + product.getName());
             }
             }
             totalAmount += product.getPrice() * item.getQuantity();
             totalAmount += product.getPrice() * item.getQuantity();
@@ -186,16 +192,18 @@ public class ProductOrderService {
         if (!"pending".equals(order.getStatus())) {
         if (!"pending".equals(order.getStatus())) {
             return Result.success("订单状态非待支付,跳过");
             return Result.success("订单状态非待支付,跳过");
         }
         }
-        // Deduct stock (optimistic lock - check return value)
-        boolean stockOk = productService.decreaseStock(order.getProductId(), order.getQuantity());
-        if (!stockOk) {
-            log.error("库存扣减失败: orderNo={}, productId={}, quantity={}",
-                    orderNo, order.getProductId(), order.getQuantity());
-            // Mark order abnormal - requires manual intervention
-            order.setRemark("库存扣减失败");
-            order.setUpdatedAt(new Date());
-            orderMapper.updateById(order);
-            throw new RuntimeException("库存不足");
+        // 仅对实物商品扣减库存;虚拟商品/优惠券无库存概念
+        Product paidProduct = productMapper.selectById(order.getProductId());
+        if (paidProduct != null && "physical".equals(paidProduct.getProductType())) {
+            boolean stockOk = productService.decreaseStock(order.getProductId(), order.getQuantity());
+            if (!stockOk) {
+                log.error("库存扣减失败: orderNo={}, productId={}, quantity={}",
+                        orderNo, order.getProductId(), order.getQuantity());
+                order.setRemark("库存扣减失败");
+                order.setUpdatedAt(new Date());
+                orderMapper.updateById(order);
+                throw new RuntimeException("库存不足");
+            }
         }
         }
         order.setStatus("paid");
         order.setStatus("paid");
         order.setTransactionId(transactionId);
         order.setTransactionId(transactionId);