新版仿ok交易所-后端
zj
2025-02-08 75018b2f492444248d8b476d9703bb312d2befc3
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
package com.yami.trading.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yami.trading.bean.contract.domain.ContractOrder;
import com.yami.trading.bean.model.CapitaltWallet;
import com.yami.trading.bean.model.Wallet;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.exception.YamiShopBindException;
import com.yami.trading.common.util.Arith;
import com.yami.trading.dao.CapitaltWalletMapper;
import com.yami.trading.service.CapitaltWalletService;
import com.yami.trading.service.WalletService;
import com.yami.trading.service.contract.ContractOrderService;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.util.List;
 
/**
 * @program: trading-order-master
 * @description: 合约账户
 * @create: 2025-01-08 17:59
 **/
@Service
@Slf4j
public class CapitaltWalletServiceImpl extends ServiceImpl<CapitaltWalletMapper, CapitaltWallet> implements CapitaltWalletService {
 
    @Autowired
    WalletService walletService;
 
    @Autowired
    private ContractOrderService contractOrderService;
 
    @Override
    public CapitaltWallet getUserIdWallet(String userId) {
        return getOne(new LambdaQueryWrapper<>(CapitaltWallet.class)
                .eq(CapitaltWallet::getUserId,userId).last(" limit 1"));
    }
 
    /**
     *capital  资金
     *contract 合约
     * @param userId 用户id
     * @param deductAccount 划转账户
     * @param receiveAccount  接收账户
     * @param moneyRevise   划转金额
     * @return
     */
    @Override
    @Transactional
    public Result updateWallt(String userId, String deductAccount, String receiveAccount, BigDecimal moneyRevise) {
        // 获取合约账户(contract)
        Wallet wallet = walletService.saveWalletByPartyId(userId);
 
        // 获取资金账户(capital)
        CapitaltWallet capitaltWallet = getOne(new LambdaQueryWrapper<>(CapitaltWallet.class)
                .eq(CapitaltWallet::getUserId, userId).last(" limit 1 "));
 
        // 判断划转账户类型
        if (deductAccount.equals("capital") && receiveAccount.equals("contract")) {
            // 从资金账户(capital)到合约账户(contract)的划转
            if (capitaltWallet != null && capitaltWallet.getMoney().compareTo(moneyRevise) >= 0) {
                // 执行从资金账户到合约账户的划转操作
                capitaltWallet.setMoney(capitaltWallet.getMoney().subtract(moneyRevise));  // 减少资金账户余额
                wallet.setMoney(wallet.getMoney().add(moneyRevise));  // 增加合约账户余额
                // 更新账户余额
                walletService.updateById(wallet);  // 保存合约账户的更新
                updateById(capitaltWallet);  // 保存资金账户的更新
                return Result.succeed();
            } else {
                throw new YamiShopBindException("资金账户余额不足");
            }
        } else if (deductAccount.equals("contract") && receiveAccount.equals("capital")) {
 
            LambdaQueryWrapper<ContractOrder> wrapper = new LambdaQueryWrapper<ContractOrder>();
            wrapper.eq(ContractOrder::getPartyId, userId);
            wrapper.eq(ContractOrder::getLocationType, 1);
            wrapper.eq(ContractOrder::getState,"submitted");
            List<ContractOrder> list = contractOrderService.list(wrapper);
            if(CollectionUtil.isNotEmpty(list)){
                throw new YamiShopBindException("当前持有全仓仓位,不支持划转!");
            }
 
            // 从合约账户(contract)到资金账户(capital)的划转
            if (wallet != null && wallet.getMoney().compareTo(moneyRevise) >= 0) {
                // 执行从合约账户到资金账户的划转操作
                wallet.setMoney(wallet.getMoney().subtract(moneyRevise));  // 减少合约账户余额
                capitaltWallet.setMoney(capitaltWallet.getMoney().add(moneyRevise));  // 增加资金账户余额
                // 更新账户余额
                walletService.updateById(wallet);  // 保存合约账户的更新
                updateById(capitaltWallet);  // 保存资金账户的更新
                return Result.succeed();
            } else {
                throw new YamiShopBindException("合约账户余额不足");
            }
        } else {
            // 如果划转账户和接收账户不符合预期,返回错误信息
            throw new YamiShopBindException("不支持的账户划转类型");
        }
    }
 
    @Override
    public void update(CapitaltWallet capitaltWallet, double amount1) {
        capitaltWallet.setMoney(new BigDecimal(Arith.add(capitaltWallet.getMoney().doubleValue(), amount1)));
        if (!updateById(capitaltWallet)) {
            throw new YamiShopBindException("操作钱包失败!");
        }
    }
}