瀏覽代碼

Merge branch 'dev' into 'mp-server-test'

线上盲票提交订单优化

See merge request quanshu/mp-server!726
jiang hao 2 年之前
父節點
當前提交
a099bb2b18

+ 1 - 0
mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java

@@ -9,6 +9,7 @@ import com.qs.mp.common.utils.MessageHelper;
  *
  */
 public enum RedisLockKey {
+    CREATED_ONLINE_TICKET_ORDER_KEY("created_online_ticket_order_key_{0}", "线上盲票创建锁"),
     ASYNC_TASK_KEY("async_task_key_{0}", "异步任务key"),
     MARKETING_REAL_NUM_LOCK("marketing_real_num_lock_{0}", "活动真实人数增加锁"),
     MARKETING_LOTTERY_KEY("marketing_lottery_key_{0}","免费抽奖活动开奖"),

+ 21 - 5
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -19,6 +19,7 @@ import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.*;
 import com.qs.mp.channel.domain.param.ChannelCommParam;
 import com.qs.mp.channel.service.*;
+import com.qs.mp.common.core.redis.DistributedLocker;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
@@ -27,6 +28,7 @@ import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.framework.redis.RedisLockKey;
 import com.qs.mp.framework.service.IAsyncTaskService;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
@@ -49,6 +51,7 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -114,19 +117,31 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private IAsyncTaskService asyncTaskService;
 
+  @Autowired
+  private DistributedLocker distributedLocker;
+
   @Override
-  @Transactional
   public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO,
       UserShareVO userShareVO) {
+    UserTicketOrderServiceImpl proxy = (UserTicketOrderServiceImpl) AopContext.currentProxy();
     if (StringUtils.isBlank(orderSettleVO.getTicketId())) {
-      return createOnlineOrder(userId, orderSettleVO, userShareVO);
+      String lockKey = RedisLockKey.build(RedisLockKey.CREATED_ONLINE_TICKET_ORDER_KEY, orderSettleVO.getBoxId());
+      if (!distributedLocker.tryLock(lockKey)) {
+        throw new ServiceException("该票太火爆了,请稍后再试!");
+      }
+      try {
+        return proxy.createOnlineOrder(userId, orderSettleVO, userShareVO);
+      } finally {
+        distributedLocker.unlock(lockKey);
+      }
     }
 
     // 线下票不需锁库存,待付款成功后再更新票组销量
-    return createOfflineOrder(userId, orderSettleVO);
+    return proxy.createOfflineOrder(userId, orderSettleVO);
   }
 
-  private String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO,
+  @Transactional(rollbackFor = Exception.class)
+  public String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO,
       UserShareVO userShareVO) {
     // 线上票更新票组销量,防止超卖
     TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
@@ -223,7 +238,8 @@ public class UserTicketOrderServiceImpl extends
     return userTicketOrder.getOrderId();
   }
 
-  private String createOfflineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+  @Transactional(rollbackFor = Exception.class)
+  public String createOfflineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
     Ticket ticket = ticketService.getById(orderSettleVO.getTicketId());
     Assert.isTrue(ticket.getStatus() == TicketStatusEnum.NOT_PAY,
         "盲票已付款,ticketId:" + ticket.getTicketId());