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); } 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()) { 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); 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()); //如何不存在添加 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()); } } } 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); 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); } 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()"); } /** * 获取品种精度