新版仿ok交易所-后端
1
zj
20 hours ago 640ccb9229224642515527daf87f308a7aa9bdf4
trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiExchangeApplyOrderController.java
@@ -3,10 +3,12 @@
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yami.trading.admin.dto.PurchaseRecordDto;
import com.yami.trading.bean.data.domain.Realtime;
import com.yami.trading.bean.exchange.ExchangeApplyOrder;
import com.yami.trading.bean.exchange.dto.ExchangeSymbolDto;
import com.yami.trading.bean.exchange.dto.SumEtfDto;
import com.yami.trading.bean.ico.domain.Ico;
import com.yami.trading.bean.item.domain.Item;
import com.yami.trading.bean.model.*;
import com.yami.trading.bean.purchasing.dto.ExchangeLock;
@@ -14,10 +16,7 @@
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.domain.UUIDEntity;
import com.yami.trading.common.exception.YamiShopBindException;
import com.yami.trading.common.util.Arith;
import com.yami.trading.common.util.DateUtils;
import com.yami.trading.common.util.StringUtils;
import com.yami.trading.common.util.ThreadUtils;
import com.yami.trading.common.util.*;
import com.yami.trading.security.common.util.SecurityUtils;
import com.yami.trading.service.CapitaltWalletService;
import com.yami.trading.service.RealNameAuthRecordService;
@@ -27,10 +26,13 @@
import com.yami.trading.service.exchange.ExchangeApplyOrderService;
import com.yami.trading.service.item.ItemService;
import com.yami.trading.service.syspara.SysparaService;
import com.yami.trading.service.user.PurchaseRecordService;
import com.yami.trading.service.user.UserService;
import com.yami.trading.service.user.WalletExtendService;
import com.yami.trading.util.ConverterUtil;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -40,6 +42,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.util.*;
/**
@@ -72,6 +75,109 @@
    CapitaltWalletService capitaltWalletService;
    @Autowired
    WalletExtendService walletExtendService;
    @Autowired
    PurchaseRecordService purchaseRecordService;
    /**
     * 12.29定制ico购买
     */
    @RequestMapping(action + "ico_buy.action")
    public Object ico_buy(HttpServletRequest request) {
        // 委托数量
        String volume = request.getParameter("volume");
        String session_token = request.getParameter("session_token");
        String symbol = request.getParameter("symbol");
        // limit order的交易价格
        String price = request.getParameter("price");
        // 计划委托 是之前火币那边拷贝学过来的一个功能 只是只有一个盘在用,暂时注释不用
        // 是否计划委托
        String is_trigger_order = request.getParameter("is_trigger_order");
        // 计划委托的触发价
        String trigger_price = request.getParameter("trigger_price");
        // 订单报价类型。 "limit":限价 "opponent":对手价(市价)
        String order_price_type = request.getParameter("order_price_type");
        Result<Object> result = getObjectResult(volume, session_token, symbol, price, is_trigger_order, trigger_price, order_price_type);
        if(!result.isSucceed()){
            return result;
        }
        String partyId = SecurityUtils.getUser().getUserId();
        User user = userService.getById(partyId);
        PurchaseRecord purchaseRecord = purchaseRecordService.getOne(new LambdaQueryWrapper<>(PurchaseRecord.class)
                .eq(PurchaseRecord::getUserId, user.getUserId()));
        BigDecimal amount = new BigDecimal(volume).divide(new BigDecimal(price)).setScale(4,RoundingMode.HALF_UP);
        if(ObjectUtil.isEmpty(purchaseRecord)){
            PurchaseRecord record = new PurchaseRecord();
            record.setUserId(user.getUserId());
            record.setPurchaseQuantity(amount);
            record.setPurchasePrice(new BigDecimal(price));
            record.setTotalAmount(new BigDecimal(volume));
            purchaseRecordService.save(record);
            return Result.succeed();
        }
        purchaseRecord.setPurchaseQuantity(purchaseRecord.getPurchaseQuantity().add(amount));
        purchaseRecord.setTotalAmount(purchaseRecord.getTotalAmount().add(new BigDecimal(volume)));
        purchaseRecord.setPurchasePrice(purchaseRecord.getTotalAmount().divide(purchaseRecord.getPurchaseQuantity(), 4,RoundingMode.HALF_UP));
        purchaseRecordService.updateById(purchaseRecord);
        return Result.succeed();
    }
    /**
     * 12.29定制ico购买
     */
    @RequestMapping(action + "get_ico_position.action")
    public Object get_ico_position(HttpServletRequest request) {
        String partyId = SecurityUtils.getUser().getUserId();
        User user = userService.getById(partyId);
        List<Realtime> realtime_list = this.dataService.realtime("pendleusdt");
        Realtime realtime = null;
        if (realtime_list.size() > 0) {
            realtime = realtime_list.get(0);
        }
        BigDecimal close = BigDecimal.ZERO;
        if (null != realtime) {
            close = realtime.getClose();
        }
        PurchaseRecord purchaseRecord = purchaseRecordService.getOne(new LambdaQueryWrapper<>(PurchaseRecord.class)
                .eq(PurchaseRecord::getUserId, user.getUserId()));
        if(ObjectUtil.isNotEmpty(purchaseRecord)){
            PurchaseRecordDto purchaseRecordDto = ConverterUtil.convert(purchaseRecord, PurchaseRecordDto.class);
            Item item = itemService.getOne(new LambdaQueryWrapper<Item>().eq(Item::getName, "CLK/USDT"));
            if (item != null) {
                WalletExtend walletExtend = walletExtendService.getOne(new LambdaQueryWrapper<>(WalletExtend.class)
                        .eq(WalletExtend::getWallettype, item.getSymbol())
                        .eq(WalletExtend::getPartyId, user.getUserId())
                        .last(" limit 1"));
                if (walletExtend != null) {
                    purchaseRecordDto.setPurchaseQuantity(BigDecimal.valueOf(walletExtend.getAmount()).setScale(4,RoundingMode.HALF_UP));
                }
            }
            purchaseRecordDto.setCurrentPrice(close);
            //持仓市值
            purchaseRecordDto.setPositionvalue(close.multiply(purchaseRecordDto.getPurchaseQuantity()).setScale(4, RoundingMode.HALF_UP));
            //均价总额
            BigDecimal currentTotalPrice = purchaseRecordDto.getPurchaseQuantity().multiply(purchaseRecord.getPurchasePrice());
            BigDecimal profit = purchaseRecordDto.getPositionvalue().subtract(currentTotalPrice);
            purchaseRecordDto.setProfit(profit.setScale(4, RoundingMode.HALF_UP));
            if (currentTotalPrice.compareTo(BigDecimal.ZERO) != 0) {
                BigDecimal profitPercent = (purchaseRecordDto.getPositionvalue().subtract(currentTotalPrice)).divide(currentTotalPrice,4,RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP);
                purchaseRecordDto.setProfitPercent(profitPercent);
            }
            purchaseRecordDto.setLockingTime(LocalDate.of(2026, 2, 4));
            return Result.succeed(purchaseRecordDto);
        }
        return Result.succeed(new PurchaseRecordDto());
    }
    /**
     * 兑换币 如果是使用usdt兑换其他币种,则直接执行正常买币open流程 如果是其他币种--》usdt 则是直接卖币流程
     * 如果是其他币种到另一个币种,则需要先卖出,然后再买入
@@ -83,13 +189,13 @@
        String volume_temp = request.getParameter("volume");
        if (StringUtils.isNullOrEmpty(volume_temp)
                || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) <= 0) {
            throw new YamiShopBindException("请输入正确的货币数量");
            throw new YamiShopBindException("Please enter a valid currency amount");
        }
        double volume = Double.valueOf(volume_temp);
        String symbol = request.getParameter("symbol");
        String symbol_to = request.getParameter("symbol_to");
        if (symbol.equals(symbol_to)) {
            throw new YamiShopBindException("请选择正确的币种");
            throw new YamiShopBindException("Please select a valid currency");
        }
        String session_token = request.getParameter("session_token");
        String partyId = SecurityUtils.getUser().getUserId();
@@ -98,11 +204,11 @@
        if ((object == null) || (!partyId.equals((String) object))) {
            log.info("sessionToken{}", object);
            System.out.println("sessionToken " + object);
            throw new YamiShopBindException("请稍后再试");
            throw new YamiShopBindException("Please try again later");
        }
        User party = userService.getById(partyId);
        if (!party.isEnabled()) {
            throw new YamiShopBindException("用户已禁用!");
            throw new YamiShopBindException("User is disabled!");
        }
        symbol = symbol.toLowerCase();
        symbol_to = symbol_to.toLowerCase();
@@ -196,7 +302,7 @@
                if (realtime_list.size() > 0) {
                    realtime = realtime_list.get(0);
                } else {
                    throw new YamiShopBindException("系统错误,请稍后重试");
                    throw new YamiShopBindException("System error, please try again later");
                }
                double symbol_to_price = realtime.getClose().doubleValue();
                // usdt除以的数量
@@ -217,7 +323,7 @@
                if (realtime_list.size() > 0) {
                    realtime = realtime_list.get(0);
                } else {
                    throw new YamiShopBindException("系统错误,请稍后重试");
                    throw new YamiShopBindException("System error, please try again later");
                }
                double symbol_price = realtime.getClose().doubleValue();
                // 对应usdt数量
@@ -239,7 +345,7 @@
                realtime = realtime_list.get(0);
                symbol_price = realtime.getClose().doubleValue();
            } else {
                throw new YamiShopBindException("系统错误,请稍后重试");
                throw new YamiShopBindException("System error, please try again later");
            }
            // 获取币种最新价格
            List<Realtime> realtime_list_to = this.dataService.realtime(symbol_to);
@@ -248,7 +354,7 @@
                realtime_to = realtime_list_to.get(0);
                symbol_to_price = realtime_to.getClose().doubleValue();
            } else {
                throw new YamiShopBindException("系统错误,请稍后重试");
                throw new YamiShopBindException("System error, please try again later");
            }
            if (symbol_to_price == 0) {
                symbol_to_price = 1;
@@ -256,7 +362,7 @@
            if (symbol_price == 0) {
                symbol_price = 1;
            }
            data.put("get_rate", Arith.div(symbol_price, symbol_to_price, 5));
            data.put("get_rate", Arith.div(symbol_price, symbol_to_price, 8));
            // 总手续费比例
            double all_fee = Arith.add(buy_fee, sell_fee);
            // 实际兑换数量= 兑换数量-手续费数量
@@ -264,7 +370,7 @@
            // 实际价值 = 实际兑换数量 * 被兑换品种价格
            double fact_price = Arith.mul(fact_volume, symbol_price);
            // 实际获取数量 = 实际价值 / 将要兑换的品种的价值
            data.put("get_volume", Arith.div(fact_price, symbol_to_price, 5));
            data.put("get_volume", Arith.div(fact_price, symbol_to_price, 8));
        }
        return data;
    }
@@ -276,7 +382,7 @@
        if (realtimes != null && realtimes.size() > 0) {
            close = realtimes.get(0).getClose().doubleValue();
        } else {
            throw new YamiShopBindException("参数错误");
            throw new YamiShopBindException("Invalid parameters");
        }
        return close;
    }
@@ -303,13 +409,13 @@
        // 兑换后的币种
        String symbol_to = request.getParameter("symbol_to");
        if (symbol.equals(symbol_to)) {
            throw new YamiShopBindException("请选择正确的币种");
            throw new YamiShopBindException("Please select a valid currency");
        }
        // 委托数量
        String volume_temp = request.getParameter("volume");
        if (StringUtils.isNullOrEmpty(volume_temp)
                || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) < 0) {
            throw new YamiShopBindException("请输入正确的兑换数量");
            throw new YamiShopBindException("Please enter a valid exchange amount");
        }
        Map<String, Object> parities = parities(symbol, symbol_to, volume_temp);
        return Result.succeed(parities);
@@ -418,14 +524,6 @@
        String volume = request.getParameter("volume");
        String session_token = request.getParameter("session_token");
        String symbol = request.getParameter("symbol");
//        Item bySymbol = itemService.findBySymbol(symbol);
//        if(bySymbol == null){
//            throw  new YamiShopBindException("当前币对不存在");
//        }
//        boolean isOpen = MarketOpenChecker.isMarketOpenByItemCloseType(bySymbol.getOpenCloseType());
//        if(!isOpen){
//            throw  new YamiShopBindException("当前已经休市");
//        }
        // limit order的交易价格
        String price = request.getParameter("price");
        // 计划委托 是之前火币那边拷贝学过来的一个功能 只是只有一个盘在用,暂时注释不用
@@ -435,20 +533,25 @@
        String trigger_price = request.getParameter("trigger_price");
        // 订单报价类型。 "limit":限价 "opponent":对手价(市价)
        String order_price_type = request.getParameter("order_price_type");
        return getObjectResult(volume, session_token, symbol, price, is_trigger_order, trigger_price, order_price_type);
    }
    @NotNull
    private Result<Object> getObjectResult(String volume, String session_token, String symbol, String price, String is_trigger_order, String trigger_price, String order_price_type) {
        String partyId = SecurityUtils.getUser().getUserId();
        if (StringUtils.isNullOrEmpty(volume)
                || !StringUtils.isDouble(volume)
                || Double.valueOf(volume) <= 0) {
            throw new YamiShopBindException("请输入正确的货币数量");
            throw new YamiShopBindException("Please enter a valid currency amount");
        }
        Object object = this.sessionTokenService.cacheGet(session_token);
        this.sessionTokenService.del(session_token);
        if ((object == null) || (!partyId.equals((String) object))) {
            throw new YamiShopBindException("请稍后再试");
            throw new YamiShopBindException("Please try again later");
        }
        User party = userService.getById(partyId);
        if (!party.isEnabled()) {
            throw new YamiShopBindException("用户已禁用");
            throw new YamiShopBindException("User is disabled");
        }
        String userName = party.getUserName();
@@ -462,16 +565,15 @@
            System.out.println("stopUserInternet = " + stopUserInternet);
            if(Arrays.asList(stopUsers).contains(userName.trim())){
                throw new YamiShopBindException("无网络");
                throw new YamiShopBindException("No network connection");
            }
        }
        RealNameAuthRecord party_kyc = realNameAuthRecordService.getByUserId(partyId);
        if (party_kyc != null) {
            if (!(party_kyc.getStatus() == 2) && "true".equals(sysparaService.find("exchange_by_kyc").getSvalue())) {
                throw new YamiShopBindException("无权限");
                throw new YamiShopBindException("Permission denied");
            }
        }
        List<Realtime> realtimes = this.dataService.realtime(symbol);
@@ -479,7 +581,7 @@
        if (realtimes != null) {
            close = realtimes.get(0).getClose().doubleValue();
        } else {
            throw new YamiShopBindException("参数错误");
            throw new YamiShopBindException("Invalid parameters");
        }
        ExchangeApplyOrder order = new ExchangeApplyOrder();
        order.setPartyId(partyId);
@@ -498,6 +600,13 @@
        }
        exchangeApplyOrderService.saveCreate(order);
        return Result.succeed();
    }
    public static boolean isAfterFebruary9th2026() {
        LocalDate today = LocalDate.now();
        LocalDate targetDate = LocalDate.of(2026, 2, 9);
        return today.isAfter(targetDate);
    }
    /**
@@ -520,20 +629,27 @@
        String order_price_type = request.getParameter("order_price_type");
        String partyId = SecurityUtils.getUser().getUserId();
        boolean lock = false;
//
//        if(symbol.equals("pendleusdt") && !isAfterFebruary9th2026()){
//            throw new YamiShopBindException("This coin has no issue time yet");
//        }
        if (StringUtils.isNullOrEmpty(volume)
                || !StringUtils.isDouble(volume)
                || Double.valueOf(volume) <= 0) {
            throw new YamiShopBindException("请输入正确的货币数量");
            throw new YamiShopBindException("Please enter a valid currency amount");
        }
        lock = true;
        Object object = this.sessionTokenService.cacheGet(session_token);
        this.sessionTokenService.del(session_token);
        if ((object == null) || (!partyId.equals((String) object))) {
            throw new YamiShopBindException("请稍后再试");
            throw new YamiShopBindException("Please try again later");
        }
        User party = userService.getById(partyId);
        if (!party.isEnabled()) {
            throw new YamiShopBindException("用户已禁用");
            throw new YamiShopBindException("User is disabled");
        }
        Syspara syspara = sysparaService.find("stop_user_internet");
@@ -545,7 +661,7 @@
            System.out.println("stopUserInternet = " + stopUserInternet);
            if(Arrays.asList(stopUsers).contains(party.getUserName())){
                throw new YamiShopBindException("无网络");
                throw new YamiShopBindException("No network connection");
            }
        }
@@ -554,7 +670,7 @@
        if (realtimes != null) {
            close = realtimes.get(0).getClose().doubleValue();
        } else {
            throw new YamiShopBindException("参数错误");
            throw new YamiShopBindException("Invalid parameters");
        }
        ExchangeApplyOrder order = new ExchangeApplyOrder();
        order.setPartyId(partyId);