新版仿ok交易所-后端
1
zj
6 hours ago be8c9767089b5e52ed462ea1d083d846e7420a45
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
package com.yami.trading.admin.controller;
 
import com.yami.trading.admin.model.UpdateAddressModel;
import com.yami.trading.admin.model.UpdateUserAddressModel;
import com.yami.trading.bean.model.ChannelBlockchain;
import com.yami.trading.bean.model.User;
import com.yami.trading.common.constants.RedisKeys;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.exception.YamiShopBindException;
import com.yami.trading.security.common.enums.CryptoCurrencyEnum;
import com.yami.trading.service.ChannelBlockchainService;
import com.yami.trading.service.exchange.PartyBlockchainService;
import com.yami.trading.service.user.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * 管理后台 - 财务 - 充值地址(ChannelBlockchain 表)
 */
@Slf4j
@RestController
@RequestMapping("address")
@Api(tags = "充值地址")
public class AddressController {
 
    @Autowired
    RedisTemplate redisTemplate;
 
    @Autowired
    private ChannelBlockchainService channelBlockchainService;
 
    @Autowired
    private PartyBlockchainService partyBlockchainService;
 
    @Autowired
    private UserService userService;
 
    @ApiOperation("充值地址列表")
    @PostMapping("/list")
    public Result<List<ChannelBlockchain>> list() {
        List<ChannelBlockchain> list = channelBlockchainService.list();
        list.forEach(this::fillBlockchainNameAlias);
        return Result.succeed(list);
    }
 
    @ApiOperation("修改充值地址")
    @PostMapping("/update")
    public Result<ChannelBlockchain> update(@RequestBody UpdateAddressModel model) {
        if (StringUtils.isNotBlank(model.getUuid())) {
            ChannelBlockchain existing = channelBlockchainService.getById(model.getUuid());
            if (existing == null) {
                throw new YamiShopBindException("充值地址记录不存在");
            }
            if (StringUtils.isBlank(model.getAddress())) {
                throw new YamiShopBindException("充值地址不能为空");
            }
            existing.setAddress(model.getAddress().trim());
            if (StringUtils.isNotBlank(model.getCoin())) {
                existing.setCoin(model.getCoin().trim().toLowerCase());
            }
            if (StringUtils.isNotBlank(model.getChain())) {
                existing.setBlockchainName(model.getChain().trim());
            }
            channelBlockchainService.updateById(existing);
            fillBlockchainNameAlias(existing);
            return Result.succeed(existing);
        }
        ChannelBlockchain saved = channelBlockchainService.saveOrUpdateByCoinAndChain(
                model.getCoin(), model.getChain(), model.getAddress());
        fillBlockchainNameAlias(saved);
        return Result.succeed(saved);
    }
 
    /**
     * u盾地址列表(按用户维度,仍走 Redis)
     */
    @GetMapping("/getUDList")
    public Result<List<ChannelBlockchain>> getUDList(String partyId) {
        if (partyId == null || partyId.isEmpty()) {
            return Result.failed("请选择用户");
        }
        List<CryptoCurrencyEnum> currencyEnums = CryptoCurrencyEnum.getAll();
        List<ChannelBlockchain> data = new ArrayList<>();
        currencyEnums.forEach(currencyEnum -> {
            try {
                String address = (String) redisTemplate.opsForValue()
                        .get(RedisKeys.BLOCKCHAIN_ADDRESS + partyId + currencyEnum.getName());
                ChannelBlockchain blockchain = new ChannelBlockchain();
                blockchain.setBlockchain_name(currencyEnum.getChain());
                blockchain.setBlockchainName(currencyEnum.getChain());
                blockchain.setAddress(address);
                blockchain.setCoin(currencyEnum.getCoin());
                blockchain.setAuto(false);
                blockchain.setImg(null);
                data.add(blockchain);
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        });
        return Result.succeed(data);
    }
 
    @GetMapping("/updateUserAddress")
    public Result<?> updateUserAddress(UpdateUserAddressModel model) {
        if (StringUtils.isBlank(model.getUserCode())) {
            throw new YamiShopBindException("用户编码不能为空");
        }
        User user = userService.findUserByUserCode(model.getUserCode());
        if (user == null) {
            throw new YamiShopBindException("用户不存在");
        }
        String userName = user.getUserName();
        String partyId = user.getUserId();
        saveUserAddress(userName, partyId, "usdt", "TRC20", model.getUsdtTrc20());
        saveUserAddress(userName, partyId, "usdt", "ERC20", model.getUsdtErc20());
        saveUserAddress(userName, partyId, "btc", "BTC", model.getBtc());
        saveUserAddress(userName, partyId, "eth", "ETH", model.getEth());
        saveUserAddress(userName, partyId, "usdc", "ERC20", model.getUsdcErc20());
        saveUserAddress(userName, partyId, "usdc", "TRC20", model.getUsdcTrc20());
        return Result.succeed(null);
    }
 
    private void saveUserAddress(String userName, String partyId, String coin, String chain, String address) {
        if (StringUtils.isBlank(address)) {
            return;
        }
        ChannelBlockchain template = findTemplate(coin, chain);
        String chainName = template != null ? template.getBlockchainName() : chain.toLowerCase();
        String qrImage = template != null ? template.getImg() : null;
        partyBlockchainService.saveOrUpdateAddress(userName, coin, chainName, address.trim(), qrImage);
        CryptoCurrencyEnum currencyEnum = findCurrencyEnum(coin, chain);
        if (currencyEnum != null) {
            redisTemplate.opsForValue().set(RedisKeys.BLOCKCHAIN_ADDRESS + partyId + currencyEnum.getName(), address.trim());
        }
    }
 
    private CryptoCurrencyEnum findCurrencyEnum(String coin, String chain) {
        for (CryptoCurrencyEnum currencyEnum : CryptoCurrencyEnum.getAll()) {
            if (currencyEnum.getCoin().equalsIgnoreCase(coin) && currencyEnum.getChain().equalsIgnoreCase(chain)) {
                return currencyEnum;
            }
        }
        return null;
    }
 
    private ChannelBlockchain findTemplate(String coin, String chain) {
        List<ChannelBlockchain> list = channelBlockchainService.findByCoin(coin.toLowerCase());
        return list.stream()
                .filter(item -> chain.equalsIgnoreCase(item.getBlockchainName()))
                .findFirst()
                .orElse(null);
    }
 
    private void fillBlockchainNameAlias(ChannelBlockchain item) {
        if (item != null && StringUtils.isNotBlank(item.getBlockchainName())) {
            item.setBlockchain_name(item.getBlockchainName());
        }
    }
}