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<Stock>().eq("stock_code", stockCode));
|
StockSetting stockSetting = stockSettingMapper.selectOne(new QueryWrapper<StockSetting>().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<String, Object> stringObjectMap = jsonToMap(s);
|
return new BigDecimal(stringObjectMap.get("last").toString()).multiply(new BigDecimal(stockSetting.getPrice()));
|
}
|
}
|
}
|
}
|
|
String s = doPost(stock.getStockCode());
|
if (null != s) {
|
Map<String, Object> stringObjectMap = jsonToMap(s);
|
return new BigDecimal(stringObjectMap.get("last").toString());
|
}
|
return BigDecimal.ZERO;
|
}
|
|
@Override
|
public Map<String, Object> getNewStock(String stockCode) {
|
Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", stockCode));
|
String s = doPost(stock.getStockCode());
|
if (null != s) {
|
Map<String, Object> stringObjectMap = jsonToMap(s);
|
return stringObjectMap;
|
}
|
return null;
|
}
|
|
|
public static Map<String, Object> 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<String, Object> 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<Stock>().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<Stock>().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;
|
}
|
}
|