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