| | |
| | | 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)); |
| | | record.setCurrentBalance(calculateCurrentBalanceAfterRecord(userId, record.getId())); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | List<TExchangeCodeUseRecord> allRecords = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>() |
| | | .eq("user_id", userId) |
| | | .orderByAsc("id")); |
| | | .orderByDesc("id")); |
| | | Map<Long, BigDecimal> balanceMap = new HashMap<>(); |
| | | BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal balance = getCurrentExchangeCodeBalance(userId); |
| | | for (TExchangeCodeUseRecord item : allRecords) { |
| | | balance = applyUseRecordChange(balance, item); |
| | | balanceMap.put(item.getId(), balance); |
| | | balance = rollbackUseRecordChange(balance, item); |
| | | } |
| | | for (TExchangeCodeUseRecord item : records) { |
| | | item.setCurrentBalance(balanceMap.getOrDefault(item.getId(), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据流水列表计算用户当前余额。 |
| | | * |
| | | * @param records 余额流水列表 |
| | | * @return 当前余额 |
| | | */ |
| | | private BigDecimal calculateCurrentBalance(List<TExchangeCodeUseRecord> records) { |
| | | BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | if (records == null) { |
| | | return balance; |
| | | } |
| | | |
| | | private BigDecimal calculateCurrentBalanceAfterRecord(Long userId, Long recordId) { |
| | | BigDecimal balance = getCurrentExchangeCodeBalance(userId); |
| | | List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>() |
| | | .eq("user_id", userId) |
| | | .gt("id", recordId) |
| | | .orderByDesc("id")); |
| | | for (TExchangeCodeUseRecord item : records) { |
| | | balance = applyUseRecordChange(balance, item); |
| | | balance = rollbackUseRecordChange(balance, item); |
| | | } |
| | | return balance; |
| | | } |
| | | |
| | | /** |
| | | * 将单条余额流水变动应用到当前余额。 |
| | | * |
| | | * @param balance 当前余额 |
| | | * @param record 余额流水记录 |
| | | * @return 应用流水后的余额 |
| | | */ |
| | | private BigDecimal applyUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) { |
| | | private BigDecimal rollbackUseRecordChange(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); |
| | | } |
| | | return balance.add(amount).setScale(2, RoundingMode.HALF_UP); |
| | | return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private BigDecimal getCurrentExchangeCodeBalance(Long userId) { |
| | | Map<Long, BigDecimal> balanceMap = getUserExchangeCodeBalanceMap(Collections.singletonList(userId)); |
| | | return defaultMoney(balanceMap.get(userId)); |
| | | } |
| | | |
| | | /** |