From 5e57de9b12ee136e45ce5754c7fe2e7eb12af05a Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Fri, 12 Jun 2026 18:35:45 +0800
Subject: [PATCH] 1

---
 trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java |   56 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
index 0a16c09..91fecdc 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
@@ -1,6 +1,7 @@
 package com.yami.trading.service.exchange.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -26,17 +27,18 @@
 import com.yami.trading.common.util.StringUtils;
 import com.yami.trading.common.util.UTCDateUtils;
 import com.yami.trading.dao.exchange.ExchangeApplyOrderMapper;
-import com.yami.trading.service.MarketOpenChecker;
 import com.yami.trading.service.MoneyLogService;
 import com.yami.trading.service.WalletService;
 import com.yami.trading.service.data.DataService;
 import com.yami.trading.service.exchange.ExchangeApplyOrderService;
+import com.yami.trading.service.item.ItemPreMarketService;
 import com.yami.trading.service.item.ItemService;
 import com.yami.trading.service.rate.ExchangeRateService;
 import com.yami.trading.service.syspara.SysparaService;
 import com.yami.trading.service.user.UserDataService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -61,6 +63,8 @@
     @Autowired
     ItemService itemService;
     @Autowired
+    ItemPreMarketService itemPreMarketService;
+    @Autowired
     DataService dataService;
     @Autowired
     WalletService walletService;
@@ -72,6 +76,9 @@
     ExchangeApplyOrderMapper exchangeApplyOrderMapper;
     @Autowired
     private ExchangeRateService exchangeRateService;
+    @Autowired
+    @Lazy
+    private ExchangeApplyOrderService self;
 
     @Override
     public List<ExchangeApplyOrder> findSubmitted() {
@@ -623,12 +630,17 @@
      * 现货交易买入
      */
     @Override
+    @Transactional
     public void saveSpotTradOpen(ExchangeApplyOrder order) {
         order.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
         double fee = Arith.mul(order.getVolume(), sysparaService.find("exchange_apply_order_buy_fee").getDouble());
         Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId());
         String symbol = order.getSymbol();
         Item item = itemService.findBySymbol(symbol);
+        if (item != null && StrUtil.isNotBlank(item.getSymbol())) {
+            symbol = item.getSymbol();
+            order.setSymbol(symbol);
+        }
         double amountBefore = wallet.getMoney().doubleValue();
         double realAmount = order.getVolume() + fee;
         String type = item.getType();
@@ -638,8 +650,10 @@
             throw new YamiShopBindException("余额不足");
         }
         // 休市期间,下市价订单, 叫 "竞价单",竞价单订单号长度为21,其他订单号长度为20位
+        boolean preMarketActive = itemPreMarketService != null
+                && itemPreMarketService.isPreMarketTradingActive(symbol);
         if (ExchangeApplyOrder.ORDER_PRICE_TYPE_OPPONENT.equals(order.getOrderPriceType())) {
-            boolean isOpen = MarketOpenChecker.isMarketOpenByItemCloseType(item.getOpenCloseType());
+            boolean isOpen = preMarketActive || itemService.isOpen(symbol);
             if (!isOpen) {
                 order.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(9));
             }
@@ -664,6 +678,7 @@
         order.setCreateTime(new Date());
         save(order);
         userDataService.saveBuy(order);
+        tryImmediatePreMarketFill(order, symbol, preMarketActive);
     }
 
     /**
@@ -676,14 +691,20 @@
         order.setCreateTime(new Date());
         order.setFee(Arith.mul(order.getVolume(), sysparaService.find("exchange_apply_order_sell_fee").getDouble()));
         Item item = itemService.findBySymbol(order.getSymbol());
-        // 休市期间,不让下市价卖出单
+        String symbol = order.getSymbol();
+        if (item != null && StrUtil.isNotBlank(item.getSymbol())) {
+            symbol = item.getSymbol();
+            order.setSymbol(symbol);
+        }
+        boolean preMarketActive = itemPreMarketService != null
+                && itemPreMarketService.isPreMarketTradingActive(symbol);
+        // 休市期间,不让下市价卖出单(盘前除外)
         if (ExchangeApplyOrder.ORDER_PRICE_TYPE_OPPONENT.equals(order.getOrderPriceType())) {
-            boolean isOpen = MarketOpenChecker.isMarketOpenByItemCloseType(item.getOpenCloseType());
-            if (!isOpen) {
+            if (!preMarketActive && !itemService.isOpen(symbol)) {
                 throw new YamiShopBindException("The current stock market is closed");
             }
         }
-        WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), order.getSymbol());
+        WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), symbol);
         double amount_before = walletExtend.getAmount();
         walletService.updateExtend(walletExtend.getPartyId(), walletExtend.getWallettype(), Arith.sub(0, order.getVolume()));
         String type = item.getType();
@@ -696,14 +717,33 @@
         moneylog.setAmountAfter(BigDecimal.valueOf(Arith.sub(amount_before, order.getVolume())));
         moneylog.setLog(name + type2 + "现货交易卖出,订单号[" + order.getOrderNo() + "]");
         moneylog.setUserId(order.getPartyId());
-        moneylog.setWalletType(order.getSymbol());
-        moneylog.setSymbol(order.getSymbol());
+        moneylog.setWalletType(symbol);
+        moneylog.setSymbol(symbol);
         moneylog.setContentType(type2 + Constants.MONEYLOG_CONTENT_CLOSE);
         moneylog.setCreateTime(new Date());
         moneylog.setUpdateTime(new Date());
         moneyLogService.save(moneylog);
         save(order);
         userDataService.saveSell(order);
+        tryImmediatePreMarketFill(order, symbol, preMarketActive);
+    }
+
+    /** 盘前时段:限价/市价均立即按盘前价成交,避免进入委托队列 */
+    private void tryImmediatePreMarketFill(ExchangeApplyOrder order, String symbol, boolean preMarketActive) {
+        if (!preMarketActive || itemPreMarketService == null) {
+            return;
+        }
+        Double prePrice = itemPreMarketService.getActivePreMarketPrice(symbol);
+        if (prePrice == null) {
+            log.warn("盘前已激活但未取到盘前价 symbol={} orderNo={}", symbol, order.getOrderNo());
+            return;
+        }
+        order.setPrice(prePrice);
+        if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {
+            self.saveSpotTradOpenCreated(order, prePrice);
+        } else if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) {
+            self.saveSpotTradCloseCreated(order, prePrice);
+        }
     }
     //================================================闪兑==============================================================
 

--
Gitblit v1.9.3