fix: release transfer locks and allow agent self transfer
This commit is contained in:
parent
d9d67b8839
commit
fc7d248171
@ -89,20 +89,20 @@ public class UserBankTransferGoldCmdExe {
|
||||
|
||||
boolean freight = freightBalanceService.existsBalance(cmd.getAcceptUserId());
|
||||
ResponseAssert.isTrue(WalletErrorCode.TARGET_USER_NOT_RECHARGE_AGENCY, freight);
|
||||
ResponseAssert.isTrue(WalletErrorCode.NOT_TRANSFER_YOURSELF, !Objects.equals(cmd.getAcceptUserId(), cmd.requiredReqUserId()));
|
||||
|
||||
// 上锁
|
||||
String key = "UBWTransferGold:" + cmd.requiredReqUserId();
|
||||
ResponseAssert.isTrue(CommonErrorCode.REQUEST_LIMITING, redisService.lock(key, 60));
|
||||
|
||||
BigDecimal balance = userBankBalanceService.getBalance(cmd.requiredReqUserId())
|
||||
.getAccurateBalance();
|
||||
try {
|
||||
BigDecimal balance = userBankBalanceService.getBalance(cmd.requiredReqUserId())
|
||||
.getAccurateBalance();
|
||||
|
||||
ResponseAssert.isTrue(WalletErrorCode.INSUFFICIENT_BALANCE,
|
||||
ArithmeticUtils.gte(balance, cmd.getAmount()));
|
||||
ResponseAssert.isTrue(WalletErrorCode.INSUFFICIENT_BALANCE,
|
||||
ArithmeticUtils.gte(balance, cmd.getAmount()));
|
||||
|
||||
// 获得区域兑换比例金币比例
|
||||
Double goldRatio = getExchangeGoldRatio(cmd);
|
||||
// 获得区域兑换比例金币比例
|
||||
Double goldRatio = getExchangeGoldRatio(cmd);
|
||||
|
||||
BigDecimal goldQuantity = BigDecimal.valueOf(goldRatio).multiply(cmd.getAmount()).setScale(0, RoundingMode.DOWN);
|
||||
|
||||
@ -112,39 +112,41 @@ public class UserBankTransferGoldCmdExe {
|
||||
long result = goldQuantity.divide(new BigDecimal(10000), RoundingMode.DOWN).setScale(0, RoundingMode.DOWN).longValue();
|
||||
ResponseAssert.isTrue(FreightErrorCode.NOT_THRESHOLD, result >= Optional.ofNullable(freightBalance.getDeliveryThreshold()).orElse(0));
|
||||
|
||||
// 扣钱
|
||||
BankBalanceDTO decrUserBankBalanceDTO = userBankBalanceService.decr(cmd.requiredReqUserId(),
|
||||
PennyAmount.ofDollar(cmd.getAmount()));
|
||||
ResponseAssert.notNull(WalletErrorCode.INSUFFICIENT_BALANCE, decrUserBankBalanceDTO);
|
||||
// 扣钱
|
||||
BankBalanceDTO decrUserBankBalanceDTO = userBankBalanceService.decr(cmd.requiredReqUserId(),
|
||||
PennyAmount.ofDollar(cmd.getAmount()));
|
||||
ResponseAssert.notNull(WalletErrorCode.INSUFFICIENT_BALANCE, decrUserBankBalanceDTO);
|
||||
|
||||
Long bankRunWaterId = IdWorkerUtils.getId();
|
||||
Long bankRunWaterId = IdWorkerUtils.getId();
|
||||
|
||||
// 银行卡流水
|
||||
userBankRunningWaterService.add(
|
||||
new UserBankRunningWater()
|
||||
.setId(bankRunWaterId)
|
||||
.setUserId(cmd.requiredReqUserId())
|
||||
.setSysOrigin(cmd.requireReqSysOrigin())
|
||||
.setType(ReceiptType.EXPENDITURE.getType())
|
||||
.setAmount(cmd.getAmount())
|
||||
.setEvent(UserBankWaterEvent.TRANSFER_GOLD.name())
|
||||
.setEventDescribe(UserBankWaterEvent.TRANSFER_GOLD.getDescribe())
|
||||
.setRemark("Withdrawal transfer")
|
||||
.setTrackId(Objects.toString(cmd.getAcceptUserId()))
|
||||
.setBalance(decrUserBankBalanceDTO.getAccurateBalance())
|
||||
.setCreateTime(TimestampUtils.now())
|
||||
.setUpdateTime(TimestampUtils.now())
|
||||
.setCreateUser(cmd.getReqUserId())
|
||||
.setCreateUserOrigin(OpUserType.APP.getType())
|
||||
);
|
||||
// 银行卡流水
|
||||
userBankRunningWaterService.add(
|
||||
new UserBankRunningWater()
|
||||
.setId(bankRunWaterId)
|
||||
.setUserId(cmd.requiredReqUserId())
|
||||
.setSysOrigin(cmd.requireReqSysOrigin())
|
||||
.setType(ReceiptType.EXPENDITURE.getType())
|
||||
.setAmount(cmd.getAmount())
|
||||
.setEvent(UserBankWaterEvent.TRANSFER_GOLD.name())
|
||||
.setEventDescribe(UserBankWaterEvent.TRANSFER_GOLD.getDescribe())
|
||||
.setRemark("Withdrawal transfer")
|
||||
.setTrackId(Objects.toString(cmd.getAcceptUserId()))
|
||||
.setBalance(decrUserBankBalanceDTO.getAccurateBalance())
|
||||
.setCreateTime(TimestampUtils.now())
|
||||
.setUpdateTime(TimestampUtils.now())
|
||||
.setCreateUser(cmd.getReqUserId())
|
||||
.setCreateUserOrigin(OpUserType.APP.getType())
|
||||
);
|
||||
|
||||
// 发送金额
|
||||
sendGold(cmd, freight, goldQuantity, bankRunWaterId, "转账金币");
|
||||
// 发送金额
|
||||
sendGold(cmd, freight, goldQuantity, bankRunWaterId, "转账金币");
|
||||
|
||||
redisService.unlock(key);
|
||||
return new UserBankWithdrawResultCO()
|
||||
.setBankBalance(decrUserBankBalanceDTO.getAccurateBalance())
|
||||
.setWithdrawAmount(Objects.toString(cmd.getAmount()));
|
||||
return new UserBankWithdrawResultCO()
|
||||
.setBankBalance(decrUserBankBalanceDTO.getAccurateBalance())
|
||||
.setWithdrawAmount(Objects.toString(cmd.getAmount()));
|
||||
} finally {
|
||||
redisService.unlock(key);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendGold(UserBankWithdrawTransferCmd cmd, boolean freight, BigDecimal goldQuantity,
|
||||
|
||||
@ -44,10 +44,12 @@ public class UserBankSearchUserProfileQryExe {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (isTransfer(cmd)) {
|
||||
if (Objects.equals(cmd.getReqUserId(), userProfile.getId())) {
|
||||
return null;
|
||||
}
|
||||
boolean transfer = isTransfer(cmd);
|
||||
boolean sameUser = Objects.equals(cmd.getReqUserId(), userProfile.getId());
|
||||
boolean freightAgent = cmd.typeEqAgent()
|
||||
&& Boolean.TRUE.equals(freightBalanceService.checkFreightAgent(userProfile.getId()));
|
||||
if (transfer && sameUser && !freightAgent) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (cmd.typeEqBD()) {
|
||||
@ -67,12 +69,11 @@ public class UserBankSearchUserProfileQryExe {
|
||||
}
|
||||
|
||||
if (cmd.typeEqAgent()) {
|
||||
Boolean freightAgent = freightBalanceService.checkFreightAgent(userProfile.getId());
|
||||
if (freightAgent) {
|
||||
return userProfile;
|
||||
}
|
||||
if (isTransfer(cmd)) {
|
||||
return null;
|
||||
if (transfer) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Objects.equals(
|
||||
|
||||
@ -81,19 +81,19 @@ public class SalaryTransferGoldCmdExe {
|
||||
|
||||
boolean freight = freightBalanceService.existsBalance(cmd.getAcceptUserId());
|
||||
ResponseAssert.isTrue(WalletErrorCode.TARGET_USER_NOT_RECHARGE_AGENCY, freight);
|
||||
ResponseAssert.isTrue(WalletErrorCode.NOT_TRANSFER_YOURSELF, !Objects.equals(cmd.getAcceptUserId(), cmd.requiredReqUserId()));
|
||||
|
||||
// 上锁
|
||||
String key = "USTransferGold:" + cmd.requiredReqUserId();
|
||||
ResponseAssert.isTrue(CommonErrorCode.REQUEST_LIMITING, redisService.lock(key, 60));
|
||||
|
||||
BigDecimal balance = salaryAccountGateway.getAvailableBalance(cmd.getReqUserId(), SalaryType.of(cmd.getSalaryType())).getDollarAmount();
|
||||
try {
|
||||
BigDecimal balance = salaryAccountGateway.getAvailableBalance(cmd.getReqUserId(), SalaryType.of(cmd.getSalaryType())).getDollarAmount();
|
||||
|
||||
ResponseAssert.isTrue(WalletErrorCode.INSUFFICIENT_BALANCE,
|
||||
ArithmeticUtils.gte(balance, cmd.getAmount()));
|
||||
ResponseAssert.isTrue(WalletErrorCode.INSUFFICIENT_BALANCE,
|
||||
ArithmeticUtils.gte(balance, cmd.getAmount()));
|
||||
|
||||
// 获得区域兑换比例金币比例
|
||||
Double goldRatio = getExchangeGoldRatio(cmd);
|
||||
// 获得区域兑换比例金币比例
|
||||
Double goldRatio = getExchangeGoldRatio(cmd);
|
||||
Long bankRunWaterId = IdWorkerUtils.getId();
|
||||
|
||||
BigDecimal goldQuantity = BigDecimal.valueOf(goldRatio).multiply(cmd.getAmount()).setScale(0, RoundingMode.DOWN);
|
||||
@ -104,19 +104,21 @@ public class SalaryTransferGoldCmdExe {
|
||||
long result = goldQuantity.divide(new BigDecimal(10000), RoundingMode.DOWN).setScale(0, RoundingMode.DOWN).longValue();
|
||||
ResponseAssert.isTrue(FreightErrorCode.NOT_THRESHOLD, result >= Optional.ofNullable(freightBalance.getDeliveryThreshold()).orElse(0));
|
||||
|
||||
// 扣钱
|
||||
cmd.setReqTraceId(String.valueOf(bankRunWaterId));
|
||||
SalaryReceipt receipt = salaryAccountConvertor.toTransferReceipt(cmd);
|
||||
SalaryReceiptRes salaryReceiptRes = salaryAccountGateway.changeBalance(receipt);
|
||||
ResponseAssert.notNull(WalletErrorCode.INSUFFICIENT_BALANCE, salaryReceiptRes);
|
||||
// 扣钱
|
||||
cmd.setReqTraceId(String.valueOf(bankRunWaterId));
|
||||
SalaryReceipt receipt = salaryAccountConvertor.toTransferReceipt(cmd);
|
||||
SalaryReceiptRes salaryReceiptRes = salaryAccountGateway.changeBalance(receipt);
|
||||
ResponseAssert.notNull(WalletErrorCode.INSUFFICIENT_BALANCE, salaryReceiptRes);
|
||||
|
||||
// 发送金额
|
||||
sendGold(cmd, freight, goldQuantity, bankRunWaterId, "转账金币");
|
||||
// 发送金额
|
||||
sendGold(cmd, freight, goldQuantity, bankRunWaterId, "转账金币");
|
||||
|
||||
redisService.unlock(key);
|
||||
return new UserBankWithdrawResultCO()
|
||||
.setBankBalance(salaryReceiptRes.getAvailableBalance().getDollarAmount())
|
||||
.setWithdrawAmount(Objects.toString(cmd.getAmount()));
|
||||
return new UserBankWithdrawResultCO()
|
||||
.setBankBalance(salaryReceiptRes.getAvailableBalance().getDollarAmount())
|
||||
.setWithdrawAmount(Objects.toString(cmd.getAmount()));
|
||||
} finally {
|
||||
redisService.unlock(key);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendGold(SalaryWithdrawCmd cmd, boolean freight, BigDecimal goldQuantity,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user