Procházet zdrojové kódy

强势池历史趋势最高涨幅计算修改

Zhangbw před 1 měsícem
rodič
revize
c4f001ca61

+ 14 - 0
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/mapper/StockPoolHistoryMapper.java

@@ -60,4 +60,18 @@ public interface StockPoolHistoryMapper extends BaseMapperPlus<StockPoolHistory,
     BigDecimal selectForwardTenDaysHighestPrice(@Param("stockCode") String stockCode,
                                                 @Param("startDate") LocalDate startDate,
                                                 @Param("endDate") LocalDate endDate);
+
+    /**
+     * 查询向前N个交易日的日期列表
+     * 用于回溯更新时确定需要更新的日期范围
+     * @param endDate 结束日期(当前导入日期)
+     * @param limit 向前查询的交易日数量
+     * @return 交易日期列表,按日期降序排列
+     */
+    @Select("SELECT DISTINCT record_date FROM stock_pool_history " +
+            "WHERE record_date <= #{endDate} " +
+            "ORDER BY record_date DESC " +
+            "LIMIT #{limit}")
+    List<LocalDate> selectPastTradingDays(@Param("endDate") LocalDate endDate,
+                                          @Param("limit") int limit);
 }

+ 22 - 8
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/service/impl/StockPoolAsyncServiceImpl.java

@@ -81,9 +81,9 @@ public class StockPoolAsyncServiceImpl implements IStockPoolAsyncService {
     }
 
     /**
-     * 回溯更新过去10内所有记录的high_trend
-     * 当导入新的历史数据后,需要更新过去10内所有记录的high_trend,
-     * 因为这些记录的"未来10最高价"可能会因为新数据的加入而改变
+     * 回溯更新过去10个交易日内所有记录的high_trend
+     * 当导入新的历史数据后,需要更新过去10个交易日内所有记录的high_trend,
+     * 因为这些记录的"未来10个交易日最高价"可能会因为新数据的加入而改变
      *
      * @param importDate 当前导入的日期
      * @return 更新结果信息
@@ -91,16 +91,30 @@ public class StockPoolAsyncServiceImpl implements IStockPoolAsyncService {
     private String updatePastTenDaysHighTrend(LocalDate importDate) {
         log.info("[回溯更新high_trend] 开始更新,导入日期: {}", importDate);
 
-        // 查询过去10天内的所有历史记录(包括今天)
-        LocalDate tenDaysAgo = importDate.minusDays(10);
+        // 查询向前10个交易日的日期列表
+        List<LocalDate> pastTradingDays = stockPoolHistoryMapper.selectPastTradingDays(importDate, 10);
+
+        if (pastTradingDays.isEmpty()) {
+            String message = "没有需要回溯更新的历史记录(向前10个交易日)";
+            log.info("[回溯更新high_trend] {}", message);
+            return message;
+        }
+
+        // 获取最早的交易日作为查询起始日期
+        LocalDate earliestDate = pastTradingDays.get(pastTradingDays.size() - 1);
+
+        log.info("[回溯更新high_trend] 回溯范围:{} 到 {},共 {} 个交易日",
+            earliestDate, importDate, pastTradingDays.size());
+
+        // 查询这些交易日内的所有历史记录
         LambdaQueryWrapper<StockPoolHistory> lqw = Wrappers.lambdaQuery();
-        lqw.ge(StockPoolHistory::getRecordDate, tenDaysAgo)
+        lqw.ge(StockPoolHistory::getRecordDate, earliestDate)
            .le(StockPoolHistory::getRecordDate, importDate);
 
         List<StockPoolHistory> recordsToUpdate = stockPoolHistoryMapper.selectList(lqw);
 
         if (recordsToUpdate.isEmpty()) {
-            String message = "没有需要回溯更新的历史记录(过去10天内)";
+            String message = "没有需要回溯更新的历史记录(向前10个交易日)";
             log.info("[回溯更新high_trend] {}", message);
             return message;
         }
@@ -123,7 +137,7 @@ public class StockPoolAsyncServiceImpl implements IStockPoolAsyncService {
                     continue;
                 }
 
-                // 查询从记录日期到当前导入日期的最高价(向后查询,最多10天)
+                // 查询从记录日期向后10个交易日的最高价
                 BigDecimal maxHighPrice = stockPoolHistoryMapper.selectForwardTenDaysHighestPrice(
                     stockCode, recordDate, importDate);