|
@@ -18,6 +18,8 @@ import com.github.pagehelper.PageInfo;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.ApiOperation;
|
|
import io.swagger.annotations.ApiOperation;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
+import org.redisson.api.RLock;
|
|
|
|
+import org.redisson.api.RedissonClient;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -25,6 +27,7 @@ import org.springframework.validation.annotation.Validated;
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
@Api("商城接口")
|
|
@Api("商城接口")
|
|
@@ -41,7 +44,8 @@ public class StoreOrderController extends AppBaseController {
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private IFsStorePaymentService fsStorePaymentService;
|
|
private IFsStorePaymentService fsStorePaymentService;
|
|
-
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private RedissonClient redissonClient;
|
|
|
|
|
|
@Login
|
|
@Login
|
|
@ApiOperation("获取我的订单列表")
|
|
@ApiOperation("获取我的订单列表")
|
|
@@ -125,23 +129,40 @@ public class StoreOrderController extends AppBaseController {
|
|
@Login
|
|
@Login
|
|
@ApiOperation("支付")
|
|
@ApiOperation("支付")
|
|
@PostMapping("/pay")
|
|
@PostMapping("/pay")
|
|
- @RepeatSubmit(intervalTime = 1)
|
|
|
|
public R pay(@Validated @RequestBody FsStoreOrderPayParam param)
|
|
public R pay(@Validated @RequestBody FsStoreOrderPayParam param)
|
|
{
|
|
{
|
|
- logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", param.getOrderId(), param.getPayType());
|
|
|
|
|
|
+ Long orderId = param.getOrderId();
|
|
|
|
+ logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
|
|
|
|
+
|
|
|
|
+ RLock lock = redissonClient.getLock("payment:lock:" + orderId);
|
|
R result = null;
|
|
R result = null;
|
|
|
|
+
|
|
try {
|
|
try {
|
|
|
|
+ // 尝试获取锁,最多等待500ms,锁定30秒
|
|
|
|
+ boolean locked = lock.tryLock(3000, 30000, TimeUnit.MILLISECONDS);
|
|
|
|
+
|
|
|
|
+ if (!locked) {
|
|
|
|
+ logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
|
|
|
|
+ return R.error("订单正在处理中,请勿重复提交");
|
|
|
|
+ }
|
|
|
|
+
|
|
result = orderService.pay(param);
|
|
result = orderService.pay(param);
|
|
|
|
+
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
+ logger.error("获取支付锁的过程被中断, 订单号: {}", orderId, e);
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
+ return R.error("支付处理被中断,请稍后重试");
|
|
} catch (Throwable e) {
|
|
} catch (Throwable e) {
|
|
- logger.error("支付过程中发生异常, 订单号: {}", param.getOrderId(), e);
|
|
|
|
|
|
+ logger.error("支付过程中发生异常, 订单号: {}", orderId, e);
|
|
throw e;
|
|
throw e;
|
|
} finally {
|
|
} finally {
|
|
- if (result != null) {
|
|
|
|
- logger.info("支付请求处理完成, 订单号: {}, 返回结果: {}", param.getOrderId(), result);
|
|
|
|
- } else {
|
|
|
|
- logger.info("支付请求处理完成, 订单号: {}, 返回结果为空", param.getOrderId());
|
|
|
|
|
|
+ // 确保锁被释放
|
|
|
|
+ if (lock.isHeldByCurrentThread()) {
|
|
|
|
+ lock.unlock();
|
|
|
|
+ logger.debug("支付锁已释放, 订单号: {}", orderId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
@Login
|
|
@Login
|
|
@@ -177,21 +198,38 @@ public class StoreOrderController extends AppBaseController {
|
|
@ApiOperation("亲友支付")
|
|
@ApiOperation("亲友支付")
|
|
@PostMapping("/otherPayment")
|
|
@PostMapping("/otherPayment")
|
|
public R otherPayment(@Validated @RequestBody FsStoreOrderOtherPayParam param){
|
|
public R otherPayment(@Validated @RequestBody FsStoreOrderOtherPayParam param){
|
|
|
|
+ Long orderId = param.getOrderId();
|
|
|
|
+ logger.info("开始处理支付请求, 订单号: {}, 支付类型: 亲友支付", orderId);
|
|
|
|
|
|
- logger.info("开始处理支付请求, 订单号: {}, 支付类型: 亲友支付", param.getOrderId());
|
|
|
|
|
|
+ RLock lock = redissonClient.getLock("friendPayment:lock:" + orderId);
|
|
R result = null;
|
|
R result = null;
|
|
|
|
+
|
|
try {
|
|
try {
|
|
|
|
+ // 尝试获取锁,最多等待500ms,锁定30秒
|
|
|
|
+ boolean locked = lock.tryLock(3000, 30000, TimeUnit.MILLISECONDS);
|
|
|
|
+
|
|
|
|
+ if (!locked) {
|
|
|
|
+ logger.warn("亲友支付订单正在处理中,获取锁失败, 订单号: {}", orderId);
|
|
|
|
+ return R.error("订单正在处理中,请勿重复提交");
|
|
|
|
+ }
|
|
|
|
+
|
|
result = orderService.otherPayment(param);
|
|
result = orderService.otherPayment(param);
|
|
|
|
+
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
+ logger.error("获取亲友支付锁的过程被中断, 订单号: {}", orderId, e);
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
+ return R.error("支付处理被中断,请稍后重试");
|
|
} catch (Throwable e) {
|
|
} catch (Throwable e) {
|
|
- logger.error("支付过程中发生异常, 订单号: {}", param.getOrderId(), e);
|
|
|
|
|
|
+ logger.error("亲友支付过程中发生异常, 订单号: {}", orderId, e);
|
|
throw e;
|
|
throw e;
|
|
} finally {
|
|
} finally {
|
|
- if (result != null) {
|
|
|
|
- logger.info("支付请求处理完成, 订单号: {}, 返回结果: {}", param.getOrderId(), result);
|
|
|
|
- } else {
|
|
|
|
- logger.info("支付请求处理完成, 订单号: {}, 返回结果为空", param.getOrderId());
|
|
|
|
|
|
+ // 确保锁被释放
|
|
|
|
+ if (lock.isHeldByCurrentThread()) {
|
|
|
|
+ lock.unlock();
|
|
|
|
+ logger.debug("亲友支付锁已释放, 订单号: {}", orderId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|