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("操作钱包失败!");
|
}
|
}
|
}
|