|
@@ -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());
|