xiaoyong931011
2022-12-28 9ba6a1c6cd6bf4d04591a9214abdb5c8c6cbff78
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
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;
    }
 
}