package cc.mrbird.febs.mall.chain.service;
|
|
import cc.mrbird.febs.common.utils.SubMailSend;
|
import cc.mrbird.febs.common.utils.ZzSmsSend;
|
import cc.mrbird.febs.mall.chain.dto.EthUsdtChargeDto;
|
import cc.mrbird.febs.mall.chain.enums.CoinTypeEnum;
|
import cc.mrbird.febs.mall.entity.MallMemberWallet;
|
import cc.mrbird.febs.mall.entity.MemberCoinAddressEntity;
|
import cc.mrbird.febs.mall.entity.MemberCoinChargeEntity;
|
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
|
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
|
import cc.mrbird.febs.mall.mapper.MemberCoinAddressDao;
|
import cc.mrbird.febs.mall.mapper.MemberCoinChargeDao;
|
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.collections.CollectionUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @author wzy
|
* @date 2020-07-02
|
**/
|
@Slf4j
|
@Service
|
public class BlockCoinServiceImpl implements BlockCoinService {
|
|
@Resource
|
private MemberCoinAddressDao memberCoinAddressDao;
|
@Resource
|
private MallMemberMapper memberDao;
|
@Resource
|
private MemberCoinChargeDao memberCoinChargeDao;
|
@Resource
|
private MallMemberWalletMapper mallMemberWalletMapper;
|
|
private final static String EOS_SEQ_KEY = "eos_seq_key";
|
|
private final static String xrp_update_key = "xrp_update_key";
|
|
private final static String trc20_update_key = "trc20_update_key";
|
|
|
@Override
|
public void updateTrc20(EthUsdtChargeDto dto) {
|
String address = dto.getAddress();
|
BigDecimal amount = dto.getBalance();
|
String hash = dto.getHash();
|
// 判断有无
|
//List<MemberCoinAddressEntity> addressList = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "TRC20");
|
Map<String, Object> hashParam = new HashMap<>();
|
// 校验hash是否已同步过
|
hashParam.put("hash", hash);
|
List<MemberCoinChargeEntity> memberCoinChargeEntities = memberCoinChargeDao.selectByMap(hashParam);
|
if (CollectionUtils.isNotEmpty(memberCoinChargeEntities)) {
|
// 若已同步过
|
return;
|
}
|
// 添加钱包余额
|
// 用户ID
|
MemberCoinAddressEntity memberCoinAddress = memberCoinAddressDao.selectCoinAddressByAddressAndSymbolTag(address, CoinTypeEnum.USDT.name(),"TRC20");
|
if (memberCoinAddress == null) {
|
return;
|
}
|
Long memberId = memberCoinAddress.getMemberId();
|
// 查询钱包 并更新
|
MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
|
mallMemberWalletMapper.updateBlockBalanceById(mallMemberWallet.getId(), amount);
|
// 添加冲币记录
|
String orderNo = insertCoinCharge(address, memberId, amount, CoinTypeEnum.USDT.name(), "TRC20", BigDecimal.ZERO, hash);
|
// TODO 增加充币流水
|
// DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(memberId, amount, "充值", 10);
|
// dappAccountMoneyChangeDao.insert(accountMoneyChange);
|
// LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.USDT.name(), 1, 1);
|
|
// ThreadPoolUtils.sendDingTalk(5);
|
// DappMemberEntity member = memberDao.selectById(memberId);
|
// if (StrUtil.isNotBlank(member.getPhone())) {
|
// //String amountEos = amount + "XRP";
|
// ZzSmsSend.sendRechargeMsg(member.getPhone(), new Date(), amount+"U", orderNo);
|
// } else {
|
// SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
// }
|
|
|
}
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void updateEthUsdtNew(EthUsdtChargeDto ethUsdtChargeDto) {
|
String address = ethUsdtChargeDto.getAddress();
|
String hash = ethUsdtChargeDto.getHash();
|
// 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;
|
}
|
// 校验这个交易是否成功
|
EthService ethService = new EthService();
|
boolean b = ethService.checkTransferResult(hash);
|
if (!b) {
|
log.info("#USDT假充值:{}#", hash);
|
return;
|
}
|
MemberCoinAddressEntity coinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbol(address, CoinTypeEnum.USDT.toString());
|
if (coinAddressEntity == null) {
|
return;
|
}
|
Long memberId = coinAddressEntity.getMemberId();
|
BigDecimal balance = ethUsdtChargeDto.getBalance();
|
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);
|
// 插入财务记录
|
// LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.USDT.name(), 1, 1);
|
// 同步
|
// try {
|
// usdtEthService.pollByAddress(address, balance);
|
// } catch (Exception e) {
|
//
|
// }
|
|
|
}
|
}
|
|
|
private String generateNo() {
|
// 生成订单号
|
Long timestamp = System.currentTimeMillis();
|
// 随机数
|
int random = (int) (Math.random() * 10);
|
return String.valueOf(timestamp).substring(2) + random;
|
}
|
|
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;
|
}
|
|
}
|