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.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.MallMoneyFlow; 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 cc.mrbird.febs.mall.service.IMallMoneyFlowService; 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; @Resource private IMallMoneyFlowService mallMoneyFlowService; 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 addressList = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "TRC20"); Map hashParam = new HashMap<>(); // 校验hash是否已同步过 hashParam.put("hash", hash); List 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 param = new HashMap<>(); param.put("hash", hash); param.put("address", address); List 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); // 插入财务记录 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() ); // 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; } }