| | |
| | | appUser.setBalance(money(appUser.getBalance()).add(delta).setScale(2, RoundingMode.HALF_UP)); |
| | | appUserClient.updateAppUser(appUser); |
| | | } |
| | | |
| | | |
| | | private void recordBalanceConsume(TChargingOrder chargingOrder, BigDecimal consumeAmount) { |
| | | if (chargingOrder == null || chargingOrder.getAppUserId() == null || chargingOrder.getId() == null |
| | | || consumeAmount == null || consumeAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return; |
| | | } |
| | | ExchangeCodeConsumeDTO consumeDTO = new ExchangeCodeConsumeDTO(); |
| | | consumeDTO.setUserId(chargingOrder.getAppUserId()); |
| | | consumeDTO.setOrderId(chargingOrder.getId()); |
| | | consumeDTO.setAmount(consumeAmount); |
| | | R<ExchangeCodeConsumeResultVO> result = otherClient.consumeExchangeCodeBalance(consumeDTO); |
| | | if (result == null || result.getCode() != 200) { |
| | | throw new RuntimeException("??????????"); |
| | | } |
| | | } |
| | | |
| | | private void recordBalanceRefund(TChargingOrder chargingOrder, BigDecimal refundAmount, String refundNo) { |
| | | if (chargingOrder == null || chargingOrder.getAppUserId() == null || chargingOrder.getId() == null |
| | | || refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return; |
| | | } |
| | | ExchangeCodeConsumeDTO refundDTO = new ExchangeCodeConsumeDTO(); |
| | | refundDTO.setUserId(chargingOrder.getAppUserId()); |
| | | refundDTO.setOrderId(chargingOrder.getId()); |
| | | refundDTO.setAmount(refundAmount); |
| | | refundDTO.setRefundNo(refundNo); |
| | | R<ExchangeCodeConsumeResultVO> result = otherClient.refundExchangeCodeBalance(refundDTO); |
| | | if (result == null || result.getCode() != 200) { |
| | | throw new RuntimeException("??????????"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) { |
| | | Long userId = tokenService.getLoginUserApplet().getUserId(); |
| | |
| | | |
| | | if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(userId, balancePayAmount.negate()); |
| | | recordBalanceConsume(chargingOrder, balancePayAmount); |
| | | } |
| | | if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | return chargingOrderCallback(addChargingOrder.getPaymentType(), chargingOrder.getCode(), "BALANCE", null); |
| | |
| | | throw new RuntimeException("余额不足,支付回调处理失败"); |
| | | } |
| | | changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate()); |
| | | recordBalanceConsume(chargingOrder, money(chargingOrder.getBalancePayAmount())); |
| | | } |
| | | chargingOrder.setRechargePaymentStatus(2); |
| | | chargingOrder.setRechargeSerialNumber(transaction_id); |
| | |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount); |
| | | recordBalanceRefund(chargingOrder, balanceRefundAmount, chargingOrderRefund.getRefundCode()); |
| | | } |
| | | chargingOrderRefund.setRefundStatus(2); |
| | | chargingOrderRefund.setRefundSerialNumber("BALANCE"); |
| | |
| | | } |
| | | this.updateById(chargingOrder); |
| | | chargingOrderRefund.setRefundAmount(thirdRefundAmount); |
| | | if (1 == rechargePaymentType) { |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) { |
| | | WxPaymentRefundModel model = new WxPaymentRefundModel(); |
| | | model.setOut_trade_no(chargingOrder.getCode()); |
| | | model.setOut_refund_no(chargingOrderRefund.getRefundCode()); |
| | |
| | | model.setNotify_url("/payment/wx/refund/notify"); |
| | | WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); |
| | | amount.setRefund(money.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); |
| | | amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue()); |
| | | amount.setCurrency("CNY"); |
| | | model.setAmount(amount); |
| | | R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model); |
| | |
| | | boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS); |
| | | if(tryLock){ |
| | | TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no)); |
| | | if(null != one && one.getRefundStatus() == 1){ |
| | | one.setRefundSerialNumber(refund_id); |
| | | one.setRefundStatus(2); |
| | | one.setRefundTime(LocalDateTime.now()); |
| | | chargingOrderRefundService.updateById(one); |
| | | |
| | | TChargingOrder order = this.getById(one.getChargingOrderId()); |
| | | if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount())); |
| | | } |
| | | TChargingOrder chargingOrder = new TChargingOrder(); |
| | | chargingOrder.setId(one.getChargingOrderId()); |
| | | chargingOrder.setAppUserId(order.getAppUserId()); |
| | | chargingOrder.setRefundStatus(2); |
| | | chargingOrder.setRefundSerialNumber(refund_id); |
| | | chargingOrder.setRefundTime(LocalDateTime.now()); |
| | | this.updateById(chargingOrder); |
| | | if (null == one || one.getRefundStatus() == null || one.getRefundStatus() != 1) { |
| | | return AjaxResult.success(); |
| | | } |
| | | if (!"SUCCESS".equals(tradeState)) { |
| | | return AjaxResult.success(); |
| | | } |
| | | TChargingOrder order = this.getById(one.getChargingOrderId()); |
| | | if (order == null || (order.getRefundStatus() != null && order.getRefundStatus() == 2)) { |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | one.setRefundSerialNumber(refund_id); |
| | | one.setRefundStatus(2); |
| | | one.setRefundTime(LocalDateTime.now()); |
| | | chargingOrderRefundService.updateById(one); |
| | | |
| | | if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount())); |
| | | recordBalanceRefund(order, money(order.getBalanceRefundAmount()), one.getRefundCode()); |
| | | } |
| | | TChargingOrder chargingOrder = new TChargingOrder(); |
| | | chargingOrder.setId(one.getChargingOrderId()); |
| | | chargingOrder.setAppUserId(order.getAppUserId()); |
| | | chargingOrder.setRefundStatus(2); |
| | | chargingOrder.setRefundSerialNumber(refund_id); |
| | | chargingOrder.setRefundTime(LocalDateTime.now()); |
| | | this.updateById(chargingOrder); |
| | | } |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | |
| | | if (actualBalancePayAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | actualBalancePayAmount = BigDecimal.ZERO; |
| | | } |
| | | if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null |
| | | && actualBalancePayAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO(); |
| | | exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId()); |
| | | exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId()); |
| | | exchangeCodeConsumeDTO.setAmount(actualBalancePayAmount); |
| | | otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO); |
| | | } |
| | | refundAmount = thirdRefundAmount.add(balanceRefundAmount); |
| | | chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | | chargingOrder.setThirdRefundAmount(thirdRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | |
| | | chargingOrderRefund.setPayAmount(rechargeAmount); |
| | | chargingOrderRefund.setRefundTime(LocalDateTime.now()); |
| | | chargingOrderRefundService.save(chargingOrderRefund); |
| | | if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount); |
| | | recordBalanceRefund(chargingOrder, balanceRefundAmount, chargingOrderRefund.getRefundCode()); |
| | | } |
| | | |
| | | chargingOrder.setRefundStatus(2); |
| | | chargingOrder.setRefundTime(LocalDateTime.now()); |