优化Refinitiv股票代码解析
This commit is contained in:
@@ -5,9 +5,6 @@ import cn.stock.market.domain.basic.entity.RetifiveStock;
|
||||
import cn.stock.market.dto.RetifiveStockInfo;
|
||||
import cn.stock.market.lesg.InstrumentData;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.thomsonreuters.ema.access.DataType;
|
||||
import com.thomsonreuters.ema.access.FieldEntry;
|
||||
import com.thomsonreuters.ema.access.FieldList;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
@@ -15,7 +12,6 @@ import org.springframework.util.ReflectionUtils;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* RefinitivUtil
|
||||
@@ -27,250 +23,8 @@ import java.util.stream.Stream;
|
||||
@Slf4j
|
||||
public class RefinitivUtil {
|
||||
|
||||
public static RetifiveStockInfo decodeData(FieldList fieldList, String name) {
|
||||
Iterator<FieldEntry> iter = fieldList.iterator();
|
||||
FieldEntry fieldEntry;
|
||||
String stockName = "";
|
||||
String stockCode = "";
|
||||
String status = "";
|
||||
String price = "";
|
||||
String openPrice = "";
|
||||
String previousPrice = "";
|
||||
String percentChange = "";
|
||||
String week52High = "";
|
||||
String week52Low = "";
|
||||
String high = "";
|
||||
String low = "";
|
||||
String volume = "";//实时交易数量
|
||||
String stockType = "";
|
||||
String changeValue = "";
|
||||
while (iter.hasNext()) {
|
||||
fieldEntry = iter.next();
|
||||
System.out.println("Fid: " + fieldEntry.fieldId() + " Name: " + fieldEntry.name() + " Unit: " + DataType.asString(fieldEntry.loadType()) + " value: " + fieldEntry.load());
|
||||
if (fieldEntry.name().equals("DSPLY_NAME")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.RMTES) {
|
||||
stockName = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
if (fieldEntry.name().equals("PROV_SYMB")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.RMTES) {
|
||||
stockCode = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("INST_PHASE")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.ENUM) {
|
||||
status = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("OPEN_PRC")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
openPrice = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("HST_CLOSE")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
previousPrice = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("52WK_HIGH")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
week52High = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("52WK_LOW")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
week52Low = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("PCTCHNG")) { // NETCHNG_1
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
percentChange = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("NETCHNG_1")) { // NETCHNG_1
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
changeValue = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("HIGH_1")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
high = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("LOW_1")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
low = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
if (fieldEntry.name().equals("IRGVOL")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
volume = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("TRDPRC_1")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
price = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
if (fieldEntry.name().equals("RDN_EXCHID")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.ENUM) {
|
||||
stockType = fieldEntry.load().toString();
|
||||
if (org.apache.commons.lang3.StringUtils.equals(stockType, "145")) {
|
||||
stockType = "bse";//孟买国家交易所
|
||||
} else if (StringUtils.equals(stockType, "147")) {
|
||||
stockType = "nse";//印度国家交易所
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RetifiveStockInfo retifiveStockInfo = RetifiveStockInfo.builder()
|
||||
.stockCode(stockCode).stockName(stockName).symbol(name).status(status)
|
||||
.openPrice(openPrice).lastPrice(price).highPrice(high).lowPrice(low)
|
||||
.previousPrice(previousPrice).perchg(percentChange).volume(volume)
|
||||
.week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType)
|
||||
.change(changeValue)
|
||||
.build();
|
||||
return handleData(retifiveStockInfo);
|
||||
}
|
||||
|
||||
|
||||
public static List<String> decode(FieldList fieldList) {
|
||||
List<String> list = Lists.newArrayList();
|
||||
String nextLink = "";
|
||||
for (FieldEntry fieldEntry : fieldList) {
|
||||
if (fieldEntry.name().startsWith("BR_LINK")) {
|
||||
nextLink = fieldEntry.load().toString();
|
||||
if (!nextLink.contains("blank data")) {
|
||||
list.add(nextLink);
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static RetifiveStockInfo decode(FieldList fieldList, String name) {
|
||||
Iterator<FieldEntry> iter = fieldList.iterator();
|
||||
FieldEntry fieldEntry;
|
||||
String stockName = "";
|
||||
String stockCode = "";
|
||||
String status = "";
|
||||
String price = "";
|
||||
String openPrice = "";
|
||||
String previousPrice = "";
|
||||
String percentChange = "";
|
||||
String week52High = "";
|
||||
String week52Low = "";
|
||||
String high = "";
|
||||
String low = "";
|
||||
String volume = "";//实时交易数量
|
||||
String stockType = "";
|
||||
String changeValue = "";
|
||||
while (iter.hasNext()) {
|
||||
fieldEntry = iter.next();
|
||||
// System.out.println("Fid: " + fieldEntry.fieldId() + " Name: " + fieldEntry.name() +" Unit: "+DataType.asString(fieldEntry.loadType()) + " value: " + fieldEntry.load());
|
||||
if (fieldEntry.name().equals("DSPLY_NAME")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.RMTES) {
|
||||
stockName = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
if (fieldEntry.name().equals("PROV_SYMB")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.RMTES) {
|
||||
stockCode = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("INST_PHASE")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.ENUM) {
|
||||
status = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("OPEN_PRC")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
openPrice = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("HST_CLOSE")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
previousPrice = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("52WK_HIGH")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
week52High = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("52WK_LOW")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
week52Low = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("PCTCHNG")) { // NETCHNG_1
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
percentChange = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("NETCHNG_1")) { // NETCHNG_1
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
changeValue = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("HIGH_1")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
high = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("LOW_1")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
low = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
if (fieldEntry.name().equals("IRGVOL")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
volume = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldEntry.name().equals("TRDPRC_1")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.REAL) {
|
||||
price = fieldEntry.load().toString();
|
||||
}
|
||||
}
|
||||
if (fieldEntry.name().equals("RDN_EXCHID")) {
|
||||
if (fieldEntry.loadType() == DataType.DataTypes.ENUM) {
|
||||
stockType = fieldEntry.load().toString();
|
||||
if (StringUtils.equals(stockType, "145")) {
|
||||
stockType = "bse";//孟买国家交易所
|
||||
} else if (StringUtils.equals(stockType, "147")) {
|
||||
stockType = "nse";//印度国家交易所
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RetifiveStockInfo retifiveStockInfo = RetifiveStockInfo.builder().stockCode(stockCode).stockName(stockName).symbol(name).status(status)
|
||||
.openPrice(openPrice).lastPrice(price).highPrice(high).lowPrice(low).previousPrice(previousPrice).perchg(percentChange)
|
||||
.volume(volume).week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType).change(changeValue)
|
||||
.build();
|
||||
|
||||
return handleData(retifiveStockInfo);
|
||||
}
|
||||
public static final String BLANK_DATA = "(blank data)";
|
||||
public static final List<String> STOCK_CODE_FIELDS = Lists.newArrayList("EXCHCODE", "PROV_SYMB", "MNEMONIC", "SRC_SYMB");
|
||||
|
||||
private static RetifiveStockInfo handleData(RetifiveStockInfo retifiveStockInfo) {
|
||||
Field[] fields = retifiveStockInfo.getClass().getDeclaredFields();
|
||||
@@ -280,7 +34,7 @@ public class RefinitivUtil {
|
||||
Object obj = field.get(retifiveStockInfo);
|
||||
if (obj instanceof String) {
|
||||
String objStr = (String) obj;
|
||||
field.set(retifiveStockInfo, objStr.replace("(blank data)", ""));
|
||||
field.set(retifiveStockInfo, objStr.replace(BLANK_DATA, ""));
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
log.error("Refinitiv数据源处理数据出错,", e);
|
||||
@@ -316,7 +70,7 @@ public class RefinitivUtil {
|
||||
if (k.equals("DSPLY_NAME")) {
|
||||
stockInfo.setStockName(v);
|
||||
}
|
||||
if (k.equals("PROV_SYMB")) {
|
||||
if (StrUtil.isBlank(stockInfo.getStockCode()) && StrUtil.isNotBlank(parseStockCode(k, v))) {
|
||||
stockInfo.setStockCode(v);
|
||||
}
|
||||
if (k.equals("INST_PHASE")) {
|
||||
@@ -368,6 +122,32 @@ public class RefinitivUtil {
|
||||
return handleData(stockInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析股票代码
|
||||
*
|
||||
* @param k 字段名
|
||||
* @param v 字段值
|
||||
* @return 股票代码
|
||||
*/
|
||||
private static String parseStockCode(String k, String v) {
|
||||
if (isValidStockCode(k, v)) {
|
||||
return v;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为股票代码
|
||||
*
|
||||
* @param k 字段名
|
||||
* @param v 字段值
|
||||
* @return 是否为股票代码
|
||||
*/
|
||||
public static boolean isValidStockCode(String k, String v) {
|
||||
return STOCK_CODE_FIELDS.contains(k) && !StrUtil.contains(v, "blank data");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 解析为RetifiveStock
|
||||
@@ -382,7 +162,7 @@ public class RefinitivUtil {
|
||||
if (k.equals("DSPLY_NAME")) {
|
||||
stock.setStockName(v);
|
||||
}
|
||||
if (k.equals("PROV_SYMB")) {
|
||||
if (StrUtil.isBlank(stock.getStockCode()) && StrUtil.isNotBlank(parseStockCode(k, v))) {
|
||||
stock.setStockCode(v);
|
||||
}
|
||||
if (k.equals("RDN_EXCHID")) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package cn.stock.market.web;
|
||||
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.stock.market.domain.basic.entity.RetifiveStock;
|
||||
import cn.stock.market.domain.basic.service.RetifiveStockService;
|
||||
@@ -49,6 +50,11 @@ public class RefinitivApiController {
|
||||
public ServerResponse<?> getStockDetail(String symbol) {
|
||||
try {
|
||||
RetifiveStockInfo retifiveStockInfo = refinitivConsumer.getDetail(symbol);
|
||||
if (ObjUtil.isNull(retifiveStockInfo)) {
|
||||
log.error("该symbol = {} 未在数据源中查询到", symbol);
|
||||
return ServerResponse.createBySuccess("操作成功", null);
|
||||
}
|
||||
|
||||
//获取股票id
|
||||
RetifiveStock stock = retifiveStockService.repository().findBtStockByCoCode(symbol);
|
||||
if(stock != null){
|
||||
|
||||
Reference in New Issue
Block a user