添加接口: 1 refinitiv数据源获取股票详情信息;2 refinitiv数据源获取股票详情列表;
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
134
src/main/java/cn/stock/market/utils/RefinitivUtil.java
Normal file
134
src/main/java/cn/stock/market/utils/RefinitivUtil.java
Normal file
@@ -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<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";//印度国家交易所
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -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<RetifiveStockInfo> 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);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user