Administrator
2025-04-23 595b7935a30e84fba1bc3561d05f9d19d3e32e1f
src/main/java/com/taoke/autopay/manager/UserCreditExchangeManager.java
@@ -36,6 +36,9 @@
    @Resource
    private UserCreditRecordService userCreditRecordService;
    @Resource
    private UserCreditManager userCreditManager;
    /**
     * 用户积分兑换
     *
@@ -56,6 +59,8 @@
            throw new UserCreditExchangeException(UserCreditExchangeException.CODE_BALANCE_NOT_ENOUGH, "用户积分不足");
        }
        // 如果是红包兑换,判断用户兑换频率
        if (exchangeType == CreditExchangeRecord.ExchangeType.FUND_EXCHANGE) {
            checkRedPacketExchangeFrequency(userId);
@@ -74,8 +79,7 @@
            BigDecimal exchangeAmount = calculateExchangeAmount(request.getUid(), request.getConsumedCredits());
            exchangeRecord.setExchangeValue(exchangeAmount);
        }
        // 扣减用户积分
        userCreditBalanceService.decreaseCreditBalance(userId, request.getConsumedCredits());
        // 记录兑换记录
        exchangeRecord.setUid(userId);
        exchangeRecord.setExchangeType(exchangeType);
@@ -87,7 +91,18 @@
        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();
    }
    /**
@@ -100,6 +115,10 @@
        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)
@@ -127,6 +146,11 @@
        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());
@@ -177,7 +201,7 @@
     * @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"));
@@ -186,9 +210,10 @@
        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,"新人兑换汇率未设置");
@@ -197,15 +222,21 @@
        }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;
    }
}