From a1c2c8df8c2741fdb4e1d30b1dd70e57133e1cb7 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Wed, 03 Sep 2025 14:51:40 +0800
Subject: [PATCH] 初始化修改
---
trading-order-admin/src/main/java/com/yami/trading/admin/task/InitHandle.java | 65 +++++++++++++++++++++
trading-order-service/src/main/java/com/yami/trading/service/item/ItemService.java | 18 ++++++
trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java | 34 +++++++---
trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java | 30 ++++++++-
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java | 3 +
5 files changed, 134 insertions(+), 16 deletions(-)
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java
index 9914006..3a09604 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java
@@ -8,6 +8,7 @@
import com.yami.trading.bean.ico.domain.UserSubscription;
import com.yami.trading.bean.ico.dto.UserSubscriptionDTO;
import com.yami.trading.bean.ico.query.IcoQuery;
+import com.yami.trading.bean.item.domain.Item;
import com.yami.trading.bean.item.query.ItemQuery;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.exception.YamiShopBindException;
@@ -36,6 +37,9 @@
@Autowired
private UserSubscriptionService userSubscriptionService;
+ @Autowired
+ ItemService itemService;
+
/**
* 产品列表数据
*/
@@ -53,12 +57,27 @@
@ApiOperation(value = "保存新币")
@PostMapping("save")
public Result <String> save(@Valid @RequestBody Ico ico) {
+ long count;
if (ico.getId() == null) { //新增校验
- long count = icoService.count(new LambdaQueryWrapper<Ico>()
- .eq(Ico::getSymbol, ico.getSymbol()));
- if(count > 0){
- throw new YamiShopBindException("代币符号已存在");
- }
+ count = icoService.count(new LambdaQueryWrapper<Ico>()
+ .eq(Ico::getSymbol, ico.getSymbol()).or().eq(Ico::getSymbolData, ico.getSymbolData()));
+
+ } else {
+ count = icoService.count(new LambdaQueryWrapper<Ico>()
+ .ne(Ico::getId, ico.getId())
+ .and(wrapper -> wrapper
+ .eq(Ico::getSymbol, ico.getSymbol())
+ .or()
+ .eq(Ico::getSymbolData, ico.getSymbolData())));
+ }
+ if(count > 0){
+ throw new YamiShopBindException("代币符号或数据源编码已存在");
+ }
+ //产品表
+ long iCount = itemService.count(new LambdaQueryWrapper<Item>()
+ .eq(Item::getSymbol, ico.getSymbol()).or().eq(Item::getSymbolData, ico.getSymbolData()));
+ if(iCount > 0){
+ throw new YamiShopBindException("产品表已存在数据");
}
//新增或编辑表单保存
icoService.saveOrUpdate(ico);
@@ -91,6 +110,7 @@
@GetMapping("recordList")
public Result<Page<UserSubscriptionDTO>> recordList(IcoQuery icoQuery, Page<UserSubscriptionDTO> page) throws Exception {
QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (icoQuery, IcoQuery.class);
+ queryWrapper.eq("u.del_flag", "0");
Page<UserSubscriptionDTO> result = userSubscriptionService.findPage(page, queryWrapper);
return Result.ok(result);
}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java b/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
index 6c295ab..cb5ee12 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
@@ -7,7 +7,6 @@
import com.yami.trading.bean.item.domain.Item;
import com.yami.trading.service.ico.IcoService;
import com.yami.trading.service.item.ItemService;
-import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -29,29 +28,42 @@
@Autowired
ItemService itemService;
+ @Autowired
+ InitHandle initHandle;
+
/**
* ico转入产品
*/
- @Scheduled(cron = "0 */5 * * * ?")
+ @Scheduled(cron = "0 */1 * * * ?")
public void icoToItem() {
QueryWrapper<Ico> query = new QueryWrapper<>();
query.lt("market_date", DateTime.now());
List<Ico> icoList = icoService.list(query);
- if (icoList != null && !icoList.isEmpty()) {
- List<String> symbolList = icoList.stream().map(Ico::getSymbol).collect(Collectors.toList());
+ if (icoList == null || icoList.isEmpty()) {
+ return;
+ }
+ List<String> symbolList = icoList.stream().map(Ico::getSymbol).collect(Collectors.toList());
- QueryWrapper<Item> iQuery = new QueryWrapper<>();
- iQuery.in("SYMBOL", symbolList);
- iQuery.eq("currency_type", 1);
+ QueryWrapper<Item> iQuery = new QueryWrapper<>();
+ iQuery.in("SYMBOL", symbolList);
+ iQuery.eq("currency_type", 1);
+ List<Item> itemList = itemService.list(iQuery);
- List<Item> itemList = itemService.list(iQuery);
- List<Item> addItemList = new ArrayList<>();
- for (Ico ico : icoList) {
- Item item = itemList.stream().filter(x -> x.getSymbol().equals(ico.getSymbol())).findFirst().orElse(new Item());
+ List<Item> addItemList = new ArrayList<>();
+ for (Ico ico : icoList) {
+ //如何不存在添加
+ Item item = itemList.stream().filter(x -> x.getSymbol().equals(ico.getSymbol())).findFirst().orElse(null);
+ if (item == null) {
+ item = new Item();
item =icoService.icoToItem(item, ico);
addItemList.add(item);
}
+ }
+ if (!addItemList.isEmpty()) {
+ log.info("ico转入产品 数据 Start>>");
itemService.saveOrUpdateBatch(addItemList);
+ initHandle.init();
+ log.info("成功ico转入产品 数据 End {}", icoList.size());
}
}
}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/task/InitHandle.java b/trading-order-admin/src/main/java/com/yami/trading/admin/task/InitHandle.java
index 3e7392f..0222b57 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/task/InitHandle.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/task/InitHandle.java
@@ -25,6 +25,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.Collections;
@@ -203,6 +204,70 @@
exchangeApplyOrderHandleJob.start();
}
+ @Async
+ public void init() {
+ log.info("开始Data初始化........");
+ itemService.reloadListAndCache();
+ List<Item> items = itemService.list();
+ for (Item item : items) {
+ AdjustmentValueCache.getCurrentValue().put(item.getSymbol(), item.getAdjustmentValue());
+ }
+
+ for (Item item : items) {
+ Realtime realtime = dataDBService.get(item.getSymbol());
+ if (realtime != null) {
+ DataCache.putRealtime(item.getSymbol(), realtime);
+ }
+ }
+
+ for (Item item : items) {
+ List<Realtime> list = this.dataDBService.findRealtimeOneDay(item.getSymbol());
+ DataCache.getRealtimeHistory().put(item.getSymbol(), list);
+ }
+
+ klineLoadCache.loadCache();
+ String symbols = items.stream().map(Item::getSymbol).collect(Collectors.joining(","));
+ // 数据有问题初始化一下
+ klineInitService.klineInit(symbols);
+ // 高低修正
+ highLowHandleJob.start();
+ cryptosGetDataJob.start();
+ fakeSymbolGetDataJob.start();
+ // 实时数据批量保存线程
+ saveRealtimeServer.start();
+
+ // realtime推送JOB
+ realtimePushJob.start();
+ /**
+ * 最化5档和最新成交数据 火币数据线程
+ */
+ dataServer.start();
+ List<Item> item_list = itemService.list().stream().filter(i -> i.getType().equalsIgnoreCase(Item.cryptos)).collect(Collectors.toList());
+
+ for (int i = 0; i < item_list.size(); i++) {
+ Item item = item_list.get(i);
+ HandleObject depth = new HandleObject();
+ depth.setType(HandleObject.type_depth);
+ depth.setItem(item);
+ DataQueue.add(depth);
+
+ HandleObject trade = new HandleObject();
+ trade.setType(HandleObject.type_trade);
+ trade.setItem(item);
+ DataQueue.add(trade);
+ }
+
+ realtimeWebsocketServer.start();
+ realtimePushJob.start();
+ depthPushJob.start();
+ tradePushJob.start();
+
+ dataFrequencyServer.start();
+ cleanDataJob.taskJob();
+ log.info("完成Data初始化。");
+ }
+
+
public void bulidInit(Item item, String line) {
List<Kline> list = this.klineService.find(item.getSymbol(), line, Integer.MAX_VALUE);
diff --git a/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java b/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
index a9a5394..5037e72 100644
--- a/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
+++ b/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
@@ -48,6 +48,9 @@
// 最近60s内实时价格集合
List<Realtime> list = DataCache.latestRealTimeMap_60s.get(symbol);
+ if (list == null) {
+ return;
+ }
if (list.size() >= KlineConstant.LATEST_REALTIME_LIST_MAX) {
list.remove(0);
}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemService.java b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemService.java
index cdb02e8..5498355 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemService.java
@@ -24,6 +24,7 @@
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -181,6 +182,23 @@
return super.removeById(id);
}
+ // 清除 list() 方法的缓存(关键:与@Cached的name和key一致)
+ /*@CacheEvict(cacheNames = ITEM_CACHE, key = "'all'")
+ public void clearListCache() {
+ log.info("已清除 list() 方法的缓存");
+ }*/
+
+ public void reloadListAndCache() {
+ // 步骤1:清除 list() 方法的原有缓存(确保重新查询)
+ //clearListCache();
+
+ // 步骤2:重新调用 list() 方法,此时会执行数据库查询,且@Cached会自动更新缓存
+ //List<Item> freshList = list();
+
+ // 步骤3(可选):如果需要同步更新 init() 方法中的 itemCache,重新调用 init()
+ init();
+ log.info("初始化init()");
+ }
/**
* 获取品种精度
--
Gitblit v1.9.3