新版仿ok交易所-后端
1
zj
2025-07-10 f15406ac788fb4e17a630c4d48129943af89fb9c
trading-order-service/src/main/java/com/yami/trading/service/impl/WalletServiceImpl.java
@@ -1,6 +1,8 @@
package com.yami.trading.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -46,8 +48,12 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Slf4j
@Service
@@ -165,9 +171,13 @@
        Date now = new Date();
        Wallet wallet = findByUserId(userId);
        BigDecimal amountBefore = wallet.getMoney();
        wallet.setMoney(wallet.getMoney().add(money));
        if(wallet.getMoney().compareTo(BigDecimal.ZERO) < 0){
            wallet.setMoney(BigDecimal.ZERO);
        }
        wallet.setUpdateTime(now);
        if (wallet.getMoney().doubleValue() < 0) {
        if (wallet.getMoney().doubleValue() <= 0) {
            throw new YamiShopBindException("余额不足");
        }
        updateById(wallet);
@@ -191,58 +201,102 @@
    /*
     * 获取 所有订单 永续合约总资产、总保证金、总未实现盈利,当日盈利
     */
    @Override
    public Map<String, Double> getMoneyContract(Serializable partyId, String symbolType) {
        double money_contract = 0;
        double money_contract_deposit = 0;
        double money_contract_profit = 0;
        double money_contract_profit_today = 0;
        double money_contract = 0;//总资产
        double money_contract_deposit = 0;//总保证金
        double money_contract_profit = 0;//浮动盈亏
        double money_contract_profit_today = 0;//当日盈亏
        ContractOrderService contractOrderService = ApplicationContextUtils.getBean(ContractOrderService.class);
        List<ContractOrder> contractOrders = contractOrderService.findSubmitted(partyId.toString(), "", "");
        List<ContractOrder> contractOrders = getContractOrders(partyId);
        if (contractOrders != null) {
            for (ContractOrder order : contractOrders) {
                String symbol = order.getSymbol();
                Item bySymbol = itemService.findBySymbol(symbol);
                if (bySymbol == null) {
                    continue;
                }
                // 类型不对直接continue
                if (StringUtils.isNotEmpty(symbolType)) {
                    if (!bySymbol.getType().equalsIgnoreCase(symbolType)) {
                        continue;
                    }
//            for (ContractOrder order : contractOrders) {
//                String symbol = order.getSymbol();
//                Item bySymbol = itemService.findBySymbol(symbol);
//                if (bySymbol == null) {
//                    continue;
//                }
//                // 类型不对直接continue
//                if (StringUtils.isNotEmpty(symbolType)) {
//                    if (!bySymbol.getType().equalsIgnoreCase(symbolType)) {
//                        continue;
//                    }
//
//                }
//                // 真正下单里
//                double order_volume = 1;
//
//                if (order.getLeverRate() != null && order.getLeverRate().compareTo(BigDecimal.ZERO) != 0) {
//                    order_volume = order.getVolumeOpen().divide(order.getLeverRate()).doubleValue();
//                } else {
//                    order_volume = order.getVolumeOpen().doubleValue();
//                }
//
//                double amount = Arith.add(Arith.mul(order_volume, order.getUnitAmount().doubleValue()), order.getProfit().doubleValue());
//                money_contract = Arith.add(amount, money_contract);
//                money_contract_deposit = Arith.add(order.getDeposit().doubleValue(), money_contract_deposit);
//                money_contract_profit = Arith.add(order.getProfit().doubleValue(), money_contract_profit);
//                // 只需要计算当日盈亏比例*金额就是当日盈亏
//
//                List<Realtime> realtimes = dataService.realtime(symbol);
//                if (CollectionUtils.isNotEmpty(realtimes)) {
//                    Realtime realtime = realtimes.get(0);
//                    // 当前每张金额*加杠杆后多少金额
//                    // 今天总体涨跌幅
//                    BigDecimal changeRatio = realtime.getClose().subtract(realtime.getOpen()).divide(realtime.getOpen(), 10, RoundingMode.HALF_UP);
//                    Double todayProfit = order.getUnitAmount().multiply(order.getVolumeOpen()).multiply(changeRatio).setScale(10, RoundingMode.HALF_UP).doubleValue();
//                    money_contract_profit_today += todayProfit;
//                }
//            }
                }
                // 真正下单里
                double order_volume = 1;
                if (order.getLeverRate() != null && order.getLeverRate().compareTo(BigDecimal.ZERO) != 0) {
                    order_volume = order.getVolumeOpen().divide(order.getLeverRate()).doubleValue();
                } else {
                    order_volume = order.getVolumeOpen().doubleValue();
                }
            Map<String, List<ContractOrder>> groupedOrders = contractOrders.stream()
                    .collect(Collectors.groupingBy(ContractOrder::getState));
            //持仓订单
            List<ContractOrder> submittedOrderList = groupedOrders.get(ContractOrder.STATE_SUBMITTED);
                double amount = Arith.add(Arith.mul(order_volume, order.getUnitAmount().doubleValue()), order.getProfit().doubleValue());
                money_contract = Arith.add(amount, money_contract);
                money_contract_deposit = Arith.add(order.getDeposit().doubleValue(), money_contract_deposit);
                money_contract_profit = Arith.add(order.getProfit().doubleValue(), money_contract_profit);
                // 只需要计算当日盈亏比例*金额就是当日盈亏
            //总资产计算
            if(CollectionUtils.isNotEmpty(submittedOrderList)){
                //持仓单盈亏
                BigDecimal totalProfit = submittedOrderList.stream()
                        .map(ContractOrder::getProfit)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                List<Realtime> realtimes = dataService.realtime(symbol);
                if (CollectionUtils.isNotEmpty(realtimes)) {
                    Realtime realtime = realtimes.get(0);
                    // 当前每张金额*加杠杆后多少金额
                    // 今天总体涨跌幅
                    BigDecimal changeRatio = realtime.getClose().subtract(realtime.getOpen()).divide(realtime.getOpen(), 10, RoundingMode.HALF_UP);
                    Double todayProfit = order.getUnitAmount().multiply(order.getVolumeOpen()).multiply(changeRatio).setScale(10, RoundingMode.HALF_UP).doubleValue();
                    money_contract_profit_today += todayProfit;
                }
                //持仓单保证金
                BigDecimal totalDeposit = submittedOrderList.stream()
                        .map(ContractOrder::getDepositOpen)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                money_contract = totalProfit.add(totalDeposit).doubleValue();
            }
            //浮动盈亏
            if(CollectionUtils.isNotEmpty(submittedOrderList)){
                BigDecimal totalProfit = submittedOrderList.stream()
                        .map(ContractOrder::getProfit)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                money_contract_profit = totalProfit.doubleValue();
            }
            //当日盈亏
            LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
            LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX);
            // 获取今天的订单
            BigDecimal totalRevenue = contractOrders.stream()
                    .filter(order -> {
                        LocalDateTime orderDate = toLocalDateTime(order.getCreateTime()); // 转换为 LocalDateTime
                        return !orderDate.isBefore(startOfDay) && !orderDate.isAfter(endOfDay);
                    })
                    .map(ContractOrder::getProfit) // 获取订单的收益
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            money_contract_profit_today = totalRevenue.doubleValue();
        }
        Map<String, Double> moneys_contract = new HashMap<String, Double>();
        moneys_contract.put("money_contract", money_contract);
        moneys_contract.put("money_contract_deposit", money_contract_deposit);
        moneys_contract.put("money_contract_profit", money_contract_profit);
        moneys_contract.put("money_contract_profit_today", money_contract_profit_today);
@@ -251,11 +305,24 @@
        if (!"".equals(partyId) && partyId != null) {
            wallet = findByUserId(partyId.toString());
        }
        moneys_contract.put("money_wallet", wallet.getMoney().doubleValue());
        moneys_contract.put("money_wallet", wallet.getMoney().doubleValue());//可用余额
        moneys_contract.put("money_contract", wallet.getMoney().doubleValue()+money_contract);
        return moneys_contract;
    }
    private static LocalDateTime toLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), java.time.ZoneId.systemDefault());
    }
    private static List<ContractOrder> getContractOrders(Serializable partyId) {
        ContractOrderService contractOrderService = ApplicationContextUtils.getBean(ContractOrderService.class);
        QueryWrapper<ContractOrder> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(StrUtil.isNotBlank(partyId.toString()), "party_id", partyId);
        queryWrapper.orderByDesc("create_time");
        List<ContractOrder> contractOrders = contractOrderService.list(queryWrapper);
        return contractOrders;
    }
//    /**
//     * 获取总资产
//     *