xiaoyong931011
2021-01-15 292a4634d9c52ce193eca9de356d65960bdc35f4
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
package com.xcong.excoin.modules.coin.controller;
 
import cn.hutool.core.collection.CollUtil;
import cn.hutool.crypto.SecureUtil;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.coin.dao.MemberAccountMoneyChangeDao;
import com.xcong.excoin.modules.coin.dao.TrcAddressDao;
import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange;
import com.xcong.excoin.modules.coin.entity.TrcAddressEntity;
import com.xcong.excoin.modules.coin.parameter.dto.TrcRechargeDto;
import com.xcong.excoin.modules.coin.parameter.dto.TrcWithdrawDto;
import com.xcong.excoin.modules.member.dao.MemberCoinChargeDao;
import com.xcong.excoin.modules.member.dao.MemberCoinWithdrawDao;
import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
import com.xcong.excoin.modules.member.entity.MemberCoinWithdrawEntity;
import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
import com.xcong.excoin.utils.TRC20ApiUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @author wzy
 * @date 2020-11-10
 **/
@Slf4j
@RestController
@RequestMapping(value = "/trc")
public class Trc20Controller {
 
    @Resource
    private MemberWalletCoinDao memberWalletCoinDao;
    @Resource
    private MemberAccountMoneyChangeDao memberAccountMoneyChangeDao;
    @Resource
    private MemberCoinChargeDao memberCoinChargeDao;
    @Resource
    private TrcAddressDao trcAddressDao;
    @Resource
    private MemberCoinWithdrawDao memberCoinWithdrawDao;
 
    @PostMapping(value = "/rechargeTrcAmount")
    @Transactional(rollbackFor = Exception.class)
    public Result rechargeTrcAmount(@RequestBody TrcRechargeDto trcRechargeDto) {
        log.info("传入参数 : {}", trcRechargeDto);
        String sign = SecureUtil.md5(trcRechargeDto.getUid() + trcRechargeDto.getNum().toPlainString() + CoinTypeEnum.USDT.name() + trcRechargeDto.getType() + TRC20ApiUtils.SIGN_STR);
        if (!sign.equals(trcRechargeDto.getKey())) {
            return Result.fail("参数错误");
        }
        Long memberId = Long.parseLong(trcRechargeDto.getUid());
 
        MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
        memberWalletCoinDao.updateWalletBalance(wallet.getId(), trcRechargeDto.getNum(), null, null);
 
        TrcAddressEntity trcAddress = trcAddressDao.selectSrcAddressByMemberId(memberId);
        if (trcAddress == null) {
            return Result.fail("充值失败, 该用户无充值地址");
        }
        MemberCoinChargeEntity charge = new MemberCoinChargeEntity();
        charge.setAddress(trcAddress.getAddress());
        charge.setAmount(trcRechargeDto.getNum());
        charge.setMemberId(memberId);
        charge.setSymbol(CoinTypeEnum.USDT.name());
        charge.setStatus(1);
        charge.setTag("TRC20");
        charge.setLastAmount(trcRechargeDto.getNum());
        String orderNo = generateNo();
        charge.setOrderCode(orderNo);
        memberCoinChargeDao.insert(charge);
 
        MemberAccountMoneyChange change = new MemberAccountMoneyChange();
        change.setAmount(trcRechargeDto.getNum());
        change.setContent("转入");
        change.setSymbol(CoinTypeEnum.USDT.name());
        change.setStatus(1);
        change.setType(1);
        change.setMemberId(memberId);
 
        memberAccountMoneyChangeDao.insert(change);
        return Result.ok("充值成功");
    }
 
    @PostMapping(value = "/withdrawTrcAmount")
    public Result withdrawTrcAmount(@RequestBody TrcWithdrawDto trcWithdrawDto) {
        log.info("提币审核接口参数:{}", trcWithdrawDto);
        if (!CoinTypeEnum.USDT.name().equals(trcWithdrawDto.getSymbol())) {
            return Result.fail("币种错误");
        }
 
        if (!TrcWithdrawDto.STATUS_SUCCESS.equals(trcWithdrawDto.getStatus()) && !TrcWithdrawDto.STATUS_FAIL.equals(trcWithdrawDto.getStatus())) {
            return Result.fail("状态错误");
        }
 
        String sign = SecureUtil.md5(trcWithdrawDto.getMemberId() + trcWithdrawDto.getOrderNo() + trcWithdrawDto.getStatus() + trcWithdrawDto.getSymbol() + TRC20ApiUtils.SIGN_STR);
        if (!sign.equals(trcWithdrawDto.getKey())) {
            return Result.fail("参数错误");
        }
 
        Map<String, Object> columnMaps = new HashMap<>();
        columnMaps.put("tag", trcWithdrawDto.getOrderNo());
        columnMaps.put("member_id", trcWithdrawDto.getMemberId());
        columnMaps.put("status", 1);
        List<MemberCoinWithdrawEntity> withdrawEntities = memberCoinWithdrawDao.selectByMap(columnMaps);
        if (CollUtil.isEmpty(withdrawEntities)) {
            return Result.fail("该订单不存在");
        }
 
        MemberCoinWithdrawEntity withdrawEntity = withdrawEntities.get(0);
 
        MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(withdrawEntity.getMemberId(), CoinTypeEnum.USDT.name());
        Map<String, Object> changeParam = new HashMap<>();
        changeParam.put("withdraw_id", withdrawEntity.getId());
        MemberAccountMoneyChange accountMoneyChanges = memberAccountMoneyChangeDao.selectByMap(changeParam).get(0);
 
        // 审核成功
        if (TrcWithdrawDto.STATUS_SUCCESS.equals(trcWithdrawDto.getStatus())) {
            memberWalletCoinDao.updateWalletBalance(wallet.getId(), null, null, withdrawEntity.getAmount().negate());
 
            accountMoneyChanges.setStatus(MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER);
            accountMoneyChanges.setAmount(withdrawEntity.getAmount().negate());
            memberAccountMoneyChangeDao.updateById(accountMoneyChanges);
 
            withdrawEntity.setStatus(MemberCoinWithdrawEntity.IS_STATUS_Y);
            memberCoinWithdrawDao.updateById(withdrawEntity);
 
            return Result.ok("提币成功");
        }
 
        if (TrcWithdrawDto.STATUS_FAIL.equals(trcWithdrawDto.getStatus())) {
            memberWalletCoinDao.updateWalletBalance(wallet.getId(), withdrawEntity.getAmount(), null, withdrawEntity.getAmount().negate());
 
            accountMoneyChanges.setStatus(MemberAccountMoneyChange.STATUS_FAIL_INTEGER);
            accountMoneyChanges.setAmount(withdrawEntity.getAmount());
            memberAccountMoneyChangeDao.updateById(accountMoneyChanges);
 
            withdrawEntity.setStatus(MemberCoinWithdrawEntity.IS_STATUS_N);
            memberCoinWithdrawDao.updateById(withdrawEntity);
 
            return Result.ok("提币申请驳回成功");
        }
 
        return Result.fail("提币失败");
    }
 
    private String generateNo() {
        // 生成订单号
        Long timestamp = System.currentTimeMillis();
        // 随机数
        int random = (int) (Math.random() * 10);
        return String.valueOf(timestamp).substring(2) + random;
    }
}