From db434d3db2c5ec3ee22c7aaa5123d4f23b2a801b Mon Sep 17 00:00:00 2001 From: zhangjian Date: Thu, 9 May 2024 15:33:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Refinitiv=E8=82=A1=E7=A5=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/stock/market/utils/RefinitivUtil.java | 282 ++---------------- .../market/web/RefinitivApiController.java | 6 + 2 files changed, 37 insertions(+), 251 deletions(-) diff --git a/src/main/java/cn/stock/market/utils/RefinitivUtil.java b/src/main/java/cn/stock/market/utils/RefinitivUtil.java index d712697..0ededf9 100644 --- a/src/main/java/cn/stock/market/utils/RefinitivUtil.java +++ b/src/main/java/cn/stock/market/utils/RefinitivUtil.java @@ -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 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 decode(FieldList fieldList) { - List 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 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 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")) { diff --git a/src/main/java/cn/stock/market/web/RefinitivApiController.java b/src/main/java/cn/stock/market/web/RefinitivApiController.java index 337594f..fc38caf 100644 --- a/src/main/java/cn/stock/market/web/RefinitivApiController.java +++ b/src/main/java/cn/stock/market/web/RefinitivApiController.java @@ -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){