From fff9ac550c469aafa60ce8f1adff5edd6941f8e1 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Wed, 14 Jan 2026 15:29:01 +0800
Subject: [PATCH] 获取盘前交易列表
---
src/main/java/com/nq/service/impl/StockServiceImpl.java | 55 +++++++++++++++++++++++++++++++++++--------------------
src/main/java/com/nq/vo/stock/PremarketStockVO.java | 2 ++
2 files changed, 37 insertions(+), 20 deletions(-)
diff --git a/src/main/java/com/nq/service/impl/StockServiceImpl.java b/src/main/java/com/nq/service/impl/StockServiceImpl.java
index ed73412..c643a74 100644
--- a/src/main/java/com/nq/service/impl/StockServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -32,6 +32,7 @@
import java.lang.reflect.Type;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.annotation.Resource;
@@ -926,31 +927,45 @@
// 判断当前时间是否在交易时间内
if (isTimeInRange(currentTime, startTime, endTime)) {
- PremarketStockVO vo = new PremarketStockVO();
- vo.setCode(setting.getStockCode());
+ Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", setting.getStockCode()));
+ if (stock == null) {
+ continue; // 股票不存在,跳过
+ }
- // 计算价格
- BigDecimal price;
+ // 先获取真实价格(从Redis获取,不经过StockSetting计算)
+ String s = RedisKeyUtil.doPost(stock.getStockCode(), stock.getStockType());
+ if (s == null) {
+ continue; // 无法获取真实价格,跳过
+ }
+
+ Map<String, Object> stringObjectMap = RedisKeyUtil.jsonToMap(s);
+ BigDecimal realPrice = new BigDecimal(stringObjectMap.get("Last").toString());
+
+ // 计算盘前价格
+ BigDecimal premarketPrice;
if ("0".equals(setting.getType())) {
// type=0: 直接指定价格
- price = new BigDecimal(setting.getPrice());
+ premarketPrice = new BigDecimal(setting.getPrice());
} else {
- // type=1: 百分比调价格,需要获取当前价格
- Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", setting.getStockCode()));
- if (stock != null) {
- String s = RedisKeyUtil.doPost(stock.getStockCode(), stock.getStockType());
- if (s != null) {
- Map<String, Object> stringObjectMap = RedisKeyUtil.jsonToMap(s);
- BigDecimal currentPrice = new BigDecimal(stringObjectMap.get("Last").toString());
- price = currentPrice.multiply(new BigDecimal(setting.getPrice()));
- } else {
- continue; // 无法获取当前价格,跳过
- }
- } else {
- continue; // 股票不存在,跳过
- }
+ // type=1: 百分比调价格,基于真实价格计算
+ premarketPrice = realPrice.multiply(new BigDecimal(setting.getPrice()));
}
- vo.setPrice(price);
+
+ // 计算涨跌价格 = 盘前价格 - 真实价格
+ BigDecimal chg = premarketPrice.subtract(realPrice);
+
+ // 计算涨跌幅 = (盘前价格 - 真实价格) / 真实价格 * 100
+ BigDecimal chgPct = BigDecimal.ZERO;
+ if (realPrice.compareTo(BigDecimal.ZERO) > 0) {
+ chgPct = chg.divide(realPrice, 4, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal("100"));
+ }
+
+ PremarketStockVO vo = new PremarketStockVO();
+ vo.setCode(setting.getStockCode());
+ vo.setPrice(premarketPrice);
+ vo.setChg(chg);
+ vo.setChgPct(chgPct);
resultList.add(vo);
}
}
diff --git a/src/main/java/com/nq/vo/stock/PremarketStockVO.java b/src/main/java/com/nq/vo/stock/PremarketStockVO.java
index 38b4508..f1ee34d 100644
--- a/src/main/java/com/nq/vo/stock/PremarketStockVO.java
+++ b/src/main/java/com/nq/vo/stock/PremarketStockVO.java
@@ -7,5 +7,7 @@
public class PremarketStockVO {
private String code;
private BigDecimal price;
+ private BigDecimal chg;
+ private BigDecimal chgPct;
}
--
Gitblit v1.9.3