ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1155,7 +1155,7 @@ } 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()); @@ -1292,7 +1292,7 @@ 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); @@ -1361,24 +1361,32 @@ 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())); } 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); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
@@ -306,6 +306,7 @@ .eq("user_id", query.getUserId()) .eq(query.getChangeType() != null, "change_type", query.getChangeType()) .orderByDesc("create_time")); fillUseRecordBalances(page.getRecords(), query.getUserId()); page.getRecords().forEach(this::fillUseRecordView); return page; } @@ -316,6 +317,7 @@ .eq("id", id) .eq("user_id", userId) .last("limit 1")); fillUseRecordBalance(record, userId); fillUseRecordView(record); return record; } @@ -595,6 +597,55 @@ return UUID.randomUUID().toString().replace("-", "").substring(0, 8).toUpperCase(); } private void fillUseRecordBalance(TExchangeCodeUseRecord record, Long userId) { if (record == null || userId == null || record.getId() == null) { return; } List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>() .eq("user_id", userId) .le("id", record.getId()) .orderByAsc("id")); record.setCurrentBalance(calculateCurrentBalance(records)); } private void fillUseRecordBalances(List<TExchangeCodeUseRecord> records, Long userId) { if (records == null || records.isEmpty() || userId == null) { return; } List<TExchangeCodeUseRecord> allRecords = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>() .eq("user_id", userId) .orderByAsc("id")); Map<Long, BigDecimal> balanceMap = new HashMap<>(); BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); for (TExchangeCodeUseRecord item : allRecords) { balance = applyUseRecordChange(balance, item); balanceMap.put(item.getId(), balance); } for (TExchangeCodeUseRecord item : records) { item.setCurrentBalance(balanceMap.getOrDefault(item.getId(), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))); } } private BigDecimal calculateCurrentBalance(List<TExchangeCodeUseRecord> records) { BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); if (records == null) { return balance; } for (TExchangeCodeUseRecord item : records) { balance = applyUseRecordChange(balance, item); } return balance; } private BigDecimal applyUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) { BigDecimal amount = defaultMoney(record == null ? null : record.getUsedAmount()); Integer changeType = record == null ? null : record.getChangeType(); if (USE_RECORD_TYPE_CONSUME.equals(changeType)) { return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP); } return balance.add(amount).setScale(2, RoundingMode.HALF_UP); } private void fillUseRecordView(TExchangeCodeUseRecord record) { if (record == null) { return; @@ -602,7 +653,9 @@ record.setUid(String.valueOf(record.getId())); record.setDateTime(record.getCreateTime()); record.setChangeAmount(defaultMoney(record.getUsedAmount())); record.setCurrentBalance(defaultMoney(record.getUsedAmount())); if (record.getCurrentBalance() == null) { record.setCurrentBalance(defaultMoney(record.getUsedAmount())); } if (record.getChangeType() == null) { record.setChangeType(record.getOrderId() == null || record.getOrderId() == 0 ? USE_RECORD_TYPE_EXCHANGE : USE_RECORD_TYPE_CONSUME);