新版仿ok交易所-后端
zyy
2025-09-03 a1c2c8df8c2741fdb4e1d30b1dd70e57133e1cb7
初始化修改
5 files modified
150 ■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/ico/AdminIcoController.java 30 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java 34 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/InitHandle.java 65 ●●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java 3 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/item/ItemService.java 18 ●●●●● patch | view | raw | blame | history
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()) {
            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());
        }
    }
}
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()");
    }
    /**
     * 获取品种精度