package com.xcong.excoin.modules.coin.service.impl;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
|
import com.xcong.excoin.modules.blackchain.model.EosResult;
|
import com.xcong.excoin.modules.blackchain.service.BtcService;
|
import com.xcong.excoin.modules.blackchain.service.EosService;
|
import com.xcong.excoin.modules.blackchain.service.EthService;
|
import com.xcong.excoin.modules.blackchain.service.UsdtService;
|
import com.xcong.excoin.modules.coin.service.BlockCoinService;
|
import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao;
|
import com.xcong.excoin.modules.member.dao.MemberCoinChargeDao;
|
import com.xcong.excoin.modules.member.dao.MemberDao;
|
import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
|
import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
|
import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
|
import com.xcong.excoin.modules.member.entity.MemberEntity;
|
import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
|
import com.xcong.excoin.utils.LogRecordUtils;
|
import com.xcong.excoin.utils.RedisUtils;
|
import com.xcong.excoin.utils.ThreadPoolUtils;
|
import com.xcong.excoin.utils.dingtalk.DingTalkUtils;
|
import com.xcong.excoin.utils.mail.Sms106Send;
|
import com.xcong.excoin.utils.mail.SubMailSend;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.lang3.StringUtils;
|
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.List;
|
|
/**
|
* @author wzy
|
* @date 2020-07-02
|
**/
|
@Slf4j
|
@Service
|
public class BlockCoinServiceImpl implements BlockCoinService {
|
|
@Resource
|
private MemberCoinAddressDao memberCoinAddressDao;
|
@Resource
|
private MemberDao memberDao;
|
@Resource
|
private MemberCoinChargeDao memberCoinChargeDao;
|
@Resource
|
private MemberWalletCoinDao memberWalletCoinDao;
|
|
@Resource
|
private RedisUtils redisUtils;
|
|
private final static String EOS_SEQ_KEY="eos_seq_key";
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void updateEthUsdt() {
|
List<MemberCoinAddressEntity> list = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20");
|
if (CollUtil.isNotEmpty(list)) {
|
EthService ethService = new EthService();
|
for (MemberCoinAddressEntity addressEntity : list) {
|
String address = addressEntity.getAddress();
|
Long memberId = addressEntity.getMemberId();
|
|
if (StrUtil.isBlank(address)) {
|
continue;
|
}
|
|
BigDecimal balance = ethService.tokenGetBalance(address);
|
if (balance != null && balance.compareTo(new BigDecimal("0.1")) > 0) {
|
balance = balance.setScale(8, RoundingMode.CEILING);
|
|
BigDecimal early = BigDecimal.ZERO;
|
MemberCoinChargeEntity chargeEntity = memberCoinChargeDao.selectNewestChargeRecord(memberId, CoinTypeEnum.USDT.name(), "ERC20");
|
if (chargeEntity != null) {
|
BigDecimal lastAmount = chargeEntity.getLastAmount();
|
if (lastAmount != null) {
|
early = lastAmount;
|
}
|
}
|
|
MemberWalletCoinEntity walletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
|
if (walletCoinEntity == null) {
|
continue;
|
}
|
|
if (balance.compareTo(early) > 0) {
|
BigDecimal newBalance = balance.subtract(early);
|
memberWalletCoinDao.updateBlockBalance(walletCoinEntity.getId(), newBalance, balance, 0);
|
|
String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance);
|
// 插入财务记录
|
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.USDT.name(), 1, 1);
|
|
ThreadPoolUtils.sendDingTalk(5);
|
MemberEntity member = memberDao.selectById(memberId);
|
if (StrUtil.isNotBlank(member.getPhone())) {
|
String amount = newBalance.toPlainString() + "USDT-ERC20";
|
Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
} else {
|
SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void updateEth() {
|
List<MemberCoinAddressEntity> list = memberCoinAddressDao.selectAllBlockAddressBySymbol(CoinTypeEnum.ETH.name());
|
if (CollUtil.isNotEmpty(list)) {
|
for (MemberCoinAddressEntity coinAddressEntity : list) {
|
String address = coinAddressEntity.getAddress();
|
Long memberId = coinAddressEntity.getMemberId();
|
|
BigDecimal balance = EthService.getEthBlance(address);
|
if (balance != null && new BigDecimal("0.008").compareTo(balance) < 0) {
|
MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.ETH.name());
|
|
if (walletCoin == null) {
|
continue;
|
}
|
|
BigDecimal early = BigDecimal.ZERO;
|
MemberCoinChargeEntity coinChargeEntity = memberCoinChargeDao.selectNewestChargeRecord(memberId, CoinTypeEnum.ETH.name(), null);
|
if (coinChargeEntity != null) {
|
BigDecimal lastAmount = coinChargeEntity.getLastAmount();
|
if (lastAmount != null) {
|
early = lastAmount;
|
}
|
}
|
|
balance = balance.setScale(8, RoundingMode.CEILING);
|
if (balance.compareTo(early) > 0) {
|
log.info("#ETH更新:{},{},{}#", memberId, balance, early);
|
|
BigDecimal newBalance = balance.subtract(early);
|
memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0);
|
String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.ETH.name(), null, balance);
|
|
// 插入财务记录
|
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.ETH.name(), 1, 1);
|
|
ThreadPoolUtils.sendDingTalk(5);
|
MemberEntity member = memberDao.selectById(memberId);
|
if (StrUtil.isNotBlank(member.getPhone())) {
|
String amount = newBalance.toPlainString() + "ETH";
|
Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
} else {
|
SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void updateBtcUsdt() {
|
List<MemberCoinAddressEntity> list = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "OMNI");
|
if (CollUtil.isNotEmpty(list)) {
|
UsdtService usdtService = UsdtService.getInstance();
|
|
for (MemberCoinAddressEntity coinAddressEntity : list) {
|
String address = coinAddressEntity.getAddress();
|
Long memberId = coinAddressEntity.getMemberId();
|
|
BigDecimal balance = usdtService.getBalance(address);
|
if (balance != null && balance.compareTo(new BigDecimal("0.1")) > 0) {
|
MemberCoinChargeEntity memberCoinChargeEntity = memberCoinChargeDao.selectNewestChargeRecord(memberId, CoinTypeEnum.USDT.name(), "OMNI");
|
BigDecimal early = BigDecimal.ZERO;
|
if (memberCoinChargeEntity != null) {
|
BigDecimal lastAmount = memberCoinChargeEntity.getLastAmount();
|
if (lastAmount != null) {
|
early = lastAmount;
|
}
|
}
|
|
MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
|
if (walletCoin == null) {
|
continue;
|
}
|
|
if (balance.compareTo(early) > 0) {
|
BigDecimal newBalance = balance.subtract(early);
|
|
memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0);
|
String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "OMNI", balance);
|
|
ThreadPoolUtils.sendDingTalk(5);
|
MemberEntity member = memberDao.selectById(memberId);
|
if (StrUtil.isNotBlank(member.getPhone())) {
|
String amount = newBalance.toPlainString() + "USDT-OMNI";
|
Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
} else {
|
SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void updateBtc() {
|
List<MemberCoinAddressEntity> list = memberCoinAddressDao.selectAllBlockAddressBySymbol(CoinTypeEnum.BTC.name());
|
if (CollUtil.isNotEmpty(list)) {
|
BtcService btcService = BtcService.getInstance();
|
for (MemberCoinAddressEntity coinAddressEntity : list) {
|
String address = coinAddressEntity.getAddress();
|
Long memberId = coinAddressEntity.getMemberId();
|
|
BigDecimal balance = btcService.getBalance(address);
|
|
if (balance != null && balance.compareTo(new BigDecimal("0.00012")) > 0) {
|
MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.BTC.name());
|
if (walletCoin == null) {
|
continue;
|
}
|
|
BigDecimal early = BigDecimal.ZERO;
|
MemberCoinChargeEntity coinCharge = memberCoinChargeDao.selectNewestChargeRecord(memberId, CoinTypeEnum.BTC.name(), null);
|
if (coinCharge != null) {
|
BigDecimal lastAmount = coinCharge.getLastAmount();
|
if (lastAmount != null) {
|
early = lastAmount;
|
}
|
}
|
|
if (balance.compareTo(early) > 0) {
|
log.info("#btc同步:{}, {}, {}#", memberId, balance, early);
|
BigDecimal newBalance = balance.subtract(early);
|
memberWalletCoinDao.updateBlockBalance(walletCoin.getId(), newBalance, balance, 0);
|
|
String orderNo = insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.BTC.name(), null, balance);
|
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.BTC.name(), 1, 1);
|
|
ThreadPoolUtils.sendDingTalk(5);
|
MemberEntity member = memberDao.selectById(memberId);
|
if (StrUtil.isNotBlank(member.getPhone())) {
|
String amount = newBalance.toPlainString() + "BTC";
|
Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
} else {
|
SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
@Override
|
public void updateEos() {
|
// 获取上次读取的序号
|
int pos= 0;
|
//每次获取的条数
|
int offset = 10;
|
|
String eosSeq = redisUtils.getString(EOS_SEQ_KEY);
|
if(StringUtils.isNotBlank(eosSeq)){
|
pos = Integer.valueOf(eosSeq);
|
}
|
// 记录最大的seq
|
int seq = pos;
|
List<EosResult> actions = EosService.getActions(pos, offset);
|
if(CollectionUtils.isNotEmpty(actions)){
|
for(EosResult eosResult:actions){
|
String to = eosResult.getTo();
|
Integer accountActionSeq = eosResult.getAccountActionSeq();
|
if(accountActionSeq>seq){
|
seq = accountActionSeq;
|
}
|
if(!EosService.ACCOUNT.equals(to)){
|
// 判断是否是收款
|
continue;
|
}
|
// 处理收款
|
String quantity = eosResult.getQuantity();
|
String memo = eosResult.getMemo();
|
if(StringUtils.isBlank(memo)){
|
// 没有标记的跳过
|
continue;
|
}
|
if(StringUtils.isNotBlank(quantity)){
|
// 转账额
|
String amountStr = quantity.split("")[0];
|
BigDecimal amount = new BigDecimal(amountStr);
|
List<MemberCoinAddressEntity> memberCoinAddress = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.EOS.name(), memo);
|
if(CollectionUtils.isNotEmpty(memberCoinAddress)){
|
MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddress.get(0);
|
// 用户ID
|
Long memberId = memberCoinAddressEntity.getMemberId();
|
MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.EOS.name());
|
if(memberCoinAddressEntity!=null){
|
memberWalletCoinDao.updateBlockBalance(memberWalletCoinEntity.getId(),amount,BigDecimal.ZERO,0);
|
// 添加冲币记录
|
String orderNo = insertCoinCharge(EosService.ACCOUNT,memberId,amount,CoinTypeEnum.EOS.name(),memo,BigDecimal.ZERO);
|
LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", amount, CoinTypeEnum.EOS.name(), 1, 1);
|
|
ThreadPoolUtils.sendDingTalk(5);
|
MemberEntity member = memberDao.selectById(memberId);
|
if (StrUtil.isNotBlank(member.getPhone())) {
|
//String amountEos = amountStr + "EOS";
|
Sms106Send.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
} else {
|
SubMailSend.sendRechargeMail(member.getEmail(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), orderNo);
|
}
|
}
|
}
|
}
|
}
|
}
|
// 最后更新seq 即下次查询的起始位置 在本次最大的基础上加一
|
if(seq>0 && seq>pos){
|
redisUtils.set(EOS_SEQ_KEY,seq+1);
|
}
|
}
|
|
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) {
|
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);
|
String orderNo = generateNo();
|
memberCoinChargeEntity.setOrderCode(orderNo);
|
memberCoinChargeDao.insert(memberCoinChargeEntity);
|
return orderNo;
|
}
|
}
|