package cc.mrbird.febs.mall.chain.service; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MallMoneyFlowTypeEnum; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.chain.enums.ChainEnum; import cc.mrbird.febs.mall.chain.enums.CoinTypeEnum; import cc.mrbird.febs.mall.entity.MallMemberWallet; import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.entity.MemberCoinAddressEntity; import cc.mrbird.febs.mall.entity.MemberCoinChargeEntity; import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper; import cc.mrbird.febs.mall.mapper.MemberCoinAddressDao; import cc.mrbird.febs.mall.mapper.MemberCoinChargeDao; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.web3j.protocol.core.methods.response.Transaction; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service public class BaseCoinService { @Resource private RedisUtils redisUtils; @Resource private MemberCoinChargeDao memberCoinChargeDao; @Resource private MemberCoinAddressDao memberCoinAddressDao; @Resource private MallMemberWalletMapper mallMemberWalletMapper; @Resource private IMallMoneyFlowService mallMoneyFlowService; public void compile(Transaction e) { if (e.getTo() == null) { return; } redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.getBlockNumber()); String address = e.getTo(); String hash = e.getHash(); MemberCoinAddressEntity coinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, CoinTypeEnum.USDT.toString()); if (coinAddressEntity == null) { return; } // 判断对方打款地址是否为源池地址 if(ObjectUtil.isNotEmpty(coinAddressEntity)){ // if (ChainEnum.BSC_USDT.getAddress().toLowerCase().equals(e.to)) { log.info("触发USDT合约监听事件"); redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, e.getBlockNumber()); // hash没有用过 Map param = new HashMap<>(); param.put("hash", hash); param.put("address", address); List memberCoinChargeEntities = memberCoinChargeDao.selectByMap(param); if (CollectionUtils.isNotEmpty(memberCoinChargeEntities)) { return; } // MemberCoinAddressEntity coinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, CoinTypeEnum.USDT.toString()); // if (coinAddressEntity == null) { // return; // } Long memberId = coinAddressEntity.getMemberId(); BigDecimal amount = new BigDecimal(e.getValue()).divide(BigDecimal.TEN.pow(18), 8, RoundingMode.HALF_DOWN); BigDecimal balance = amount; if (balance != null && balance.compareTo(new BigDecimal("0.1")) > 0) { balance = balance.setScale(8, RoundingMode.CEILING); BigDecimal early = BigDecimal.ZERO; // 查询钱包 并更新 MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); if (mallMemberWallet == null) { return; } mallMemberWalletMapper.updateBlockBalanceById(mallMemberWallet.getId(), balance); String orderNo = insertCoinCharge(address, memberId, balance, CoinTypeEnum.USDT.name(), "ERC20", BigDecimal.ZERO, hash); // 插入财务记录 Long chargeFlowId = mallMoneyFlowService.addMoneyFlow( memberId, orderNo, balance.setScale(4, BigDecimal.ROUND_DOWN), MallMoneyFlowTypeEnum.CHARGE.getCode(), MallMoneyFlow.STATUS_SUCCESS, MallMoneyFlow.IS_RETURN_Y, memberId, FlowTypeEnum.BALANCE.getValue(), MallMoneyFlowTypeEnum.CHARGE.getName() ); // 同步 // BigDecimal bigDecimal = ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOf(e.to); } } } public String insertCoinCharge(String address, Long memberId, BigDecimal newBalance, String symbol, String tag, BigDecimal lastAmount, String hash) { MemberCoinChargeEntity memberCoinChargeEntity = new MemberCoinChargeEntity(); memberCoinChargeEntity.setAddress(address); memberCoinChargeEntity.setMemberId(memberId); memberCoinChargeEntity.setAmount(newBalance); memberCoinChargeEntity.setSymbol(symbol); memberCoinChargeEntity.setTag(tag); memberCoinChargeEntity.setStatus(1); memberCoinChargeEntity.setLastAmount(lastAmount); memberCoinChargeEntity.setHash(hash); String orderNo = generateNo(); memberCoinChargeEntity.setOrderCode(orderNo); memberCoinChargeDao.insert(memberCoinChargeEntity); return orderNo; } private String generateNo() { // 生成订单号 Long timestamp = System.currentTimeMillis(); // 随机数 int random = (int) (Math.random() * 10); return String.valueOf(timestamp).substring(2) + random; } }