Administrator
14 hours ago aac24166b4e15146b0b4e18364cd1d154986f039
src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java
@@ -1,15 +1,11 @@
package com.xcong.excoin.modules.symbols.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.huobi.client.model.Candlestick;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.enumerates.SymbolEnum;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.common.system.mapper.CandlestickMapper;
import com.xcong.excoin.modules.newPrice.ExchangeInfoEnum;
import com.xcong.excoin.modules.newPrice.ExchangeLoginService;
import com.xcong.excoin.modules.newPrice.KlineVo;
@@ -17,21 +13,16 @@
import com.xcong.excoin.modules.platform.entity.PlatformCnyUsdtExchangeEntity;
import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto;
import com.xcong.excoin.modules.symbols.parameter.vo.HomeSymbolsVo;
import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo;
import com.xcong.excoin.modules.symbols.service.SymbolsService;
import com.xcong.excoin.utils.CoinTypeConvert;
import com.xcong.excoin.utils.MessageSourceUtils;
import com.xcong.excoin.utils.RedisUtils;
import com.xcong.excoin.utils.api.ApiClient;
import com.xcong.excoin.utils.api.response.Kline;
import com.xcong.excoin.utils.api.response.KlineResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@@ -66,42 +57,65 @@
        return client;
    }
//    @Override
//    public void updateSymbolsKine(String time) {
//        synchronized (this) {
//            //更新币币交易K线历史数据
//            for (SymbolEnum symbol : SymbolEnum.values()) {
//                try {
//                    Thread.sleep(500);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                String[] symbols = symbol.getValue().toLowerCase().split("/");
//                ApiClient client = getClient();
//                KlineResponse kline = client.kline(symbols[0] + symbols[1], time, 1000 + "");
//                if (kline != null) {
//                    if ("ok".equalsIgnoreCase(kline.getStatus())) {
//                        List<Kline> klines = (List<Kline>) kline.data;
//                        List<Candlestick> list = new ArrayList<Candlestick>();
//                        Candlestick candlestick = null;
//                        for (Kline kline1 : klines) {
//                            candlestick = new Candlestick();
//                            candlestick.setAmount(BigDecimal.valueOf(kline1.getAmount()));
//                            candlestick.setClose(BigDecimal.valueOf(kline1.getClose()));
//                            candlestick.setCount(kline1.getCount());
//                            candlestick.setHigh(BigDecimal.valueOf(kline1.getHigh()));
//                            candlestick.setLow(BigDecimal.valueOf(kline1.getLow()));
//                            candlestick.setVolume(BigDecimal.valueOf(kline1.getVol()));
//                            candlestick.setTimestamp(kline1.getId() * 1000);
//                            candlestick.setOpen(BigDecimal.valueOf(kline1.getOpen()));
//                            list.add(candlestick);
//                        }
//
//                        if (klines.size() > 0) {
//                            redisUtils.set("KINE_" + symbol.getValue() + "_" + time, list);
//                        }
//                    }
//                }
//            }
//        }
//    }
    @Override
    public void updateSymbolsKine(String time) {
        synchronized (this) {
            //更新币币交易K线历史数据
            for (SymbolEnum symbol : SymbolEnum.values()) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String[] symbols = symbol.getValue().toLowerCase().split("/");
                ApiClient client = getClient();
                KlineResponse kline = client.kline(symbols[0] + symbols[1], time, 1000 + "");
                if (kline != null) {
                    if ("ok".equalsIgnoreCase(kline.getStatus())) {
                        List<Kline> klines = (List<Kline>) kline.data;
                        List<Candlestick> list = new ArrayList<Candlestick>();
                        Candlestick candlestick = null;
                        for (Kline kline1 : klines) {
                            candlestick = new Candlestick();
                            candlestick.setAmount(BigDecimal.valueOf(kline1.getAmount()));
                            candlestick.setClose(BigDecimal.valueOf(kline1.getClose()));
                            candlestick.setCount(kline1.getCount());
                            candlestick.setHigh(BigDecimal.valueOf(kline1.getHigh()));
                            candlestick.setLow(BigDecimal.valueOf(kline1.getLow()));
                            candlestick.setVolume(BigDecimal.valueOf(kline1.getVol()));
                            candlestick.setTimestamp(kline1.getId() * 1000);
                            candlestick.setOpen(BigDecimal.valueOf(kline1.getOpen()));
                            list.add(candlestick);
                        }
                        if (klines.size() > 0) {
                            redisUtils.set("KINE_" + symbol.getValue() + "_" + time, list);
                        }
                    }
                }
                String instId = symbols[0] +"-"+ symbols[1];
                instId  = instId.toUpperCase() ;
                String bar = time;
                LinkedHashMap<String, Object> requestParam = new LinkedHashMap<>();
                requestParam.put("instId",instId);
                requestParam.put("bar",bar);
                requestParam.put("limit","300");
                String result = ExchangeLoginService.getInstance(ExchangeInfoEnum.OKX_UAT.name()).lineHistory(requestParam);
                log.info("加载OKX-KLINE,{}", instId);
                JSONObject json = JSON.parseObject(result);
                String data = json.getString("data");
                log.info("加载OKX-KLINE,{}", data);
                redisUtils.set("KINE_" + instId + "_" + time, data);
            }
        }
    }
@@ -159,49 +173,55 @@
        String key = "KINE_{}_{}";
        // 币币k线数据
        if (AppContants.HOME_SYMBOLS_COIN == klineDetailDto.getType()) {
            key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod());
            key = StrUtil.format(key, klineDetailDto.getInstId(), klineDetailDto.getBar());
            // 合约k线数据
        } else {
            key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod());
            key = StrUtil.format(key, klineDetailDto.getInstId(), klineDetailDto.getBar());
        }
        Object data = redisUtils.get(key);
        if (data != null) {
            List list = (List) data;
            int length = 0;
            // 默认获取k线900个柱状(超出会报错)
            int size = 900;
            if (list.size() > size) {
                length = size - 1;
            } else {
                length = list.size() - 1;
            }
            List<KlineDataVo> result = new ArrayList<>(length);
            for (int i = length; i > 0; i--) {
                Candlestick object = (Candlestick) list.get(i);
                KlineDataVo klineDataVo = CandlestickMapper.INSTANCE.toKlineDataVo(object);
                result.add(klineDataVo);
            }
            return Result.ok(result);
        }
        return Result.fail("获取数据失败");
        String data = redisUtils.getString(key);
        List<String[]> klinesList = JSON.parseArray(data, String[].class);
        return Result.ok(klinesList);
//        if (data != null) {
//            List list = (List) data;
//            int length = 0;
//            // 默认获取k线900个柱状(超出会报错)
//            int size = 900;
//
//            if (list.size() > size) {
//                length = size - 1;
//            } else {
//                length = list.size() - 1;
//            }
//
//            List<KlineDataVo> result = new ArrayList<>(length);
//            for (int i = length; i > 0; i--) {
//                Candlestick object = (Candlestick) list.get(i);
//                KlineDataVo klineDataVo = CandlestickMapper.INSTANCE.toKlineDataVo(object);
//                result.add(klineDataVo);
//            }
//            return Result.ok(result);
//        }
//        return Result.fail("获取数据失败");
    }
    @Override
    public Result findKlineList(KlineVo klineDetailDto) {
        Integer type = klineDetailDto.getType();
        String instId = null;
        if (AppContants.HOME_SYMBOLS_COIN == type){
            instId = CoinTypeConvert.convertToCoinKlineKey(klineDetailDto.getInstId());
        }else if (AppContants.HOME_SYMBOLS_CONTRACT == type){
            instId = CoinTypeConvert.convertToKlineKey(klineDetailDto.getInstId());
        }else{
            return Result.fail("参数错误");
        }
        String instId = klineDetailDto.getInstId();
//        String instId = null;
//        if (AppContants.HOME_SYMBOLS_COIN == type){
//            instId = CoinTypeConvert.convertToCoinKlineKey(klineDetailDto.getInstId());
//        }else if (AppContants.HOME_SYMBOLS_CONTRACT == type){
//            instId = CoinTypeConvert.convertToKlineKey(klineDetailDto.getInstId());
//        }else{
//            return Result.fail("参数错误");
//        }
        String bar = klineDetailDto.getBar();
        LinkedHashMap<String, Object> requestParam = new LinkedHashMap<>();
        requestParam.put("instId",instId);
        requestParam.put("bar",bar);
        requestParam.put("limit","300");
        String result = ExchangeLoginService.getInstance(ExchangeInfoEnum.OKX_UAT.name()).lineHistory(requestParam);
        log.info("加载OKX-KLINE,{}", result);
        JSONObject json = JSON.parseObject(result);