From 2818327f844e65e1efc398271b7e4ebf9e8d8364 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Thu, 15 Jan 2026 18:44:53 +0800
Subject: [PATCH] 1

---
 src/main/java/com/nq/service/impl/StockServiceImpl.java |  137 +++++++++++++++++++++++++--------------------
 1 files changed, 77 insertions(+), 60 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/StockServiceImpl.java b/src/main/java/com/nq/service/impl/StockServiceImpl.java
index bf35ca2..5312551 100644
--- a/src/main/java/com/nq/service/impl/StockServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
@@ -36,6 +37,7 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -85,6 +87,9 @@
 
     @Resource
     StockSettingMapper stockSettingMapper;
+
+    @Autowired
+    IStockService iStockService;
 
     public ServerResponse getMarket() {
         String market_url = PropertiesUtil.getProperty("sina.market.url");
@@ -167,6 +172,24 @@
         if (stockList.size() > 0) {
             stockListVOS.addAll(Objects.requireNonNull(StockApi.getStockReailTimes(stockList)));
         }
+
+
+        List<PremarketStockVO> premarketStock = iStockService.getPremarketStock();
+
+        Map<String, PremarketStockVO> stockMap = premarketStock.stream()
+                .collect(Collectors.toMap(
+                        PremarketStockVO::getCode,
+                        stock -> stock
+                ));
+
+        stockListVOS.forEach(f->{
+            PremarketStockVO p = stockMap.get(f.getCode());
+            if (ObjectUtil.isNotEmpty(p)){
+                f.setNowPrice(p.getPrice().toString());
+                f.setHcrate(p.getHcrate());
+                f.setHcrateP(p.getHcrateP());
+            }
+        });
 
         RPageInfo resultPageInfo = new RPageInfo();
         resultPageInfo.setList(stockListVOS);
@@ -913,69 +936,63 @@
     }
 
     @Override
-    public ServerResponse getPremarketStock() {
-        try {
-            List<StockSetting> stockSettings = stockSettingMapper.selectList(new QueryWrapper<>());
-            List<PremarketStockVO> resultList = new ArrayList<>();
-            
-            Date now = new Date();
-            
-            for (StockSetting setting : stockSettings) {
-                String startTime = setting.getStartTime();
-                String endTime = setting.getEndTime();
-                
-                // 判断当前时间是否在交易时间内(startTime和endTime是完整的日期时间格式)
-                if (isTimeInRange(now, startTime, endTime)) {
-                    Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", setting.getStockCode()));
-                    if (stock == null) {
-                        continue; // 股票不存在,跳过
-                    }
-                    
-                    // 先获取真实数据,用于获取前收盘价和当前价格
-                    StockRealTimeBean realTimeStock = RedisKeyUtil.getCacheRealTimeStock(stock);
-                    if (realTimeStock == null || realTimeStock.getPc() == null) {
-                        continue; // 无法获取真实数据,跳过
-                    }
-                    
-                    // 获取前收盘价和当前价格(last)
-                    BigDecimal prevClose = new BigDecimal(realTimeStock.getPc());
-                    BigDecimal last = new BigDecimal(realTimeStock.getLast());
-                    
-                    // 计算盘前价格(根据StockSetting配置)
-                    BigDecimal premarketPrice;
-                    if ("0".equals(setting.getType())) {
-                        // type=0: 直接指定价格
-                        premarketPrice = new BigDecimal(setting.getPrice());
-                    } else {
-                        // type=1: 百分比调价格,基于last计算
-                        premarketPrice = last.multiply(new BigDecimal(setting.getPrice()));
-                    }
-                    
-                    // 根据盘前价格计算涨跌幅 = (盘前价格 - 前收盘价) / 前收盘价
-                    BigDecimal hcrate = BigDecimal.ZERO;
-                    if (prevClose.compareTo(BigDecimal.ZERO) > 0) {
-                        hcrate = premarketPrice.subtract(prevClose)
-                                .divide(prevClose, 4, RoundingMode.HALF_UP);
-                    }
-                    
-                    // 格式化涨跌幅为带百分号的字符串
-                    String hcrateP = hcrate.multiply(new BigDecimal("100"))
-                            .setScale(2, RoundingMode.HALF_UP) + "%";
-                    
-                    PremarketStockVO vo = new PremarketStockVO();
-                    vo.setCode(setting.getStockCode());
-                    vo.setPrice(premarketPrice); // price返回盘前价格
-                    vo.setHcrate(hcrate);
-                    vo.setHcrateP(hcrateP);
-                    resultList.add(vo);
+    public List<PremarketStockVO> getPremarketStock() {
+
+        List<StockSetting> stockSettings = stockSettingMapper.selectList(new QueryWrapper<>());
+        List<PremarketStockVO> resultList = new ArrayList<>();
+
+        Date now = new Date();
+
+        for (StockSetting setting : stockSettings) {
+            String startTime = setting.getStartTime();
+            String endTime = setting.getEndTime();
+
+            // 判断当前时间是否在交易时间内(startTime和endTime是完整的日期时间格式)
+            if (isTimeInRange(now, startTime, endTime)) {
+                Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", setting.getStockCode()));
+                if (stock == null) {
+                    continue; // 股票不存在,跳过
                 }
+
+                // 获取真实数据,用于获取前收盘价(pc)
+                StockRealTimeBean realTimeStock = RedisKeyUtil.getCacheRealTimeStock(stock);
+                if (realTimeStock == null || realTimeStock.getPc() == null) {
+                    continue; // 无法获取真实数据,跳过
+                }
+
+                // 获取前收盘价(昨收)
+                BigDecimal prevClose = new BigDecimal(realTimeStock.getPc());
+
+                // 计算盘前价格(根据StockSetting配置)
+                BigDecimal premarketPrice;
+                if ("0".equals(setting.getType())) {
+                    // type=0: 直接指定价格
+                    premarketPrice = new BigDecimal(setting.getPrice());
+                } else {
+                    // type=1: 百分比调价格,基于昨收计算
+                    premarketPrice = prevClose.multiply(new BigDecimal(setting.getPrice()));
+                }
+
+                // 根据盘前价格和昨收计算涨跌幅 = (盘前价格 - 昨收) / 昨收
+                BigDecimal hcrate = BigDecimal.ZERO;
+                if (prevClose.compareTo(BigDecimal.ZERO) > 0) {
+                    hcrate = premarketPrice.subtract(prevClose)
+                            .divide(prevClose, 4, RoundingMode.HALF_UP);
+                }
+
+                // 格式化涨跌幅为带百分号的字符串
+                String hcrateP = hcrate.multiply(new BigDecimal("100"))
+                        .setScale(2, RoundingMode.HALF_UP) + "%";
+
+                PremarketStockVO vo = new PremarketStockVO();
+                vo.setCode(setting.getStockCode());
+                vo.setPrice(premarketPrice); // price返回盘前价格
+                vo.setHcrate(hcrate);
+                vo.setHcrateP(hcrateP);
+                resultList.add(vo);
             }
-            
-            return ServerResponse.createBySuccess(resultList);
-        } catch (Exception e) {
-            log.error("getPremarketStock error", e);
-            return ServerResponse.createByErrorMsg("查询盘前交易数据失败");
         }
+        return resultList;
     }
 
     /**

--
Gitblit v1.9.3