Bläddra i källkod

下单时和支付时添加锁表校验

lutong 2 månader sedan
förälder
incheckning
bec0342f4b

+ 8 - 0
alien-dining/src/main/java/shop/alien/dining/service/DiningService.java

@@ -130,4 +130,12 @@ public interface DiningService {
      * @param userId 用户ID
      * @param userId 用户ID
      */
      */
     void unlockSettlement(Integer orderId, Integer userId);
     void unlockSettlement(Integer orderId, Integer userId);
+
+    /**
+     * 检查订单结算是否被锁定
+     *
+     * @param orderId 订单ID
+     * @return 锁定用户ID,如果未锁定返回null
+     */
+    Integer checkSettlementLock(Integer orderId);
 }
 }

+ 14 - 0
alien-dining/src/main/java/shop/alien/dining/service/impl/DiningServiceImpl.java

@@ -582,4 +582,18 @@ public class DiningServiceImpl implements DiningService {
             baseRedisService.delete(lockKey);
             baseRedisService.delete(lockKey);
         }
         }
     }
     }
+
+    @Override
+    public Integer checkSettlementLock(Integer orderId) {
+        String lockKey = "settlement:lock:order:" + orderId;
+        String lockUserId = baseRedisService.getString(lockKey);
+        if (StringUtils.hasText(lockUserId)) {
+            try {
+                return Integer.parseInt(lockUserId);
+            } catch (NumberFormatException e) {
+                return null;
+            }
+        }
+        return null;
+    }
 }
 }

+ 20 - 6
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -56,6 +56,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
     private final StoreInfoMapper storeInfoMapper;
     private final StoreInfoMapper storeInfoMapper;
     private final StoreOrderChangeLogMapper orderChangeLogMapper;
     private final StoreOrderChangeLogMapper orderChangeLogMapper;
     private final shop.alien.dining.service.SseService sseService;
     private final shop.alien.dining.service.SseService sseService;
+    private final shop.alien.dining.service.DiningService diningService;
 
 
     @Override
     @Override
     public StoreOrder createOrder(CreateOrderDTO dto) {
     public StoreOrder createOrder(CreateOrderDTO dto) {
@@ -68,6 +69,12 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         }
         }
         String userPhone = TokenUtil.getCurrentUserPhone();
         String userPhone = TokenUtil.getCurrentUserPhone();
 
 
+        // 检查订单锁定状态
+        Integer lockUserId = diningService.checkOrderLock(dto.getTableId());
+        if (lockUserId != null && !lockUserId.equals(userId)) {
+            throw new RuntimeException("订单已被其他用户锁定,无法下单");
+        }
+
         // 验证桌号
         // 验证桌号
         StoreTable table = storeTableMapper.selectById(dto.getTableId());
         StoreTable table = storeTableMapper.selectById(dto.getTableId());
         if (table == null) {
         if (table == null) {
@@ -322,6 +329,18 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
     public StoreOrder payOrder(Integer orderId, Integer payType) {
     public StoreOrder payOrder(Integer orderId, Integer payType) {
         log.info("支付订单, orderId={}, payType={}", orderId, payType);
         log.info("支付订单, orderId={}, payType={}", orderId, payType);
 
 
+        // 获取当前用户信息
+        Integer userId = TokenUtil.getCurrentUserId();
+        if (userId == null) {
+            throw new RuntimeException("用户未登录");
+        }
+
+        // 检查结算锁定状态
+        Integer lockUserId = diningService.checkSettlementLock(orderId);
+        if (lockUserId != null && !lockUserId.equals(userId)) {
+            throw new RuntimeException("订单结算已被其他用户锁定,无法支付");
+        }
+
         StoreOrder order = this.getById(orderId);
         StoreOrder order = this.getById(orderId);
         if (order == null) {
         if (order == null) {
             throw new RuntimeException("订单不存在");
             throw new RuntimeException("订单不存在");
@@ -338,12 +357,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         order.setPayTime(new Date());
         order.setPayTime(new Date());
         order.setPayTradeNo("TRADE_" + System.currentTimeMillis()); // 模拟交易号
         order.setPayTradeNo("TRADE_" + System.currentTimeMillis()); // 模拟交易号
         order.setUpdatedTime(new Date());
         order.setUpdatedTime(new Date());
-
-        // 获取当前用户信息
-        Integer userId = TokenUtil.getCurrentUserId();
-        if (userId != null) {
-            order.setUpdatedUserId(userId);
-        }
+        order.setUpdatedUserId(userId);
 
 
         this.updateById(order);
         this.updateById(order);