diff --git a/src/main/java/com/yn/bftl/thirdparty/modules/chinaums/service/impl/WalletServiceImpl.java b/src/main/java/com/yn/bftl/thirdparty/modules/chinaums/service/impl/WalletServiceImpl.java index b4cbec2..fbe92ad 100644 --- a/src/main/java/com/yn/bftl/thirdparty/modules/chinaums/service/impl/WalletServiceImpl.java +++ b/src/main/java/com/yn/bftl/thirdparty/modules/chinaums/service/impl/WalletServiceImpl.java @@ -59,7 +59,6 @@ import com.yn.bftl.thirdparty.modules.chinaums.dto.chinaums.*; import com.yn.bftl.thirdparty.modules.chinaums.enums.OrderPayStatusEnum; import com.yn.bftl.thirdparty.modules.chinaums.enums.OrderPaymentStatusEnum; -import com.yn.bftl.thirdparty.modules.chinaums.enums.TransactionCodeEnum; import com.yn.bftl.thirdparty.modules.chinaums.repository.ChinaumsAuthInfoRepository; import com.yn.bftl.thirdparty.modules.chinaums.service.AuthService; import com.yn.bftl.thirdparty.modules.chinaums.service.WalletService; @@ -87,7 +86,6 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; -import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; @@ -546,6 +544,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public AccountPaymentsVO payments(AccountPaymentsDTO accountPaymentsDTO) { ByxTransferDTO byxTransferDTO = new ByxTransferDTO(); AccountPaymentsVO accountPaymentsVO = new AccountPaymentsVO(); @@ -580,6 +579,17 @@ accountPaymentsVO.setPayBalanceAcctId(accountPaymentsDTO.getPayBalanceAcctId()); accountPaymentsVO.setRecvBalanceAcctId(accountPaymentsDTO.getRecvBalanceAcctId()); + ExternalIncomeDTO externalIncomeDTO = new ExternalIncomeDTO(); + externalIncomeDTO.setAmount(accountPaymentsVO.getAmount()); + externalIncomeDTO.setTradeId(accountPaymentsVO.getPaymentId()); + externalIncomeDTO.setBalanceAcctId(accountPaymentsVO.getRecvBalanceAcctId()); + externalIncomeDTO.setTransactionNo(accountPaymentsVO.getPaymentId()); + externalIncomeDTO.setRecordedAt(accountPaymentsVO.getFinishedAt()); + externalIncomeDTO.setCreatedAt(accountPaymentsVO.getCreatedAt()); + externalIncomeDTO.setBankMemo(accountPaymentsVO.getRemark()); + externalIncomeDTO.setOrigOutOrderNo(accountPaymentsVO.getOutOrderNo()); + paymentCallBack(externalIncomeDTO); + return accountPaymentsVO; } @@ -652,6 +662,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public WithdrawalsVO withdrawals(WithdrawalsDTO withdrawalsDTO) { // Company company = getUser().getCompany(); // ByxAsyncWithdrawDTO byxAsyncWithdrawDTO = new ByxAsyncWithdrawDTO(); @@ -702,6 +713,8 @@ if("20000".equals(byxAsyncWithdrawVO.getRspCode())){ withdrawalsVO.setStatus("processing"); withdrawalsVO.setWithdrawalId(byxAsyncWithdrawVO.getTransOrderNo()); + + withdrawalsCallBack(withdrawalsVO.getOutOrderNo()); } else { withdrawalsVO.setStatus("failed"); @@ -711,6 +724,31 @@ return withdrawalsVO; } + private void withdrawalsCallBack(String outOrderNo) { + AllinpayMutual allinpayMutual = allinpayMutualRepository.findFirstByBizOrderNo(outOrderNo); + if (allinpayMutual == null) { + log.error("未查询到提现记录!!!"); + return; + } + if (DealStatus.DEALSTATUS_SUCC.equals(allinpayMutual.getDealStatus())) { + log.warn("提现状态已更新!!!"); + return; + } + WithdrawalsVO withdrawalsVO = walletService.withdrawalsByOutOrderNo(outOrderNo); + if (withdrawalsVO == null) { + log.error("【提现订单查询(平台订单号)】在银联未查询到记录!!!"); + return; + } + if (!"processing".equals(withdrawalsVO.getStatus())) { + Long companyId = allinpayMutual.getCompany().getId(); + Account account = accountRepository.findDepositAccount(companyId); + if (account == null) { + throw new YnceErrorException("账户不存在"); + } + unionpayAccountService.withdrawalsHandle(account, withdrawalsVO); + } + } + @Override public WithdrawalsVO withdrawalsByOutOrderNo(String outOrderNo) { // Map map = new HashMap() {{ @@ -2295,4 +2333,82 @@ private String getBalanceAcctIdLockKey(String balanceAcctId) { return balanceAcctId + ":BALANCE_ACCT_ID"; } + + /** + * 转账入金回调处理 + */ + private void paymentCallBack(ExternalIncomeDTO externalIncomeDTO){ + +// log.info("转账入金 交易类型为:{}", externalIncomeDTO.getTradeType()); + // 加锁,避免并发请求 + String lockKeyTradeId = externalIncomeDTO.getTradeId(); + Boolean lockTradeId = stringRedisTemplate.opsForValue().setIfAbsent(lockKeyTradeId, lockKeyTradeId); + // 拿不到锁直接返回 + if (!lockTradeId) { + throw new YnceErrorException("转账入金(充值)处理中,稍后重试"); + } + stringRedisTemplate.expire(lockKeyTradeId, 1, TimeUnit.MINUTES); + try { + ChinaumsAuthInfo chinaumsAuthInfo = chinaumsAuthInfoRepository.findFirstByBalanceAcctId(externalIncomeDTO.getBalanceAcctId()); + if (chinaumsAuthInfo == null) { + throw new YnceErrorException("未查询到银联认证信息"); + } + AccountChangeList accountChangeList = accountChangeListRepository.findFirstBySourceNo(externalIncomeDTO.getTradeId()); + if (accountChangeList != null) { + log.warn("该入金已生成异动记录!!!"); + return; + } + Company company = chinaumsAuthInfo.getCompany(); + // Account account = accountRepository.findDepositAccount(company.getId()); + // TopUpList topUpList = topUpListRepository.findTopByAccountAndStateOrderByCreatedOnDesc(account, TopUpState.PAID); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss+08:00") + .withZone(ZoneId.of("Asia/Shanghai")); + // 可查90个自然日的交易,单次查询开始和结束时间间隔不大于7天 + LocalDateTime dateTime = LocalDateTime.now().minusDays(6L); + BalanceTransactionsPageVO balanceTransactionsPageVO = this.balanceTransactions(company.getWalletId(), dateTimeFormatter.format(dateTime), null); + if (balanceTransactionsPageVO.getTotal() <= 0) { + log.warn("未查询到流水记录!!!"); + return; + } + // 标记查询的流水中是否有当前入金的回调 + boolean flag = false; + List data = balanceTransactionsPageVO.getData(); + for (BalanceTransactionsPageVO.BalanceTransactionsVO d : data) { + // 只处理交易类型为入金的流水 + if (d.getTradeType() != 11 && d.getTradeType() != 93) { + continue; + } + + if (externalIncomeDTO.getTradeId().equals(d.getTradeId())) { + flag = true; + RechargeDTO rechargeDTO = new RechargeDTO(); + rechargeDTO.setCompanyId(company.getId()); + BigDecimal rechargeAmount; + if (d.getSettledAmount() > 0) { + rechargeAmount = new BigDecimal(d.getSettledAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + } else { + rechargeAmount = new BigDecimal(d.getPendingAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + } + rechargeDTO.setRechargeAmount(rechargeAmount); + if (StringUtils.isNotEmpty(d.getRemark())) { + rechargeDTO.setRemarks(d.getRemark()); + } else { + rechargeDTO.setRemarks("银联钱包充值"); + } + rechargeDTO.setPaymentMethod("银联支付"); + // rechargeDTO.setFinishedDate(LocalDateTime.parse(d.getSucceededAt(), DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSzzz"))); + rechargeDTO.setFinishedDate(DateTimeUtils.getLocalDateTimeByRFC3339(d.getSucceededAt())); + rechargeDTO.setSourceNo(d.getTradeId()); + unionpayAccountService.rechargeMoney(rechargeDTO); + break; + } + + } + } + finally { + // 执行成功和失败都需要删除锁 + stringRedisTemplate.delete(lockKeyTradeId); + } + + } }