【同步】BOOT 和 CLOUD 的功能

This commit is contained in:
YunaiV
2025-12-13 12:32:46 +08:00
parent b5a7350fe9
commit ec8577bdd9
29 changed files with 956 additions and 33 deletions

View File

@@ -51,7 +51,7 @@ public class PayWalletRechargeController {
public CommonResult<Boolean> updateWalletRechargeRefunded(@RequestBody PayRefundNotifyReqDTO notifyReqDTO) {
walletRechargeService.updateWalletRechargeRefunded(
Long.valueOf(notifyReqDTO.getMerchantOrderId()),
Long.valueOf(notifyReqDTO.getMerchantRefundId()),
notifyReqDTO.getMerchantRefundId(),
notifyReqDTO.getPayRefundId());
return success(true);
}

View File

@@ -56,9 +56,9 @@ public interface PayWalletRechargeService {
* 更新钱包充值记录为已退款
*
* @param id 钱包充值记录编号
* @param refundId 钱包充值退款编号(实际和 id 相同
* @param refundId 钱包充值退款编号(格式:{id}-refund
* @param payRefundId 退款单id
*/
void updateWalletRechargeRefunded(Long id, Long refundId, Long payRefundId);
void updateWalletRechargeRefunded(Long id, String refundId, Long payRefundId);
}

View File

@@ -220,9 +220,8 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService {
@Override
@Transactional(rollbackFor = Exception.class)
public void updateWalletRechargeRefunded(Long id, Long refundId, Long payRefundId) {
public void updateWalletRechargeRefunded(Long id, String refundId, Long payRefundId) {
// 1.1 获取钱包充值记录
// 说明:因为 id 和 refundId 是相同的,所以直接使用 id 查询即可!
PayWalletRechargeDO walletRecharge = walletRechargeMapper.selectById(id);
if (walletRecharge == null) {
log.error("[updateWalletRechargerPaid][钱包充值记录不存在,钱包充值记录 id({})]", id);
@@ -274,8 +273,8 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService {
walletRecharge.getId(), payRefundId, toJsonString(walletRecharge), toJsonString(payRefund));
throw exception(WALLET_RECHARGE_REFUND_FAIL_REFUND_PRICE_NOT_MATCH);
}
// 2.3 校验退款订单商户单是否匹配
if (notEqual(payRefund.getMerchantRefundId(), walletRecharge.getId().toString())) {
// 2.3 校验退款订单商户退款单是否匹配
if (notEqual(payRefund.getMerchantRefundId(), walletRecharge.getId() + "-refund")) {
log.error("[validateWalletRechargeCanRefunded][钱包({}) 退款单不匹配({})请进行处理payRefund 数据是:{}]",
walletRecharge.getId(), payRefundId, toJsonString(payRefund));
throw exception(WALLET_RECHARGE_REFUND_FAIL_REFUND_ORDER_ID_ERROR);

View File

@@ -58,13 +58,22 @@ public class PayWalletServiceImpl implements PayWalletService {
private PayRefundService refundService;
@Override
@SneakyThrows
public PayWalletDO getOrCreateWallet(Long userId, Integer userType) {
PayWalletDO wallet = walletMapper.selectByUserIdAndType(userId, userType);
if (wallet == null) {
wallet = new PayWalletDO().setUserId(userId).setUserType(userType)
.setBalance(0).setTotalExpense(0).setTotalRecharge(0);
wallet.setCreateTime(LocalDateTime.now());
walletMapper.insert(wallet);
// 使用双重检查锁,保证钱包创建并发问题
// https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1475/files
wallet = lockRedisDAO.lock(userId, UPDATE_TIMEOUT_MILLIS, () -> {
PayWalletDO newWallet = walletMapper.selectByUserIdAndType(userId, userType);
if (newWallet == null) {
newWallet = new PayWalletDO().setUserId(userId).setUserType(userType)
.setBalance(0).setTotalExpense(0).setTotalRecharge(0);
newWallet.setCreateTime(LocalDateTime.now());
walletMapper.insert(newWallet);
}
return newWallet;
});
}
return wallet;
}