| package com.xcong.excoin.modules.exchange.service.impl; | 
|   | 
| import cn.hutool.core.util.StrUtil; | 
| import com.huobi.client.model.Candlestick; | 
| import com.xcong.excoin.modules.exchange.service.HandleKlineService; | 
| import com.xcong.excoin.processor.CoinProcessor; | 
| import com.xcong.excoin.processor.CoinProcessorFactory; | 
| import com.xcong.excoin.trade.ExchangeTrade; | 
| import com.xcong.excoin.utils.CoinTypeConvert; | 
| import com.xcong.excoin.utils.RedisUtils; | 
| import org.apache.commons.collections.CollectionUtils; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import javax.annotation.Resource; | 
| import java.math.BigDecimal; | 
| import java.util.Collection; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
| @Service | 
| public class HandleKlineServiceImpl implements HandleKlineService { | 
|   | 
|     @Resource | 
|     private CoinProcessorFactory processorFactory; | 
|   | 
|     @Resource | 
|     private RedisUtils redisUtils; | 
|   | 
|     @Override | 
|     public void handleExchangeOrderToKline(List<ExchangeTrade> trades) { | 
|         if (CollectionUtils.isEmpty(trades)) { | 
|             return; | 
|         } | 
|         String symbol = trades.get(0).getSymbol(); | 
|         String symbolUsdt = symbol; | 
|         if(!symbol.contains("USDT")){ | 
|             symbolUsdt = symbol+"/USDT"; | 
|         } | 
|         CoinProcessor processor = processorFactory.getProcessor(symbol); | 
|         Map<String, Candlestick> currentKlineMap = processor.getCurrentKlineMap(); | 
|         Collection<Candlestick> values = currentKlineMap.values(); | 
|         BigDecimal newPrice =null; | 
|         for (Candlestick candlestick : values) { | 
|             for (ExchangeTrade exchangeTrade : trades) { | 
|                 if(exchangeTrade==null){ | 
|                     continue; | 
|                 } | 
|                 processor.processTrade(candlestick, exchangeTrade); | 
|                 newPrice=exchangeTrade.getPrice(); | 
|             } | 
|         } | 
|         // 更新今日高地价 | 
|         BigDecimal min=BigDecimal.ZERO; | 
|         BigDecimal max=BigDecimal.ZERO; | 
|         BigDecimal vol = BigDecimal.ZERO; | 
|         for (ExchangeTrade exchangeTrade : trades) { | 
|             if(exchangeTrade==null){ | 
|                 continue; | 
|             } | 
|             if(min.compareTo(BigDecimal.ZERO)==0){ | 
|                 min = exchangeTrade.getPrice(); | 
|             }else{ | 
|                 min=exchangeTrade.getPrice().min(min); | 
|             } | 
|             max=exchangeTrade.getPrice().max(max); | 
|             vol=vol.add(exchangeTrade.getAmount()); | 
|         } | 
|         Object o = redisUtils.get(symbolUsdt); | 
|         if(o!=null){ | 
|             Candlestick today =   (Candlestick)o; | 
|             today.setVolume(today.getVolume()==null?BigDecimal.ZERO:today.getVolume()); | 
|             today.setHigh(today.getHigh().max(max)); | 
|             today.setLow(today.getLow().min(min)); | 
|             today.setVolume(today.getVolume().add(vol)); | 
|             redisUtils.set(symbolUsdt,today); | 
|         }else{ | 
|             Candlestick today =   new Candlestick(); | 
|             today.setClose(newPrice); | 
|             today.setLow(newPrice); | 
|             today.setHigh(newPrice); | 
|             today.setVolume(BigDecimal.ZERO); | 
|             today.setHigh(today.getHigh().max(max)); | 
|             today.setLow(today.getLow().min(min)); | 
|             today.setVolume(vol); | 
|             redisUtils.set(symbolUsdt,today); | 
|         } | 
|         // 存入redis,websocket去取 | 
|         String key = "NEW_KINE_{}"; | 
|         key = StrUtil.format(key, symbolUsdt); | 
|         redisUtils.set(key,currentKlineMap); | 
|         // 更新最新价 | 
|         if(newPrice!=null){ | 
|             redisUtils.set(CoinTypeConvert.convertToKey(symbolUsdt), newPrice); | 
|         } | 
|   | 
|     } | 
|   | 
| } |