package com.nq.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.nq.dao.StockDzMapper; import com.nq.dao.StockMapper; import com.nq.dao.StockSettingMapper; import com.nq.enums.EStockType; import com.nq.pojo.Stock; import com.nq.pojo.StockDz; import com.nq.pojo.StockRealTimeBean; import com.nq.pojo.StockSetting; import com.nq.service.IPriceServices; import com.nq.utils.PropertiesUtil; import com.nq.utils.redis.RedisKeyUtil; import com.nq.utils.timeutil.TimeUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; @Service public class PriceServicesImpl implements IPriceServices { @Resource StockSettingMapper stockSettingMapper; @Resource StockMapper stockMapper; @Resource StockDzMapper stockDZMapper; @Override public BigDecimal getNowPrice(String stockCode) { Stock stock = stockMapper.selectOne(new QueryWrapper().eq("stock_code",stockCode)); StockSetting stockSetting = stockSettingMapper.selectOne(new QueryWrapper().eq("stock_code",stockCode)); // if(stockSetting != null){ // if(TimeUtil.isTradingHour(stockSetting.getStartTime(),stockSetting.getEndTime())){ // if(stockSetting.getType().equals("0")){ // return new BigDecimal(stockSetting.getPrice()); // }else{ // StockRealTimeBean stockRealTimeBean = RedisKeyUtil.getCacheRealTimeStock(stock); // return new BigDecimal(stockRealTimeBean.getLast()).multiply(new BigDecimal(stockSetting.getPrice())); // } // } // } StockRealTimeBean stockRealTimeBean = RedisKeyUtil.getCacheRealTimeStock(stock); return new BigDecimal(stockRealTimeBean.getLast()); } public BigDecimal getBuyNowPrice(String stockCode,EStockType eStockType) { Stock stock = stockMapper.selectOne(new QueryWrapper().eq("stock_code",stockCode)); StockSetting stockSetting = stockSettingMapper.selectOne(new QueryWrapper().eq("stock_code",stockCode)); if(stockSetting != null){ if(TimeUtil.isTradingHour(stockSetting.getStartTime(),stockSetting.getEndTime())){ if(stockSetting.getType().equals("0")){ return new BigDecimal(stockSetting.getPrice()); }else{ String s = doGet(stock.getStockCode(),eStockType); if(null != s){ Map stringObjectMap = jsonToMap(s); return new BigDecimal(stringObjectMap.get("last").toString()).multiply(new BigDecimal(stockSetting.getPrice())); } } } } String s = doGet(stock.getStockCode(),eStockType); if(null != s) { Map stringObjectMap = jsonToMap(s); return new BigDecimal(stringObjectMap.get("last").toString()); } return BigDecimal.ZERO; } public static Map jsonToMap(String json) { ObjectMapper objectMapper = new ObjectMapper(); try { Object[] array = objectMapper.readValue(json, Object[].class); Gson gson = new Gson(); String s = gson.toJson(array[0]); Map map = objectMapper.readValue(s, Map.class); return map; } catch (JsonProcessingException e) { throw new RuntimeException(e); } } public String doGet(String pid,EStockType eStockType){ String apiUrl = ""; if("IN".equals(eStockType.getCode())){ String inNowHttpApi = PropertiesUtil.getProperty("IN_NOW_HTTP_API"); String inNowKey = PropertiesUtil.getProperty("IN_NOW_KEY"); apiUrl = inNowHttpApi+"stock?pid="+pid+"&key="+inNowKey; }else{ apiUrl = eStockType.getStockUrl()+"stock?pid="+pid+"&key="+eStockType.getStockKey(); } try { URL url = new URL(apiUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); return response.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public BigDecimal getNowPrice(String stockCode, String stockType) { EStockType eStockType = EStockType.getEStockTypeByCode(stockType); BigDecimal nowPrice = getBuyNowPrice(stockCode,eStockType); if (!stockType.equals("DZ")){ return nowPrice; } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("stock_code",stockCode); StockDz stockDz = stockDZMapper.selectOne(queryWrapper); if(stockDz == null){ return nowPrice;} return nowPrice.multiply(stockDz.getDiscount()); } }