소스 검색

修改同步锁范围

july 4 년 전
부모
커밋
ed423f0235

+ 20 - 19
ldt-core/src/main/java/org/springblade/gateway/client_gateway/controller/ClientTradeController.java

@@ -47,23 +47,23 @@ public class ClientTradeController {
 	@ApiOperation("用户扫商家二维码下单")
 	@PostMapping("/scanPay")
 	public R scanPay(@RequestBody ClientTradeDto clientTradeDto) {
-
-		LoginUser loginUser = loginUserService.getById(clientTradeDto.getUserId());
-		Assert.notNull(loginUser, () -> {
-			throw new ServiceException(ResCode.USER_NOT_FOUNT);
-		});
-
-		//处理订单
-		Order order = Order.builder()
-			.appId(clientTradeDto.getAppId())
-			.billsTitle(clientTradeDto.getBillsTitle())
-			.loginUser(loginUser)
-			.money(clientTradeDto.getMoney())
-			.expireTime(clientTradeDto.getExpireTime())
-			.secret(clientTradeDto.getSecret())
-			.shopId(clientTradeDto.getShopId())
-			.openId(loginUser.getOpenid())
-			.build();
+		synchronized (clientTradeDto.getUserId().toString().intern()) {
+			LoginUser loginUser = loginUserService.getById(clientTradeDto.getUserId());
+			Assert.notNull(loginUser, () -> {
+				throw new ServiceException(ResCode.USER_NOT_FOUNT);
+			});
+
+			//处理订单
+			Order order = Order.builder()
+				.appId(clientTradeDto.getAppId())
+				.billsTitle(clientTradeDto.getBillsTitle())
+				.loginUser(loginUser)
+				.money(clientTradeDto.getMoney())
+				.expireTime(clientTradeDto.getExpireTime())
+				.secret(clientTradeDto.getSecret())
+				.shopId(clientTradeDto.getShopId())
+				.openId(loginUser.getOpenid())
+				.build();
 
 		/*SuccessParams successParams = null;
 
@@ -73,8 +73,9 @@ public class ClientTradeController {
 			e.printStackTrace();
 			throw new TradeException(ResCode.TRADE_ERROR, successParams);
 		}*/
-		SuccessParams successParams = trade.tradeForScanPay(order, clientTradeDto.getChannelId());
-		return R.data(successParams);
+			SuccessParams successParams = trade.tradeForScanPay(order, clientTradeDto.getChannelId());
+			return R.data(successParams);
+		}
 	}
 
 	@ApiOperation("取消支付交易")

+ 57 - 54
ldt-core/src/main/java/org/springblade/gateway/web_gateway/controller/PressureTestController.java

@@ -132,61 +132,64 @@ public class PressureTestController {
 		clientTradeDto.setMoney(BigDecimal.ONE);
 		clientTradeDto.setOpenId("ocWnO5eEuHMhl7RV_ebnp_Ff9A0M");
 		clientTradeDto.setShopId(1440871712886366210L);*/
-		LoginUser loginUser = loginUserService.getById(clientTradeDto.getUserId());
-		Assert.notNull(loginUser, () -> {
-			throw new ServiceException(ResCode.USER_NOT_FOUNT);
-		});
-
-		//处理订单
-		Order order = Order.builder()
-			.appId(clientTradeDto.getAppId())
-			.billsTitle(clientTradeDto.getBillsTitle())
-			.loginUser(loginUser)
-			.money(clientTradeDto.getMoney())
-			.expireTime(clientTradeDto.getExpireTime())
-			.secret(clientTradeDto.getSecret())
-			.shopId(clientTradeDto.getShopId())
-			.openId(loginUser.getOpenid())
-			.build();
 
-		SuccessParams successParams = trade.tradeForScanPay(order, clientTradeDto.getChannelId());
-
-		String res = "{\"channelOrderId\":\"4200001127202110301273440365\"," +
-			"\"orderId\":\"" + successParams.getBills().getId() + "\"," +
-			"\"bankOrderId\":\"5062869652211030\"," +
-			"\"paySuccessDate\":\"" + LocalDateTime.now() + "\"," +
-			"\"channel\":\"WECHAT\"," +
-			"\"payWay\":\"MINI_PROGRAM\"," +
-			"\"uniqueOrderNo\":\"1013202110300000002776327287\"," +
-			"\"orderAmount\":\"" + clientTradeDto.getMoney() + "\"," +
-			"\"payAmount\":\"" + clientTradeDto.getMoney() + "\"," +
-			"\"payerInfo\":\"{\\\"bankCardNo\\\":\\\"\\\"," +
-			"\\\"bankId\\\":\\\"CFT\\\"," +
-			"\\\"cardType\\\":\\\"CFT\\\"," +
-			"\\\"mobilePhoneNo\\\":\\\"\\\"," +
-			"\\\"userID\\\":\\\"" + clientTradeDto.getOpenId() + "\\\"}\"," +
-			"\"realPayAmount\":\"" + clientTradeDto.getMoney() + "\"," +
-			"\"parentMerchantNo\":\"10086160165\"," +
-			"\"merchantNo\":\"10086184256\"," +
-			"\"status\":\"SUCCESS\"}";
-		successParams.setRes(JSONObject.parseObject(res));
-		eventPublisher.publishEvent(new UserPayEvent(successParams));
-
-		res = "{\"feeMerchantNo\":\"10086184256\"," +
-			"\"orderAmount\":\"" + clientTradeDto.getMoney() + "\"," +
-			"\"csSuccessDate\":\"" + LocalDateTime.now() + "\"," +
-			"\"orderId\":\"" + successParams.getBills().getId() + "\"," +
-			"\"merchantFee\":\"" + BigDecimal.valueOf(0.01) + "\"," +
-			"\"customerFee\":\"\"," +
-			"\"parentMerchantNo\":\"10086160165\"," +
-			"\"uniqueOrderNo\":\"1013202110300000002776396034\"," +
-			"\"feeType\":\"REAL_TIME\"," +
-			"\"ypSettleAmount\":\"" + clientTradeDto.getMoney().subtract(BigDecimal.valueOf(0.01)) + "\"," +
-			"\"merchantNo\":\"10086184256\"," +
-			"\"status\":\"SUCCESS\"}";
-		successParams.setRes(JSONObject.parseObject(res));
-		eventPublisher.publishEvent(new UserPayCsEvent(successParams));
-		return R.data(successParams);
+		synchronized (clientTradeDto.getUserId().toString().intern()){
+			LoginUser loginUser = loginUserService.getById(clientTradeDto.getUserId());
+			Assert.notNull(loginUser, () -> {
+				throw new ServiceException(ResCode.USER_NOT_FOUNT);
+			});
+
+			//处理订单
+			Order order = Order.builder()
+				.appId(clientTradeDto.getAppId())
+				.billsTitle(clientTradeDto.getBillsTitle())
+				.loginUser(loginUser)
+				.money(clientTradeDto.getMoney())
+				.expireTime(clientTradeDto.getExpireTime())
+				.secret(clientTradeDto.getSecret())
+				.shopId(clientTradeDto.getShopId())
+				.openId(loginUser.getOpenid())
+				.build();
+
+			SuccessParams successParams = trade.tradeForScanPay(order, clientTradeDto.getChannelId());
+
+			String res = "{\"channelOrderId\":\"4200001127202110301273440365\"," +
+				"\"orderId\":\"" + successParams.getBills().getId() + "\"," +
+				"\"bankOrderId\":\"5062869652211030\"," +
+				"\"paySuccessDate\":\"" + LocalDateTime.now() + "\"," +
+				"\"channel\":\"WECHAT\"," +
+				"\"payWay\":\"MINI_PROGRAM\"," +
+				"\"uniqueOrderNo\":\"1013202110300000002776327287\"," +
+				"\"orderAmount\":\"" + clientTradeDto.getMoney() + "\"," +
+				"\"payAmount\":\"" + clientTradeDto.getMoney() + "\"," +
+				"\"payerInfo\":\"{\\\"bankCardNo\\\":\\\"\\\"," +
+				"\\\"bankId\\\":\\\"CFT\\\"," +
+				"\\\"cardType\\\":\\\"CFT\\\"," +
+				"\\\"mobilePhoneNo\\\":\\\"\\\"," +
+				"\\\"userID\\\":\\\"" + clientTradeDto.getOpenId() + "\\\"}\"," +
+				"\"realPayAmount\":\"" + clientTradeDto.getMoney() + "\"," +
+				"\"parentMerchantNo\":\"10086160165\"," +
+				"\"merchantNo\":\"10086184256\"," +
+				"\"status\":\"SUCCESS\"}";
+			successParams.setRes(JSONObject.parseObject(res));
+			eventPublisher.publishEvent(new UserPayEvent(successParams));
+
+			res = "{\"feeMerchantNo\":\"10086184256\"," +
+				"\"orderAmount\":\"" + clientTradeDto.getMoney() + "\"," +
+				"\"csSuccessDate\":\"" + LocalDateTime.now() + "\"," +
+				"\"orderId\":\"" + successParams.getBills().getId() + "\"," +
+				"\"merchantFee\":\"" + BigDecimal.valueOf(0.01) + "\"," +
+				"\"customerFee\":\"\"," +
+				"\"parentMerchantNo\":\"10086160165\"," +
+				"\"uniqueOrderNo\":\"1013202110300000002776396034\"," +
+				"\"feeType\":\"REAL_TIME\"," +
+				"\"ypSettleAmount\":\"" + clientTradeDto.getMoney().subtract(BigDecimal.valueOf(0.01)) + "\"," +
+				"\"merchantNo\":\"10086184256\"," +
+				"\"status\":\"SUCCESS\"}";
+			successParams.setRes(JSONObject.parseObject(res));
+			eventPublisher.publishEvent(new UserPayCsEvent(successParams));
+			return R.data(successParams);
+		}
 	}
 
 	@PostMapping("/sendWXMessage")

+ 39 - 39
ldt-core/src/main/java/org/springblade/payment/handle/Trade.java

@@ -2,6 +2,7 @@ package org.springblade.payment.handle;
 
 import cn.hutool.core.convert.Convert;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springblade.common.cache.PaymentCache;
 import org.springblade.common.enums.AppConstant;
@@ -35,6 +36,7 @@ import java.util.List;
  */
 @Component
 @AllArgsConstructor
+@Slf4j
 public class Trade {
 
 	private IBillsService billsService;
@@ -126,51 +128,49 @@ public class Trade {
 			String tenantId = appShopService.getTenantId(order.getShopId());
 			Bills bills = initBill(order, channelId, tenantId);
 
-			synchronized (order.getLoginUser().getId().toString().intern()) {
-				//支付参数
-				successParams = SuccessParams.builder()
-					.orderType(OrderType.USER_PAY.name())
-					.status(AppConstant.BillPayStatus.待付款.name())
-					.userId(order.getLoginUser().getId())
-					.totalPrice(order.getMoney())
-					.bills(bills)
-					.shopId(order.getShopId())
-					.tenantId(tenantId)
-					.channelId(channelId)
-					.build();
+			//支付参数
+			successParams = SuccessParams.builder()
+				.orderType(OrderType.USER_PAY.name())
+				.status(AppConstant.BillPayStatus.待付款.name())
+				.userId(order.getLoginUser().getId())
+				.totalPrice(order.getMoney())
+				.bills(bills)
+				.shopId(order.getShopId())
+				.tenantId(tenantId)
+				.channelId(channelId)
+				.build();
 
-				//处理各个节点
-				for (BaseHandle node : chain) {
-					HandleData res = node.handle(remain, order, successParams);
-					Assert.isTrue(res.isSuccess(), () -> {
-						throw new TradeException(ResCode.TRADE_ERROR, res.getSuccessParams());
-					});
-					remain = res.getRemain();
-					successParams = res.getSuccessParams();
+			//处理各个节点
+			for (BaseHandle node : chain) {
+				HandleData res = node.handle(remain, order, successParams);
+				Assert.isTrue(res.isSuccess(), () -> {
+					throw new TradeException(ResCode.TRADE_ERROR, res.getSuccessParams());
+				});
+				remain = res.getRemain();
+				successParams = res.getSuccessParams();
 
-					if (remain.compareTo(BigDecimal.ZERO) == 0) {
-						successParams.setStatus(AppConstant.BillPayStatus.付款成功.name());
-						bills.setPayStatus(AppConstant.BillPayStatus.付款成功.name());
-						dataHandle.saveOrUpdateEntity(billsService, successParams.getBills());
-						dataHandle.publishEvent(new UserPayCsEvent(successParams));
-						break;
-					}
+				if (remain.compareTo(BigDecimal.ZERO) == 0) {
+					successParams.setStatus(AppConstant.BillPayStatus.付款成功.name());
+					bills.setPayStatus(AppConstant.BillPayStatus.付款成功.name());
+					dataHandle.saveOrUpdateEntity(billsService, successParams.getBills());
+					dataHandle.publishEvent(new UserPayCsEvent(successParams));
+					break;
 				}
+			}
 
-				//新建事务,保存订单信息,
-				SuccessParams finalSuccessParams = successParams;
-				Assert.isTrue(dataHandle.saveOrUpdateEntity(billsService, successParams.getBills()), () -> {
-					throw new TradeException(ResCode.TRADE_ERROR, finalSuccessParams);
-				});
-				PaymentCache.putSuccessParams(Convert.toStr(successParams.getBills().getId()), successParams);
+			//新建事务,保存订单信息,
+			SuccessParams finalSuccessParams = successParams;
+			Assert.isTrue(dataHandle.saveOrUpdateEntity(billsService, successParams.getBills()), () -> {
+				throw new TradeException(ResCode.TRADE_ERROR, finalSuccessParams);
+			});
+			PaymentCache.putSuccessParams(Convert.toStr(successParams.getBills().getId()), successParams);
 
-				//判断是否是待付款
-				if (StringUtils.equals(successParams.getStatus(), AppConstant.BillPayStatus.待付款.name())) {
-					//发送消息队列
-					orderSend.sendOrderMessage(successParams);
-				}
-				return successParams;
+			//判断是否是待付款
+			if (StringUtils.equals(successParams.getStatus(), AppConstant.BillPayStatus.待付款.name())) {
+				//发送消息队列
+				orderSend.sendOrderMessage(successParams);
 			}
+			return successParams;
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw new TradeException(ResCode.TRADE_ERROR, successParams);

+ 1 - 1
ldt-core/src/main/resources/application.yml

@@ -24,7 +24,7 @@ spring:
       #validation-query: select 1 from dual
       validation-query-timeout: 2000
       initial-size: 5
-      max-active: 20
+      max-active: 200
       min-idle: 5
       max-wait: 60000
       test-on-borrow: false