|  |  |  | 
|---|
|  |  |  | package com.xcong.excoin.modules.symbols.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import cn.hutool.core.util.StrUtil; | 
|---|
|  |  |  | 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.platform.dao.PlatformCnyUsdtExchangeDao; | 
|---|
|  |  |  | 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.RedisUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | // 币币行情 | 
|---|
|  |  |  | if (AppContants.HOME_SYMBOLS_COIN == type) { | 
|---|
|  |  |  | for (SymbolEnum symbolEnum : SymbolEnum.values()) { | 
|---|
|  |  |  | list.add(getSymbolReturnData(symbolEnum.getName())); | 
|---|
|  |  |  | list.add(getSymbolReturnData(symbolEnum.getValue())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 合约行情 | 
|---|
|  |  |  | } else if (AppContants.HOME_SYMBOLS_CONTRACT == type) { | 
|---|
|  |  |  | for (SymbolEnum symbolEnum : SymbolEnum.values()) { | 
|---|
|  |  |  | list.add(getSymbolReturnData(symbolEnum.getName())); | 
|---|
|  |  |  | if (!"GRICE".equals(symbolEnum.getName())) { | 
|---|
|  |  |  | list.add(getSymbolReturnData(symbolEnum.getValue())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 自选行情 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | 
|---|
|  |  |  | PlatformCnyUsdtExchangeEntity cnyUsdtExchange = platformCnyUsdtExchangeDao.getCNYAndUSDTOne(); | 
|---|
|  |  |  | // 获取当日k线数据 | 
|---|
|  |  |  | Candlestick symbolObject = (Candlestick) redisUtils.get(symbol); | 
|---|
|  |  |  | if(symbolObject==null){ | 
|---|
|  |  |  | symbolObject = new Candlestick(); | 
|---|
|  |  |  | symbolObject.setOpen(new BigDecimal(1)); | 
|---|
|  |  |  | symbolObject.setAmount(new BigDecimal(1)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 获取当前币种最新价 | 
|---|
|  |  |  | BigDecimal newestPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol))); | 
|---|
|  |  |  | // 获取当日k线的开盘价 | 
|---|
|  |  |  | 
|---|
|  |  |  | homeSymbolsVo.setSymbol(symbol); | 
|---|
|  |  |  | homeSymbolsVo.setCurrentPrice(newestPrice); | 
|---|
|  |  |  | homeSymbolsVo.setUpOrDown(upOrDown); | 
|---|
|  |  |  | homeSymbolsVo.setVolume(symbolObject.getVolume()); | 
|---|
|  |  |  | homeSymbolsVo.setVolume(symbolObject.getAmount()); | 
|---|
|  |  |  | if (cnyUsdtExchange != null) { | 
|---|
|  |  |  | BigDecimal cnyPrice = openPrice.multiply(cnyUsdtExchange.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP); | 
|---|
|  |  |  | BigDecimal cnyPrice = newestPrice.multiply(cnyUsdtExchange.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP); | 
|---|
|  |  |  | homeSymbolsVo.setCnyPrice(cnyPrice); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return homeSymbolsVo; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Result findKlineDetails(KlineDetailDto klineDetailDto) { | 
|---|
|  |  |  | String key = "KINE_{}_{}"; | 
|---|
|  |  |  | // 币币k线数据 | 
|---|
|  |  |  | if (AppContants.HOME_SYMBOLS_COIN == klineDetailDto.getType()) { | 
|---|
|  |  |  | key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod()); | 
|---|
|  |  |  | // 合约k线数据 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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("获取数据失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|