| | |
| | | @Resource |
| | | private UserCreditRecordService userCreditRecordService; |
| | | |
| | | @Resource |
| | | private UserCreditManager userCreditManager; |
| | | |
| | | /** |
| | | * 用户积分兑换 |
| | | * |
| | |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_BALANCE_NOT_ENOUGH, "用户积分不足"); |
| | | } |
| | | |
| | | |
| | | |
| | | // 如果是红包兑换,判断用户兑换频率 |
| | | if (exchangeType == CreditExchangeRecord.ExchangeType.FUND_EXCHANGE) { |
| | | checkRedPacketExchangeFrequency(userId); |
| | |
| | | BigDecimal exchangeAmount = calculateExchangeAmount(request.getUid(), request.getConsumedCredits()); |
| | | exchangeRecord.setExchangeValue(exchangeAmount); |
| | | } |
| | | // 扣减用户积分 |
| | | userCreditBalanceService.decreaseCreditBalance(userId, request.getConsumedCredits()); |
| | | |
| | | // 记录兑换记录 |
| | | exchangeRecord.setUid(userId); |
| | | exchangeRecord.setExchangeType(exchangeType); |
| | |
| | | exchangeRecord.setExchangeInfo2(alipayBindings.get(0).getAlipayAccount()); |
| | | exchangeRecord.setCreateTime(new Date()); |
| | | exchangeRecord.setUpdateTime(new Date()); |
| | | return userCreditExchangeRecordService.addExchangeRecord(exchangeRecord); |
| | | userCreditExchangeRecordService.addExchangeRecord(exchangeRecord); |
| | | |
| | | // 扣减用户积分 |
| | | userCreditManager.decreaseCredit(UserCreditRecord.builder() |
| | | .creditAmount(request.getConsumedCredits()) |
| | | .consumptionMethod(UserCreditRecord.ConsumptionMethod.EXCHANGE_RED_PACKET) |
| | | .direction(UserCreditRecord.DIRECTION_CONSUME) |
| | | .identifierId(exchangeRecord.getId()+"") |
| | | .uid(exchangeRecord.getUid()) |
| | | .description("红包兑换") |
| | | .build()); |
| | | return exchangeRecord.getId(); |
| | | } |
| | | |
| | | /** |
| | |
| | | CreditExchangeRecord exchangeRecord = userCreditExchangeRecordService.getExchangeRecordByIdForUpdate(exchangeRecordId); |
| | | if (exchangeRecord == null) { |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_NOT_BIND_ALIPAY_ACCOUNT, "兑换记录不存在"); |
| | | } |
| | | |
| | | if(exchangeRecord.getExchangeStatus() != CreditExchangeRecord.STATUS_NOT_VERIFY){ |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_COMMON, "兑换已处理"); |
| | | } |
| | | |
| | | // 如果是红包兑换,调用通过兑换逻辑(TODO) |
| | |
| | | if (exchangeRecord == null) { |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_NOT_BIND_ALIPAY_ACCOUNT, "兑换记录不存在"); |
| | | } |
| | | |
| | | if(exchangeRecord.getExchangeStatus() != CreditExchangeRecord.STATUS_NOT_VERIFY){ |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_COMMON, "兑换已处理"); |
| | | } |
| | | |
| | | |
| | | // 退回用户积分余额 |
| | | userCreditBalanceService.increaseCreditBalance(exchangeRecord.getUid(), exchangeRecord.getConsumedCredits()); |
| | |
| | | * @param credit |
| | | * @return |
| | | */ |
| | | private BigDecimal calculateExchangeAmount(Long uid, int credit) throws UserCreditExchangeException{ |
| | | public BigDecimal calculateExchangeAmount(Long uid, int credit) throws UserCreditExchangeException{ |
| | | long count = userCreditExchangeRecordService.countExchangeRecords(CreditExchangeRecordMapper.DaoQuery.builder() |
| | | .uid(uid).build()); |
| | | Date nowDate = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(System.currentTimeMillis(),"yyyyMMddHHmm"),"yyyyMMddHHmm")); |
| | |
| | | if(count<=0){ |
| | | // 新人兑换 |
| | | List<ExchangeRate> rates = exchangeRateService.listExchangeRates(ExchangeRateMapper.DaoQuery.builder() |
| | | .exchangeType(ExchangeRate.ExchangeType.NEW_USER_EXCHANGE) |
| | | .minStartTime(nowDate) |
| | | .maxEndTime(nowDate) |
| | | .exchangeType(ExchangeRate.ExchangeRateType.NEW_USER_EXCHANGE) |
| | | .maxStartTime(nowDate) |
| | | .minEndTime(nowDate) |
| | | .count(Integer.MAX_VALUE) |
| | | .build()); |
| | | if(rates.isEmpty()) { |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_COMMON,"新人兑换汇率未设置"); |
| | |
| | | }else{ |
| | | // 老用户兑换 |
| | | List<ExchangeRate> rates = exchangeRateService.listExchangeRates(ExchangeRateMapper.DaoQuery.builder() |
| | | .exchangeType(ExchangeRate.ExchangeType.GENERAL_EXCHANGE) |
| | | .minStartTime(nowDate) |
| | | .maxEndTime(nowDate) |
| | | .exchangeType(ExchangeRate.ExchangeRateType.GENERAL_EXCHANGE) |
| | | .maxStartTime(nowDate) |
| | | .minEndTime(nowDate) |
| | | .count(Integer.MAX_VALUE) |
| | | .build()); |
| | | if(rates.isEmpty()) { |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_COMMON,"老用户兑换汇率未设置"); |
| | | } |
| | | money = new BigDecimal(credit).multiply(rates.get(0).getRate()).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | CreditSetting setting = creditSettingService.getSettingCacheByType(CreditSetting.CreditSettingType.MINIMUM_EXCHANGE_AMOUNT, nowDate); |
| | | if(setting!=null&& new BigDecimal(setting.getValue()).compareTo(money)>0){ |
| | | throw new UserCreditExchangeException(UserCreditExchangeException.CODE_COMMON,String.format("兑换金额不能低于%s元",setting.getValue())); |
| | | } |
| | | return money; |
| | | } |
| | | } |