From a3d67de3175104103f43331dc575be34b44d3083 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Tue, 23 Sep 2025 20:08:48 +0800
Subject: [PATCH] 涨幅比计算

---
 trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java                 |    5 ++
 trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalService.java     |    2 
 trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java                   |    6 ++-
 trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalListService.java |    4 +-
 trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java          |    4 ++
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java           |    2 
 trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBService.java          |    7 +++
 trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java      |   63 +++++++++++++++++++++++++++++++
 trading-order-common/src/main/java/com/yami/trading/common/constants/RedisKeys.java                |    1 
 9 files changed, 86 insertions(+), 8 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java b/trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java
index 6e3de08..ad1bb9c 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java
@@ -12,6 +12,7 @@
 import com.yami.trading.common.web.ResultObject;
 import com.yami.trading.huobi.data.AdjustmentValueCache;
 import com.yami.trading.huobi.data.DataCache;
+import com.yami.trading.huobi.data.internal.DataDBService;
 import com.yami.trading.service.item.ItemService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +31,8 @@
 public class RealtimePushJob implements Runnable {
     @Autowired
     private ItemService itemService;
+    @Autowired
+    DataDBService dataDBService;
 
     public void start() {
         new Thread(this, "realtimePushJob").start();
@@ -114,7 +117,7 @@
         map.put("timestamp", realtime.getTs());
         map.put("current_time", realtime.getCurrentTime());
         map.put("name", realtime.getName());
-        map.put("change_ratio", realtime.getChangeRatio());
+        map.put("change_ratio", dataDBService.getChangeRatio(realtime, symbol));
         map.put("netChange", realtime.getNetChange());
         map.put("open", realtime.getOpen());
         map.put("close", realtime.getClose());
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
index 4f12551..938455d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
@@ -160,7 +160,7 @@
 
             if (CollectionUtil.isNotEmpty(realtimes)) {
                 Realtime realtime = realtimes.get(0);
-                symbolDTO.setChangeRatio(realtime.getChangeRatio());
+                symbolDTO.setChangeRatio(realtime.getChangeRatio2());
                 symbolDTO.setAmount(realtime.getAmount());
                 symbolDTO.setVolume(realtime.getVolume());
                 symbolDTO.setClose(realtime.getClose());
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
index db84229..e46f471 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
@@ -12,6 +12,7 @@
 import com.yami.trading.common.util.StringUtils;
 import com.yami.trading.common.web.ResultObject;
 import com.yami.trading.huobi.data.DataCache;
+import com.yami.trading.huobi.data.internal.DataDBService;
 import com.yami.trading.service.data.DataService;
 import com.yami.trading.service.item.ItemService;
 import io.swagger.annotations.Api;
@@ -49,6 +50,8 @@
 	private DataService dataService;
 	@Autowired
 	private ItemService itemService;
+	@Autowired
+	DataDBService dataDBService;
 
 	@ApiOperation(value = "行情")
 	@GetMapping(HOBI + "getRealtime.action")
@@ -81,6 +84,7 @@
 					d.setAmount(d.getAmount().setScale(2, RoundingMode.HALF_UP));
 				}
 				d.setSymbolData(bySymbol.getSymbolData());
+				d.setChangeRatio(dataDBService.getChangeRatio(d, d.getSymbol()));
 			});
 
 			List<Realtime> result = new ArrayList<>();
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java b/trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java
index 53a008f..9b508c1 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java
@@ -89,6 +89,7 @@
      */
     @TableField(exist = false)
     @ApiModelProperty("涨跌幅")
+    @JSONField(name = "changeRatio")
     private BigDecimal changeRatio;
 
     /**
@@ -167,7 +168,8 @@
         return 0;
     }
 
-    public BigDecimal getChangeRatio() {
+
+    public BigDecimal getChangeRatio2() {
         if (BigDecimal.ZERO.compareTo(open) == 0) {
             return BigDecimal.ZERO;
 
@@ -180,7 +182,7 @@
     }
 
     public BigDecimal getNetChange() {
-        BigDecimal netChange = close.multiply(getChangeRatio()).divide(new BigDecimal(100), 10, RoundingMode.HALF_UP);
+        BigDecimal netChange = close.multiply(getChangeRatio2()).divide(new BigDecimal(100), 10, RoundingMode.HALF_UP);
         netChange = netChange.setScale(4, RoundingMode.DOWN);
         return netChange;
     }
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/constants/RedisKeys.java b/trading-order-common/src/main/java/com/yami/trading/common/constants/RedisKeys.java
index d050cb8..6feef0f 100644
--- a/trading-order-common/src/main/java/com/yami/trading/common/constants/RedisKeys.java
+++ b/trading-order-common/src/main/java/com/yami/trading/common/constants/RedisKeys.java
@@ -275,4 +275,5 @@
 
 	public final static String SYMBOL_AMOUNT_VOLUME = "SYMBOL_AMOUNT_VOLUME_";
 
+	public final static String REAL_TIME_BEFORE = "REAL_TIME_BEFORE";
 }
diff --git a/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBService.java b/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBService.java
index 4c9f281..6bf7ae7 100644
--- a/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBService.java
+++ b/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBService.java
@@ -3,6 +3,7 @@
 
 import com.yami.trading.bean.data.domain.Realtime;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface DataDBService {
@@ -15,6 +16,11 @@
 	 * 数据库最新的实时价格
 	 */
 	public Realtime get(String symbol);
+
+	/**
+	 * 数据库前一天最后价格
+	 */
+	public Realtime getBefore(String symbol);
 
 	/**
 	 * 批量保存
@@ -34,4 +40,5 @@
 	 */
 	List<Realtime> listRealTime60s(String symbol);
 
+	public BigDecimal getChangeRatio(Realtime realtime, String symbol);
 }
diff --git a/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java b/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
index 9b67b14..35ef3ca 100644
--- a/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
+++ b/trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/DataDBServiceImpl.java
@@ -2,9 +2,12 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.trading.bean.data.domain.Kline;
 import com.yami.trading.bean.data.domain.Realtime;
+import com.yami.trading.bean.item.domain.Item;
 import com.yami.trading.common.config.RequestDataHelper;
 import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.constants.RedisKeys;
 import com.yami.trading.common.util.DateUtils;
 import com.yami.trading.huobi.data.DataCache;
 import com.yami.trading.huobi.data.job.RealtimeQueue;
@@ -13,11 +16,14 @@
 import com.yami.trading.service.syspara.SysparaService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.*;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -34,6 +40,8 @@
     private RealtimeService realtimeService;
     @Autowired
     private JdbcTemplate jdbcTemplate;
+    @Autowired
+    RedisTemplate redisTemplate;
 
     @Override
     public void saveAsyn(Realtime realtime) {
@@ -86,6 +94,44 @@
         RequestDataHelper.clear();
         return realtime;
 
+    }
+
+    @Override
+    public Realtime getBefore(String symbol) {
+        Realtime realtime = (Realtime) redisTemplate.opsForValue().get(RedisKeys.REAL_TIME_BEFORE + symbol);
+        if (realtime != null) {
+            long ts = realtime.getTs();
+            // 1. 确定时间戳单位(假设ts是毫秒级,若为秒级需用ofEpochSecond())
+            Instant instant = Instant.ofEpochMilli(ts);
+
+            // 2. 将时间戳转换为当地时区的日期(指定时区更准确,如Asia/Shanghai)
+            LocalDate tsDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
+
+            // 3. 获取“昨天的日期”(当前日期减1天)
+            LocalDate yesterday = LocalDate.now(ZoneId.of("Asia/Shanghai")).minusDays(1);
+
+            // 4. 判断是否为昨天
+             boolean isYesterday = tsDate.equals(yesterday);
+             if (isYesterday) {
+                 return realtime;
+             }
+        }
+        // 没缓存重新保存
+        // 计算当天0点的时间戳(毫秒级)
+        LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+        long todayStartTime = todayStart.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        RequestDataHelper.set("symbol", symbol);
+        LambdaQueryWrapper<Realtime> queryWrapper = new LambdaQueryWrapper<Realtime>()
+                .eq(Realtime::getSymbol, symbol)
+                .lt(Realtime::getTs, todayStartTime)
+                .orderByDesc(Realtime::getTs)
+                .last("LIMIT 1");
+        realtime = realtimeService.getBaseMapper().selectOne(queryWrapper);
+        RequestDataHelper.clear();
+        if (realtime != null) {
+            redisTemplate.opsForValue().set(RedisKeys.REAL_TIME_BEFORE + symbol, realtime);
+        }
+        return realtime;
     }
 
     public void deleteRealtime(int days) {
@@ -142,5 +188,20 @@
         return realtimes;
     }
 
-
+    @Override
+    public BigDecimal getChangeRatio(Realtime realtime, String symbol) {
+        Item item = itemService.findBySymbol(symbol);
+        if (item.getType().equals(Item.cryptos) && (item.getCurrencyType() != null && item.getCurrencyType() == 1)) {
+            Realtime realtimeBefore = getBefore(symbol);
+            if (realtimeBefore == null) {
+                return  BigDecimal.ZERO;
+            }
+            BigDecimal open = realtimeBefore.getClose();
+            BigDecimal changeRatio = realtime.getClose().subtract(open).divide(open, 10, RoundingMode.HALF_UP);
+            changeRatio = changeRatio.multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN);
+            return changeRatio;
+        } else {
+            return realtime.getChangeRatio2();
+        }
+    }
 }
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalListService.java b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalListService.java
index b6d1759..24bdc76 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalListService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalListService.java
@@ -97,7 +97,7 @@
             dto.setName(itemService.findBySymbol(dto.getSymbol()).getName());
             Realtime realtime = dataService.realtime(dto.getSymbol()).get(0);
             dto.setClose(realtime.getClose());
-            dto.setChangeRatio(realtime.getChangeRatio());
+            dto.setChangeRatio(realtime.getChangeRatio2());
             dto.setTurnoverRate(realtime.getTurnoverRate());
             dto.setVolumeRatio(realtime.getVolumeRatio());
             allSymbos.add(dto.getSymbol());
@@ -128,7 +128,7 @@
 
             // 设置 DTO 属性
             dto.setClose(realtime.getClose());
-            dto.setChangeRatio(realtime.getChangeRatio());
+            dto.setChangeRatio(realtime.getChangeRatio2());
             dto.setTurnoverRate(realtime.getTurnoverRate());
             dto.setVolumeRatio(realtime.getVolumeRatio());
 
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalService.java b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalService.java
index 0617c0a..f26c8a8 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemUserOptionalService.java
@@ -72,7 +72,7 @@
             if(!CollectionUtil.isEmpty(realtimes)){
                 Realtime realtime = realtimes.get(0);
                 dto.setClose(realtime.getClose());
-                dto.setChangeRatio(realtime.getChangeRatio());
+                dto.setChangeRatio(realtime.getChangeRatio2());
                 dto.setTurnoverRate(realtime.getTurnoverRate());
                 dto.setVolumeRatio(realtime.getVolumeRatio());
             }else{

--
Gitblit v1.9.3