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.service.BtcService;
|
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.ThreadPoolUtils;
|
import com.xcong.excoin.utils.dingtalk.DingTalkUtils;
|
import com.xcong.excoin.utils.mail.SmsSend;
|
import lombok.extern.slf4j.Slf4j;
|
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;
|
|
@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";
|
SmsSend.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), amount, 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";
|
SmsSend.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), amount, 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";
|
SmsSend.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), amount, 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";
|
SmsSend.sendRechargeMsg(member.getPhone(), DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MINUTE_PATTERN), amount, orderNo);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
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;
|
}
|
}
|