From 0696f91ef849e7c02de74c5ec59ce6ea75be4a71 Mon Sep 17 00:00:00 2001 From: zhangjian Date: Tue, 23 Apr 2024 09:51:44 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=BF=87=E6=BB=A4RetifiveStockInfo?= =?UTF-8?q?=E4=B8=AD=E7=9A=84(blank=20data)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/stock/market/utils/RefinitivUtil.java | 24 ++++++++++++++++++- .../market/web/RefinitivApiController.java | 13 ++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/stock/market/utils/RefinitivUtil.java b/src/main/java/cn/stock/market/utils/RefinitivUtil.java index b44b2d2..a7d20c7 100644 --- a/src/main/java/cn/stock/market/utils/RefinitivUtil.java +++ b/src/main/java/cn/stock/market/utils/RefinitivUtil.java @@ -6,7 +6,10 @@ import com.thomsonreuters.ema.access.DataType; import com.thomsonreuters.ema.access.FieldEntry; import com.thomsonreuters.ema.access.FieldList; import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ReflectionUtils; +import java.lang.reflect.Field; +import java.util.Arrays; import java.util.Iterator; import java.util.List; @@ -125,13 +128,14 @@ public class RefinitivUtil { } } } - return RetifiveStockInfo.builder() + 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 handleBlandData(retifiveStockInfo); } @@ -261,6 +265,24 @@ public class RefinitivUtil { .volume(volume).week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType).change(changeValue) .build(); + return handleBlandData(retifiveStockInfo); + } + + private static RetifiveStockInfo handleBlandData(RetifiveStockInfo retifiveStockInfo) { + Field[] fields = retifiveStockInfo.getClass().getDeclaredFields(); + Arrays.stream(fields).forEach(field -> { + ReflectionUtils.makeAccessible(field); + try { + Object obj = field.get(retifiveStockInfo); + if (obj instanceof String) { + String objStr = (String) obj; + field.set(retifiveStockInfo, objStr.replace("(blank data)", "")); + } + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + return retifiveStockInfo; } } diff --git a/src/main/java/cn/stock/market/web/RefinitivApiController.java b/src/main/java/cn/stock/market/web/RefinitivApiController.java index 5a2a868..4d7f99e 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.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.stock.market.domain.basic.entity.RetifiveStock; import cn.stock.market.domain.basic.service.RetifiveStockService; @@ -108,6 +109,10 @@ public class RefinitivApiController { RefreshMsg refreshMsg = appClient.getMessageFuture().get(10, TimeUnit.SECONDS);// 设置超时时间,例如10秒 if (DataType.DataTypes.FIELD_LIST == refreshMsg.payload().dataType()) { List strings = RefinitivUtil.decode(refreshMsg.payload().fieldList()); + if (CollUtil.isEmpty(strings)) { + return ServerResponse.createBySuccess("操作成功", list); + } + appClient.subscribeList(strings); // 根据itemName订阅 // 等待消息 List refreshMsgs = appClient.getMessagesFuture().get(10, TimeUnit.SECONDS); @@ -137,6 +142,10 @@ public class RefinitivApiController { RefreshMsg refreshMsg = appClient.getMessageFuture().get(10, TimeUnit.SECONDS);// 设置超时时间,例如10秒 if (DataType.DataTypes.FIELD_LIST == refreshMsg.payload().dataType()) { List strings = RefinitivUtil.decode(refreshMsg.payload().fieldList()); + if (CollUtil.isEmpty(strings)) { + return ServerResponse.createBySuccess("操作成功", list); + } + appClient.subscribeList(strings); // 根据itemName订阅 // 等待消息 List refreshMsgs = appClient.getMessagesFuture().get(10, TimeUnit.SECONDS); @@ -167,6 +176,10 @@ public class RefinitivApiController { RefreshMsg refreshMsg = appClient.getMessageFuture().get(10, TimeUnit.SECONDS);// 设置超时时间,例如10秒 if (DataType.DataTypes.FIELD_LIST == refreshMsg.payload().dataType()){ List strings = RefinitivUtil.decode(refreshMsg.payload().fieldList()); + if (CollUtil.isEmpty(strings)) { + return ServerResponse.createBySuccess("操作成功", list); + } + appClient.subscribeList(strings); // 根据itemName订阅 // 等待消息 List refreshMsgs = appClient.getMessagesFuture().get(10, TimeUnit.SECONDS); From cb96479bce65c3a8d8df3c93103b54811baa2969 Mon Sep 17 00:00:00 2001 From: zhangjian Date: Tue, 23 Apr 2024 14:49:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Refinitiv=E6=9C=AA=E5=BC=80=E7=9B=98?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=B0=86=E5=BD=93=E5=89=8D=E4=BB=B7=E8=AE=BE?= =?UTF-8?q?=E4=B8=BA=E6=98=A8=E6=97=A5=E6=94=B6=E7=9B=98=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/stock/market/utils/RefinitivUtil.java | 101 +++++++++++------- 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/src/main/java/cn/stock/market/utils/RefinitivUtil.java b/src/main/java/cn/stock/market/utils/RefinitivUtil.java index a7d20c7..15ad1d2 100644 --- a/src/main/java/cn/stock/market/utils/RefinitivUtil.java +++ b/src/main/java/cn/stock/market/utils/RefinitivUtil.java @@ -5,6 +5,7 @@ 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; @@ -20,6 +21,7 @@ import java.util.List; * @author jnerh * @since 2024/04/11 10:20 */ +@Slf4j public class RefinitivUtil { public static RetifiveStockInfo decodeData(FieldList fieldList, String name) { @@ -135,17 +137,17 @@ public class RefinitivUtil { .week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType) .change(changeValue) .build(); - return handleBlandData(retifiveStockInfo); + 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")){ + for (FieldEntry fieldEntry : fieldList) { + if (fieldEntry.name().startsWith("BR_LINK")) { nextLink = fieldEntry.load().toString(); - if(!nextLink.contains("blank data")){ + if (!nextLink.contains("blank data")) { list.add(nextLink); } } @@ -163,112 +165,111 @@ public class RefinitivUtil { String openPrice = ""; String previousPrice = ""; String percentChange = ""; - String week52High =""; + String week52High = ""; String week52Low = ""; String high = ""; String low = ""; String volume = "";//实时交易数量 String stockType = ""; String changeValue = ""; - while (iter.hasNext()) - { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + if (fieldEntry.name().equals("RDN_EXCHID")) { + if (fieldEntry.loadType() == DataType.DataTypes.ENUM) { stockType = fieldEntry.load().toString(); - if(StringUtils.equals(stockType,"145")){ + if (StringUtils.equals(stockType, "145")) { stockType = "bse";//孟买国家交易所 - }else if(StringUtils.equals(stockType,"147")){ + } else if (StringUtils.equals(stockType, "147")) { stockType = "nse";//印度国家交易所 } } } } - RetifiveStockInfo retifiveStockInfo = RetifiveStockInfo.builder().stockCode(stockCode).stockName(stockName).symbol(name).status(status) + 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 handleBlandData(retifiveStockInfo); + return handleData(retifiveStockInfo); } - private static RetifiveStockInfo handleBlandData(RetifiveStockInfo retifiveStockInfo) { + private static RetifiveStockInfo handleData(RetifiveStockInfo retifiveStockInfo) { Field[] fields = retifiveStockInfo.getClass().getDeclaredFields(); Arrays.stream(fields).forEach(field -> { ReflectionUtils.makeAccessible(field); @@ -279,10 +280,28 @@ public class RefinitivUtil { field.set(retifiveStockInfo, objStr.replace("(blank data)", "")); } } catch (IllegalAccessException e) { - throw new RuntimeException(e); + log.error("Refinitiv数据源处理数据出错,", e); } }); + // 未开盘时,将当前价设为昨日收盘价 + try { + Field statusField = retifiveStockInfo.getClass().getDeclaredField("status"); + ReflectionUtils.makeAccessible(statusField); + Object obj = statusField.get(retifiveStockInfo); + if (obj instanceof String) { + String objStr = (String) obj; + if (StringUtils.equals(objStr, "1")) { + Field lastPriceField = retifiveStockInfo.getClass().getDeclaredField("lastPrice"); + Field previousPriceField = retifiveStockInfo.getClass().getDeclaredField("previousPrice"); + ReflectionUtils.makeAccessible(previousPriceField); + ReflectionUtils.makeAccessible(lastPriceField); + lastPriceField.set(retifiveStockInfo, previousPriceField.get(retifiveStockInfo)); + } + } + } catch (Exception e) { + log.error("Refinitiv数据源获取status出错,", e); + } return retifiveStockInfo; } }