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 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 wrapper = new LambdaQueryWrapper(); wrapper.eq(ContractOrder::getPartyId, userId); wrapper.eq(ContractOrder::getLocationType, 1); wrapper.eq(ContractOrder::getState,"submitted"); List 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("操作钱包失败!"); } } }