新版仿ok交易所-后端
zj
2025-02-08 75018b2f492444248d8b476d9703bb312d2befc3
trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java
@@ -38,6 +38,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -145,10 +146,16 @@
            if(realtime.size()>=1){
                map.put("mark_price",  realtime.get(0).getClose());
            }
            map.put("amount", order.getVolume().multiply(order.getUnitAmount()));
            map.put("amount_open", order.getVolumeOpen().multiply(order.getUnitAmount()));
            map.put("fee", order.getFee());
            map.put("deposit", order.getDeposit());
            map.put("amount", (order.getVolume() != null && order.getUnitAmount() != null)
                    ? order.getVolume().multiply(order.getUnitAmount())
                    : BigDecimal.ZERO);
            map.put("amount_open", (order.getVolumeOpen() != null && order.getUnitAmount() != null)
                    ? order.getVolumeOpen().multiply(order.getUnitAmount())
                    : BigDecimal.ZERO);
            map.put("fee", order.getFee() != null ? order.getFee() : BigDecimal.ZERO);
            map.put("deposit", order.getDeposit() != null ? order.getDeposit() : BigDecimal.ZERO);
            data.add(map);
        }
        return data;
@@ -218,34 +225,48 @@
        order.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
        order.setUnitAmount(item.getUnitAmount());
        order.setFee(item.getUnitFee().multiply(order.getVolume()));
        order.setDeposit(item.getUnitAmount().multiply(order.getVolume()));
        BigDecimal unitAmount = order.getPrice().multiply(BigDecimal.valueOf(item.getFaceValue()));
        unitAmount = unitAmount.setScale(4, RoundingMode.DOWN);
        BigDecimal deposit = unitAmount.multiply(order.getVolumeOpen()).divide(order.getLeverRate(), 4, RoundingMode.DOWN);
        order.setUnitAmount(unitAmount);
        order.setDeposit(deposit);
        if (order.getLeverRate() != null) {
            /**
             * 加上杠杆
             */
            order.setVolume(order.getVolume().multiply(order.getLeverRate()));
            order.setFee(order.getFee().multiply(order.getLeverRate()));
            // 设置订单数量
            order.setVolume(order.getVolumeOpen());
            BigDecimal fee = order.getDeposit().multiply(order.getLeverRate()).multiply(item.getUnitFee());
            fee = fee.setScale(4, RoundingMode.DOWN);  // 保留两位小数
            order.setFee(fee);
        }
        order.setVolumeOpen(order.getVolume());
        order.setVolumeOpen(order.getVolumeOpen());
        Wallet wallet = this.walletService.findByUserId(order.getPartyId());
        BigDecimal amountBefore = wallet.getMoney();
        BigDecimal totalAmountCost = order.getDeposit().add(order.getFee());
        if (amountBefore.compareTo(totalAmountCost) < 0) {
            throw new YamiShopBindException("余额不足");
        }
        walletService.updateMoney(order.getSymbol(), order.getPartyId(), BigDecimal.ZERO.subtract(order.getDeposit()), BigDecimal.ZERO
                , Constants.MONEYLOG_CATEGORY_CONTRACT, Constants.WALLET_USDT, Constants.MONEYLOG_CONTENT_CONTRACT_OPEN, "委托单,订单号[" + order.getOrderNo() + "]"
        );
        walletService.updateMoney(order.getSymbol(), order.getPartyId(), BigDecimal.ZERO.subtract(order.getFee()), BigDecimal.ZERO
                , Constants.MONEYLOG_CATEGORY_CONTRACT, Constants.WALLET_USDT, Constants.MONEYLOG_CONTENT_FEE, "委托单,订单号[" + order.getOrderNo() + "]"
        );
        save(order);
        //如果是限价单先扣钱
        if(order.getOrderPriceType().equals("limit")){
            walletService.updateMoney(order.getSymbol(), order.getPartyId(), BigDecimal.ZERO.subtract(order.getDeposit()), BigDecimal.ZERO
                    , Constants.MONEYLOG_CATEGORY_CONTRACT, Constants.WALLET_USDT, Constants.MONEYLOG_CONTENT_CONTRACT_OPEN, "委托单,订单号[" + order.getOrderNo() + "]"
            );
            walletService.updateMoney(order.getSymbol(), order.getPartyId(), BigDecimal.ZERO.subtract(order.getFee()), BigDecimal.ZERO
                    , Constants.MONEYLOG_CATEGORY_CONTRACT, Constants.WALLET_USDT, Constants.MONEYLOG_CONTENT_FEE, "委托单,订单号[" + order.getOrderNo() + "]"
            );
        }
        save(order);
    }
    /**
@@ -297,11 +318,13 @@
            return;
        }
        order.setState("canceled");
        walletService.updateMoney(order.getSymbol(),
                order.getPartyId(),
                order.getDeposit().add(order.getFee()),
                BigDecimal.ZERO,
                Constants.MONEYLOG_CATEGORY_CONTRACT, Constants.WALLET_USDT, Constants.MONEYLOG_CONTENT_CONTRACT_CONCEL, "撤单,订单号[" + order.getOrderNo() + "]");
        if(order.getOrderPriceType().equals("limit")){
            walletService.updateMoney(order.getSymbol(),
                    order.getPartyId(),
                    order.getDeposit().add(order.getFee()),
                    BigDecimal.ZERO,
                    Constants.MONEYLOG_CATEGORY_CONTRACT, Constants.WALLET_USDT, Constants.MONEYLOG_CONTENT_CONTRACT_CONCEL, "撤单,订单号[" + order.getOrderNo() + "]");
        }
        updateById(order);
    }