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