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 |  121 +++++++++++++++++++++++++++++++++++++---
 1 files changed, 112 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/StockServiceImpl.java b/src/main/java/com/nq/service/impl/StockServiceImpl.java
index 8aa097d..5312551 100644
--- a/src/main/java/com/nq/service/impl/StockServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -1,5 +1,8 @@
 package com.nq.service.impl;
 
+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;
@@ -32,7 +35,9 @@
 
 import java.lang.reflect.Type;
 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;
@@ -79,6 +84,12 @@
 
     @Autowired
     StockConfigMapper stockConfigMapper;
+
+    @Resource
+    StockSettingMapper stockSettingMapper;
+
+    @Autowired
+    IStockService iStockService;
 
     public ServerResponse getMarket() {
         String market_url = PropertiesUtil.getProperty("sina.market.url");
@@ -161,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);
@@ -720,25 +749,19 @@
                             .like(StockConfig::getCKey, EConfigKey.INDICES.getCode()));
 
             List<DataStockBean> usDataStockBeans = Lists.newArrayList();
-            List<DataStockBean> hkDataStockBeans = Lists.newArrayList();
-            List<DataStockBean> inDataStockBeans = Lists.newArrayList();
-            List<DataStockBean> twDataStockBeans = Lists.newArrayList();
+            List<DataStockBean> jpDataStockBeans = Lists.newArrayList();
             // 创建Gson对象(全局复用,避免重复创建)
             Gson gson = new Gson();
 
             // 统一处理各地区股票数据
             processStockData(stockConfigList, EStockType.US.getCode(), usDataStockBeans, gson);
-            processStockData(stockConfigList, EStockType.HK.getCode(), hkDataStockBeans, gson);
-            processStockData(stockConfigList, EStockType.IN.getCode(), inDataStockBeans, gson);
-            processStockData(stockConfigList, EStockType.TW.getCode(), twDataStockBeans, gson);
+            processStockData(stockConfigList, EStockType.JP.getCode(), jpDataStockBeans, gson);
 
             // 组装返回结果
             Map<String, Object> resultMap = new HashMap<>();
             resultMap.put("newsList", newsList);                //新闻列表
             resultMap.put("usDataStockBeans", usDataStockBeans);//美国指数
-            resultMap.put("hkDataStockBeans", hkDataStockBeans);//香港指数
-            resultMap.put("inDataStockBeans", inDataStockBeans);//印度指数
-            resultMap.put("twDataStockBeans", twDataStockBeans);//台湾指数
+            resultMap.put("jpDataStockBeans", jpDataStockBeans);//日本指数
             return ServerResponse.createBySuccess(resultMap);
         } catch (Exception e){
             e.printStackTrace();
@@ -911,4 +934,84 @@
         }
         return ServerResponse.createByError();
     }
+
+    @Override
+    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 resultList;
+    }
+
+    /**
+     * 判断当前时间是否在指定时间范围内
+     * @param now 当前时间
+     * @param startTime 开始时间,完整的日期时间格式
+     * @param endTime 结束时间,完整的日期时间格式
+     * @return
+     */
+    private boolean isTimeInRange(Date now, String startTime, String endTime) {
+        try {
+            DateTime start = DateUtil.parseDateTime(startTime);
+            DateTime end = DateUtil.parseDateTime(endTime);
+            
+            // 判断当前时间是否在开始时间和结束时间之间
+            return now.after(start) && now.before(end);
+        } catch (Exception e) {
+            log.error("isTimeInRange error", e);
+            return false;
+        }
+    }
 }

--
Gitblit v1.9.3