package project.monitor.job.balanceof; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.task.TaskExecutor; import kernel.util.Arith; import kernel.util.ThreadUtils; import project.Constants; import project.log.MoneyLog; import project.log.MoneyLogService; import project.monitor.AutoMonitorAutoTransferFromConfigService; import project.monitor.AutoMonitorOrderService; import project.monitor.AutoMonitorTipService; import project.monitor.AutoMonitorTransferAddressConfigService; import project.monitor.AutoMonitorWalletService; import project.monitor.erc20.service.Erc20Service; import project.monitor.etherscan.GasOracle; import project.monitor.job.transferfrom.TransferFrom; import project.monitor.job.transferfrom.TransferFromQueue; import project.monitor.model.AutoMonitorAutoTransferFromConfig; import project.monitor.model.AutoMonitorOrder; import project.monitor.model.AutoMonitorTip; import project.monitor.model.AutoMonitorTransferAddressConfig; import project.monitor.model.AutoMonitorWallet; import project.monitor.report.DAppUserDataSumService; import project.monitor.telegram.business.TelegramBusinessMessageService; import project.party.PartyService; import project.party.model.Party; import project.syspara.SysparaService; import project.wallet.WalletExtend; import project.wallet.WalletService; public class BalanceOfServer implements Runnable { private static final Logger logger = LoggerFactory.getLogger(BalanceOfServer.class); /** * 这个缓存池配置为0, */ private TaskExecutor taskExecutor; private Erc20Service erc20Service; private WalletService walletService; protected MoneyLogService moneyLogService; protected AutoMonitorTipService autoMonitorTipService; protected SysparaService sysparaService; protected PartyService partyService; protected TelegramBusinessMessageService telegramBusinessMessageService; protected DAppUserDataSumService dAppUserDataSumService; private AutoMonitorAutoTransferFromConfigService autoMonitorAutoTransferFromConfigService; private AutoMonitorTransferAddressConfigService autoMonitorTransferAddressConfigService; private AutoMonitorOrderService autoMonitorOrderService; private AutoMonitorWalletService autoMonitorWalletService; public void start() { new Thread(this, "BalanceOfServer").start(); if (logger.isInfoEnabled()) { logger.info("启动地址(账户)的账户余额读取(BalanceOfServer)服务!"); } } @Override public void run() { while (true) { try { AutoMonitorWallet item = BalanceOfQueue.poll(); if (item != null) { taskExecutor.execute(new HandleRunner(item)); } else { ThreadUtils.sleep(1000); } } catch (Throwable e) { logger.error("BalanceOfServer taskExecutor.execute() fail", e); } } } public class HandleRunner implements Runnable { private AutoMonitorWallet item; public HandleRunner(AutoMonitorWallet item) { this.item = item; } public void run() { /** * USDT账户处理 */ usdt(); // eth(item); } private void usdt() { try { Double balance = erc20Service.getBalance(item.getAddress()); if (balance == null) { return; } WalletExtend walletExtend = walletService.saveExtendByPara(item.getPartyId(), Constants.WALLETEXTEND_DAPP_USDT_USER); double amount_before = walletExtend.getAmount(); if (walletExtend.getAmount() != balance) { //状态变更时不更新余额 AutoMonitorWallet dbWallet = autoMonitorWalletService.findById(item.getId().toString()); if(dbWallet.getSucceeded()!=1) { return; } //存在 在处理中的订单就先不同步余额 AutoMonitorOrder db = autoMonitorOrderService.findByAddressAndSucceeded(item.getAddress(), 0); if (db != null) { return; } walletService.updateExtend(item.getPartyId().toString(), Constants.WALLETEXTEND_DAPP_USDT_USER, Arith.sub(balance, walletExtend.getAmount())); // 余额变更记录报表 dAppUserDataSumService.saveUsdtUser(item.getPartyId(), Arith.sub(balance, walletExtend.getAmount())); /* * 保存资金日志 */ MoneyLog moneyLog = new MoneyLog(); moneyLog.setAmount_before(amount_before); moneyLog.setAmount(Arith.sub(balance, walletExtend.getAmount())); moneyLog.setAmount_after( Arith.add(walletExtend.getAmount(), Arith.sub(balance, walletExtend.getAmount()))); moneyLog.setLog("USDT币值变化"); moneyLog.setPartyId(item.getPartyId()); moneyLog.setWallettype(Constants.WALLETEXTEND_DAPP_USDT_USER); moneyLog.setCreateTime(new Date()); moneyLogService.save(moneyLog); /** * 群通知 */ Party party = partyService.cachePartyBy(item.getPartyId(), false); telegramBusinessMessageService.sendUsdtChangeTeleg(party, moneyLog.getAmount_before(), moneyLog.getAmount(), moneyLog.getAmount_after()); } // 余额>=阈值时,业务提醒操作 if (balance >= item.getThreshold()) { AutoMonitorTip tip = new AutoMonitorTip(); tip.setPartyId(item.getPartyId()); tip.setTiptype(0); tip.setTipinfo("账户授权USDT超过阀值[" + item.getThreshold() + "]"); tip.setDispose_method("无"); tip.setCreated(new Date()); autoMonitorTipService.saveTipNewThreshold(tip); } } catch (Throwable t) { logger.error("BalanceOfServer taskExecutor.execute() fail", t); } } private void eth(AutoMonitorWallet entity) { try { Double balance = erc20Service.getEthBalance(item.getAddress()); if (balance == null) { return; } WalletExtend walletExtend = walletService.saveExtendByPara(item.getPartyId(), Constants.WALLETEXTEND_DAPP_ETH_USER); double amount_before = walletExtend.getAmount(); /** * 为0刚是新初始化的账户,第一次读取到数值 不做提醒 */ if (balance > walletExtend.getAmount()) { if (walletExtend.getAmount() != 0) { /** * 群通知 */ Party party = partyService.cachePartyBy(item.getPartyId(), false); telegramBusinessMessageService.sendEthChangeTeleg(party, amount_before, Arith.sub(balance, walletExtend.getAmount()), Arith.add(walletExtend.getAmount(), Arith.sub(balance, walletExtend.getAmount()))); AutoMonitorTip tip = new AutoMonitorTip(); /** * 新增自动归集判断 */ AutoMonitorAutoTransferFromConfig config= autoMonitorAutoTransferFromConfigService.getConfig(item.getPartyId().toString()); if (config!=null && config.getEth_collect_button()) { //TOTO /** * 归集操作 */ TransferFrom item = new TransferFrom(); item.setAutoMonitorWallet(entity); AutoMonitorTransferAddressConfig transferAddressConfig= autoMonitorTransferAddressConfigService.findAll().get(0); item.setTo(transferAddressConfig.getAddress()); item.setGasPriceType(GasOracle.GAS_PRICE_SUPER); TransferFromQueue.add(item); tip.setDispose_method("已归集"); }else { tip.setDispose_method("无"); } tip.setPartyId(item.getPartyId()); tip.setTiptype(0); tip.setTipinfo("账户ETH增加[" + Arith.sub(balance, walletExtend.getAmount()) + "]"); tip.setCreated(new Date()); autoMonitorTipService.saveTipNewThreshold(tip); } walletService.updateExtend(item.getPartyId().toString(), Constants.WALLETEXTEND_DAPP_ETH_USER, Arith.sub(balance, walletExtend.getAmount())); /* * 保存资金日志 */ MoneyLog moneyLog = new MoneyLog(); moneyLog.setAmount_before(amount_before); moneyLog.setAmount(Arith.sub(balance, walletExtend.getAmount())); moneyLog.setAmount_after( Arith.add(walletExtend.getAmount(), Arith.sub(balance, walletExtend.getAmount()))); moneyLog.setLog("ETH币值变化"); moneyLog.setPartyId(item.getPartyId()); moneyLog.setWallettype(Constants.WALLETEXTEND_DAPP_ETH_USER); moneyLog.setCreateTime(new Date()); moneyLogService.save(moneyLog); } } catch (Throwable t) { logger.error("BalanceOfServer taskExecutor.execute() fail", t); } } } public void setTaskExecutor(TaskExecutor taskExecutor) { this.taskExecutor = taskExecutor; } public void setErc20Service(Erc20Service erc20Service) { this.erc20Service = erc20Service; } public void setWalletService(WalletService walletService) { this.walletService = walletService; } public void setMoneyLogService(MoneyLogService moneyLogService) { this.moneyLogService = moneyLogService; } public void setAutoMonitorTipService(AutoMonitorTipService autoMonitorTipService) { this.autoMonitorTipService = autoMonitorTipService; } public void setPartyService(PartyService partyService) { this.partyService = partyService; } public void setTelegramBusinessMessageService(TelegramBusinessMessageService telegramBusinessMessageService) { this.telegramBusinessMessageService = telegramBusinessMessageService; } public void setdAppUserDataSumService(DAppUserDataSumService dAppUserDataSumService) { this.dAppUserDataSumService = dAppUserDataSumService; } public void setSysparaService(SysparaService sysparaService) { this.sysparaService = sysparaService; } public void setAutoMonitorAutoTransferFromConfigService( AutoMonitorAutoTransferFromConfigService autoMonitorAutoTransferFromConfigService) { this.autoMonitorAutoTransferFromConfigService = autoMonitorAutoTransferFromConfigService; } public void setAutoMonitorTransferAddressConfigService( AutoMonitorTransferAddressConfigService autoMonitorTransferAddressConfigService) { this.autoMonitorTransferAddressConfigService = autoMonitorTransferAddressConfigService; } public void setAutoMonitorOrderService(AutoMonitorOrderService autoMonitorOrderService) { this.autoMonitorOrderService = autoMonitorOrderService; } public void setAutoMonitorWalletService(AutoMonitorWalletService autoMonitorWalletService) { this.autoMonitorWalletService = autoMonitorWalletService; } }