| | |
| | | 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())); |
| | | } |
| | | |
| | | private void fillUseRecordBalances(List<TExchangeCodeUseRecord> records, Long userId) { |
| | |
| | | } |
| | | 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))); |
| | | } |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | |
| | | 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)); |
| | | } |
| | | |
| | | private void fillUseRecordView(TExchangeCodeUseRecord record) { |