From d42e4981a19b93a3291da551a776eccc090156cd Mon Sep 17 00:00:00 2001 From: zhangjian Date: Thu, 11 Apr 2024 10:25:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3:=201=20ref?= =?UTF-8?q?initiv=E6=95=B0=E6=8D=AE=E6=BA=90=E8=8E=B7=E5=8F=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E8=AF=A6=E6=83=85=E4=BF=A1=E6=81=AF;2=20refinitiv?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E8=8E=B7=E5=8F=96=E8=82=A1=E7=A5=A8?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=88=97=E8=A1=A8;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/dto/RetifiveStockInfo.java | 59 ++++++-- .../cn/stock/market/utils/RefinitivUtil.java | 134 ++++++++++++++++++ .../market/web/RefinitivApiController.java | 82 +++++++++++ 3 files changed, 261 insertions(+), 14 deletions(-) create mode 100644 src/main/java/cn/stock/market/utils/RefinitivUtil.java create mode 100644 src/main/java/cn/stock/market/web/RefinitivApiController.java diff --git a/src/main/java/cn/stock/market/dto/RetifiveStockInfo.java b/src/main/java/cn/stock/market/dto/RetifiveStockInfo.java index 74bd892..73cfb67 100644 --- a/src/main/java/cn/stock/market/dto/RetifiveStockInfo.java +++ b/src/main/java/cn/stock/market/dto/RetifiveStockInfo.java @@ -1,5 +1,7 @@ package cn.stock.market.dto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Builder; import lombok.Data; @@ -13,21 +15,50 @@ import lombok.Data; * RetifiveStockInfo类用于存储股票信息。 * 该类包含了股票的基本信息和交易数据。 */ +@ApiModel("RefinitivStockInfo") public class RetifiveStockInfo { - private String stockCode; // 股票代码 - private String symbol; // 交易代码 - private String stockName; // 股票名称 - private String stockType; // 股票类型 - private String currentPrice; // 当前价格 - private String changePercent; // 变动百分比 - private String changeValue; //变动值 - private String openPrice; // 开盘价格 - private String previousPrice; // 昨日收盘价格 - private String volume; // 成交量 - private String highPrice; // 最高价格 - private String lowPrice; // 最低价格 - private String week52HighPrice; // 52周最高价格 - private String week52LowPrice; // 52周最低价格 + @ApiModelProperty("股票代码") + private String stockCode; + + @ApiModelProperty("交易代码") + private String symbol; + + @ApiModelProperty("股票名称") + private String stockName; + + @ApiModelProperty("股票类型") + private String stockType; + + @ApiModelProperty("当前价格") + private String currentPrice; + + @ApiModelProperty("变动百分比") + private String changePercent; + @ApiModelProperty("变动值") + private String changeValue; + + @ApiModelProperty("开盘价格") + private String openPrice; + + @ApiModelProperty("昨日收盘价格") + private String previousPrice; + + @ApiModelProperty("成交量") + private String volume; + + @ApiModelProperty("最高价格") + private String highPrice; + + @ApiModelProperty("最低价格") + private String lowPrice; + + @ApiModelProperty("52周最高价格") + private String week52HighPrice; + + @ApiModelProperty("52周最低价格") + private String week52LowPrice; + + @ApiModelProperty("股票当前的交易状态: 1-表示退市Closed, 2-Opening Auction, 3-Continuous Trading, 15-Intra-day Close (scheduled)") private String status; } diff --git a/src/main/java/cn/stock/market/utils/RefinitivUtil.java b/src/main/java/cn/stock/market/utils/RefinitivUtil.java new file mode 100644 index 0000000..a310bbf --- /dev/null +++ b/src/main/java/cn/stock/market/utils/RefinitivUtil.java @@ -0,0 +1,134 @@ +package cn.stock.market.utils; + +import cn.stock.market.dto.RetifiveStockInfo; +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 java.util.Iterator; + +/** + * RefinitivUtil + * Refinitiv数据解析工具 + * + * @author jnerh + * @since 2024/04/11 10:20 + */ +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";//印度国家交易所 + } + } + } + } + return RetifiveStockInfo.builder() + .stockCode(stockCode).stockName(stockName).symbol(name).status(status) + .openPrice(openPrice).currentPrice(price).highPrice(high).lowPrice(low) + .previousPrice(previousPrice).changePercent(percentChange).volume(volume) + .week52HighPrice(week52High).week52LowPrice(week52Low).stockType(stockType) + .changeValue(changeValue) + .build(); + } +} diff --git a/src/main/java/cn/stock/market/web/RefinitivApiController.java b/src/main/java/cn/stock/market/web/RefinitivApiController.java new file mode 100644 index 0000000..62ee306 --- /dev/null +++ b/src/main/java/cn/stock/market/web/RefinitivApiController.java @@ -0,0 +1,82 @@ +package cn.stock.market.web; + +import cn.stock.market.dto.RetifiveStockInfo; +import cn.stock.market.listener.AppClient; +import cn.stock.market.utils.RefinitivUtil; +import cn.stock.market.utils.ServerResponse; +import cn.stock.market.web.annotations.EncryptFilter; +import com.google.common.collect.Lists; +import com.thomsonreuters.ema.access.DataType; +import com.thomsonreuters.ema.access.RefreshMsg; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author Administrator + */ +@RestController +@Api(value = "/RefinitivApiController", tags = "Refinitiv股票行情") +@Slf4j +@RequestMapping("/api/market/refinitiv") +public class RefinitivApiController { + + + @Resource + private AppClient appClient; + + @ApiOperation(value = "股票详情信息", httpMethod = "GET", response = RetifiveStockInfo.class) + @ApiImplicitParams({@ApiImplicitParam(name = "symbol", value = "symbol值")}) + @GetMapping("/getStockDetail") + @EncryptFilter(decryptRequest = false) + public ServerResponse getStockDetail(String symbol) { + // 计算每个线程应处理的元素数量 + try { + appClient.subscribe(symbol); + // 等待消息, 设置超时时间,例如10秒 + RefreshMsg refreshMsg = appClient.getMessageFuture().get(10, TimeUnit.SECONDS); + if (DataType.DataTypes.FIELD_LIST == refreshMsg.payload().dataType()) { + RetifiveStockInfo retifiveStockInfo = RefinitivUtil.decodeData(refreshMsg.payload().fieldList(), refreshMsg.name()); + return ServerResponse.createBySuccess("操作成功", retifiveStockInfo); + } + } catch (Exception e) { + log.error("获取股票详情link:" + symbol, e); + } + + return ServerResponse.createBySuccess("操作成功"); + } + + @ApiOperation(value = "股票详情列表", httpMethod = "GET", response = RetifiveStockInfo.class) + @ApiImplicitParams({@ApiImplicitParam(name = "symbol", value = "symbol值, 多个时以英文逗号分隔")}) + @GetMapping("/getStockDetailList") + @EncryptFilter(decryptRequest = false) + public ServerResponse getStockDetailList(String symbol) { + // 计算每个线程应处理的元素数量 + String[] itemNames = symbol.split(","); + List list = Lists.newArrayList(); + for (String name : itemNames) { + try { + appClient.subscribe(name); + // 等待消息, 设置超时时间,例如10秒 + RefreshMsg refreshMsg = appClient.getMessageFuture().get(10, TimeUnit.SECONDS); + if (DataType.DataTypes.FIELD_LIST == refreshMsg.payload().dataType()) { + RetifiveStockInfo retifiveStockInfo = RefinitivUtil.decodeData(refreshMsg.payload().fieldList(), refreshMsg.name()); + list.add(retifiveStockInfo); + } + } catch (Exception e) { + log.error("获取股票详情link:" + name, e); + } + } + return ServerResponse.createBySuccess("操作成功", list); + + } +}