package cc.mrbird.febs.mall.chain.ercCoin; import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum; import cc.mrbird.febs.common.enumerates.YesOrNoEnum; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.entity.MallCharge; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.mapper.MallChargeMapper; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.util.List; @Slf4j @Service public class BscUsdtContractEvent implements ContractEventService { @Resource private DataDictionaryCustomMapper dataDictionaryCustomMapper; @Resource private MallChargeMapper mallChargeMapper; @Resource private AgentProducer agentProducer; @Resource private RedisUtils redisUtils; @Override public void sdmUSDT(EthUsdtContract.TransferEventResponse e) { if (e.to == null) { return; } String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS_BSC.getType(), RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS_BSC.getCode() ).getValue(); String type = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.CHARGE_TYPE_BSC.getType(), RunVipDataDictionaryEnum.CHARGE_TYPE_BSC.getCode() ).getValue(); if(StrUtil.isBlank(sysAddress)){ log.info("系统未设置充值地址"); return; } // 判断收款地址是否是设置的平台地址 if (sysAddress.toLowerCase().equals(e.to)) { String transactionHash = e.log.getTransactionHash(); LambdaQueryWrapper mallChargeLambdaQueryWrapper = new LambdaQueryWrapper<>(); mallChargeLambdaQueryWrapper.eq(MallCharge::getTransHash, transactionHash); List list = mallChargeMapper.selectList(mallChargeLambdaQueryWrapper); if(CollUtil.isNotEmpty(list)){ log.info("扫描到HASH已使用:{}",transactionHash); return; } ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name()); int decimals = sourceUsdtInstance.decimals(); String fromAddress = e.from; if (fromAddress.equals(sysAddress.toLowerCase())) { log.info("系统地址转出:{}",transactionHash); return; } BigInteger tokens = e.tokens; BigDecimal amount = new BigDecimal(tokens.toString()) .divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN) .setScale(2,RoundingMode.DOWN); String chargeRedis = redisUtils.getString(AppContants.CHARGE_AMOUNT_PROFIX + amount); if (StrUtil.isBlank(chargeRedis)) { log.info("Redis未扫描到充值金额:{}",transactionHash); return; }else{ redisUtils.del(AppContants.CHARGE_AMOUNT_PROFIX + amount); log.info("Redis扫描到充值记录:{},{}",transactionHash,chargeRedis); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MallCharge::getSysAddress, sysAddress); queryWrapper.eq(MallCharge::getAmountReal, amount); queryWrapper.eq(MallCharge::getMemberId, Long.parseLong(chargeRedis)); queryWrapper.eq(MallCharge::getType, type); queryWrapper.eq(MallCharge::getState, YesOrNoEnum.ING.getValue()); List mallCharges = mallChargeMapper.selectList(queryWrapper); if(CollUtil.isEmpty(mallCharges)){ log.info("未查询到匹配充值记录,充值地址:{},HASH:{}",fromAddress,transactionHash); return; } MallCharge mallCharge = mallCharges.get(0); mallCharge.setState(YesOrNoEnum.YES.getValue()); mallChargeMapper.updateById(mallCharge); if(StrUtil.isNotEmpty(mallCharge.getVipCode())){ agentProducer.sendBuyVipSuccessMsg(mallCharge.getId()); }else{ agentProducer.sendChargeSuccessMsg(mallCharge.getId()); } log.info("扫描到用户ID:{},地址:{},充值金额:{}",mallCharge.getMemberId(),fromAddress,amount); } } }