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.constants.ChainConstants;
|
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.collection.CollUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.collections.CollectionUtils;
|
import org.springframework.stereotype.Service;
|
|
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;
|
import java.util.Set;
|
|
@Slf4j
|
@Service
|
public class BscUsdtContractEvent implements ContractEventService {
|
|
@Resource
|
private RedisUtils redisUtils;
|
@Resource
|
private MemberCoinChargeDao memberCoinChargeDao;
|
@Resource
|
private MemberCoinAddressDao memberCoinAddressDao;
|
@Resource
|
private MallMemberWalletMapper mallMemberWalletMapper;
|
@Resource
|
private IMallMoneyFlowService mallMoneyFlowService;
|
|
@Override
|
public void compile(EthUsdtContract.TransferEventResponse e) {
|
if (e.to == null) {
|
return;
|
}
|
|
// redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.log.getBlockNumber());
|
|
String address = e.to;
|
String hash = e.log.getTransactionHash();
|
List<String> tdCoinWallets = memberCoinAddressDao.selectAllSymbolAddress(CoinTypeEnum.USDT.toString(),"ERC20");
|
// Set<Object> addressList = redisUtils.sGet(ChainConstants.REDIS_KEY_SYSTEM_ADDRESS);
|
// 判断对方打款地址是否为源池地址
|
if(CollUtil.isNotEmpty(tdCoinWallets) && tdCoinWallets.contains(address)){
|
log.info("触发USDT合约监听事件");
|
// redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, e.log.getBlockNumber());
|
// hash没有用过
|
Map<String, Object> param = new HashMap<>();
|
param.put("hash", hash);
|
param.put("address", address);
|
List<MemberCoinChargeEntity> 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();
|
ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name());
|
int decimals = sourceUsdtInstance.decimals();
|
BigInteger tokens = e.tokens;
|
BigDecimal amount = new BigDecimal(tokens.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, 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()
|
);
|
}
|
}
|
}
|
|
|
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;
|
}
|
}
|