package com.nq.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.nq.dao.StockDzMapper; import com.nq.dao.StockMapper; import com.nq.dao.StockSettingMapper; import com.nq.enums.EConfigKey; import com.nq.pojo.*; import com.nq.service.IPriceServices; import com.nq.service.IStockConfigServices; import com.nq.utils.PropertiesUtil; import com.nq.utils.http.HttpClientRequest; import com.nq.utils.redis.RedisKeyUtil; import com.nq.utils.timeutil.TimeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.*; import java.lang.reflect.Type; import java.math.BigDecimal; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.databind.ObjectMapper; @Service public class PriceServicesImpl implements IPriceServices { @Resource StockSettingMapper stockSettingMapper; @Resource StockMapper stockMapper; @Autowired IStockConfigServices iStockConfigServices; @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 { String s = doPost(stock.getStockCode()); if (null != s) { Map stringObjectMap = jsonToMap(s); return new BigDecimal(stringObjectMap.get("last").toString()).multiply(new BigDecimal(stockSetting.getPrice())); } } } } String s = doPost(stock.getStockCode()); if (null != s) { Map stringObjectMap = jsonToMap(s); return new BigDecimal(stringObjectMap.get("last").toString()); } return BigDecimal.ZERO; } @Override public Map getNewStock(String stockCode) { Stock stock = stockMapper.selectOne(new QueryWrapper().eq("stock_code", stockCode)); String s = doPost(stock.getStockCode()); if (null != s) { Map stringObjectMap = jsonToMap(s); return stringObjectMap; } return null; } 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 doPost(String pid) { try { String url = PropertiesUtil.getProperty("JP_HTTP_API") + "stock?version=v1&key=" + PropertiesUtil.getProperty("JP_KEY"); URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); String body = "pid=" + pid; OutputStream os = con.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(body); writer.flush(); writer.close(); os.close(); BufferedReader in = new BufferedReader(new InputStreamReader(con.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) { BigDecimal nowPrice = getNowPrice(stockCode); 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()); } @Override public boolean isLimitUpBuy(String stockCode) { Stock stock = stockMapper.selectOne(new QueryWrapper().eq("stock_code", stockCode)); StockRealTimeBean stockRealTimeBean = RedisKeyUtil.getCacheRealTimeStock(stock); BigDecimal pcp = new BigDecimal(stockRealTimeBean.getPcp()); StockConfig stockConfig = iStockConfigServices.queryByKey(EConfigKey.LIMIT_UP_POINT.getCode()); if (stockConfig == null) { return true; } if (pcp.compareTo(new BigDecimal(0)) < 0) { return true; } if (new BigDecimal(stockConfig.getCValue()).compareTo(pcp) <= 0) { StockConfig limitConfig = iStockConfigServices.queryByKey(EConfigKey.LIMIT_UP_IS_BUY.getCode()); if (limitConfig.getCValue().equals("1")) { return true; } return false; } return true; } @Override public boolean isLimitDownSell(String stockCode) { Stock stock = stockMapper.selectOne(new QueryWrapper().eq("stock_code", stockCode)); StockRealTimeBean stockRealTimeBean = RedisKeyUtil.getCacheRealTimeStock(stock); BigDecimal pcp = new BigDecimal(stockRealTimeBean.getPcp()); StockConfig stockConfig = iStockConfigServices.queryByKey(EConfigKey.LIMIT_DOWN_POINT.getCode()); if (stockConfig == null) { return true; } if (pcp.compareTo(new BigDecimal(stockConfig.getCValue())) <= 0) { StockConfig limitConfig = iStockConfigServices.queryByKey(EConfigKey.LIMIT_DOWN_IS_SELL.getCode()); if (!limitConfig.getCValue().equals("1")) { return false; } } return true; } }