Browse Source

导入历史数据优化

Zhangbw 2 months ago
parent
commit
e9be3ef45a

+ 0 - 5
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/service/impl/PaymentConfigServiceImpl.java

@@ -35,7 +35,6 @@ public class PaymentConfigServiceImpl implements IPaymentConfigService {
 
     // 配置key
     private static final String SHORT_PRICE_KEY = "payment.short.price";
-    private static final String STRONG_PRICE_KEY = "payment.strong.price";
     private static final String MCH_ID_KEY = "payment.mch.id";
     private static final String API_V3_KEY = "payment.api.v3.key";
     private static final String NOTIFY_URL_KEY = "payment.notify.url";
@@ -49,7 +48,6 @@ public class PaymentConfigServiceImpl implements IPaymentConfigService {
         PaymentConfigVo vo = new PaymentConfigVo();
 
         vo.setShortPrice(getConfigValue(SHORT_PRICE_KEY, "1"));
-        vo.setStrongPrice(getConfigValue(STRONG_PRICE_KEY, "100"));
         vo.setMchId(getConfigString(MCH_ID_KEY));
         vo.setApiV3Key(getConfigString(API_V3_KEY));
         vo.setNotifyUrl(getConfigString(NOTIFY_URL_KEY));
@@ -78,9 +76,6 @@ public class PaymentConfigServiceImpl implements IPaymentConfigService {
         if (bo.getShortPrice() != null) {
             updateOrInsertConfig(SHORT_PRICE_KEY, bo.getShortPrice().toString(), "超短池订阅价格");
         }
-        if (bo.getStrongPrice() != null) {
-            updateOrInsertConfig(STRONG_PRICE_KEY, bo.getStrongPrice().toString(), "强势池订阅价格");
-        }
         if (bo.getMchId() != null) {
             updateOrInsertConfig(MCH_ID_KEY, bo.getMchId(), "微信支付商户号");
         }

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

@@ -24,4 +24,15 @@ public interface StockPoolHistoryMapper extends BaseMapperPlus<StockPoolHistory,
             "WHERE stock_code = #{stockCode} AND record_date < #{recordDate} " +
             "ORDER BY record_date DESC LIMIT 1")
     BigDecimal selectPreviousClosePrice(@Param("stockCode") String stockCode, @Param("recordDate") LocalDate recordDate);
+
+    /**
+     * 查询指定股票十日内(包括当天)的最高价
+     * @param stockCode 股票代码
+     * @param recordDate 当前记录日期
+     * @return 十日内最高价,如果没有则返回null
+     */
+    @Select("SELECT MAX(day_highest_price) FROM stock_pool_history " +
+            "WHERE stock_code = #{stockCode} AND record_date <= #{recordDate} " +
+            "AND record_date >= DATE_SUB(#{recordDate}, INTERVAL 10 DAY)")
+    BigDecimal selectTenDaysHighestPrice(@Param("stockCode") String stockCode, @Param("recordDate") LocalDate recordDate);
 }

+ 62 - 27
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/service/impl/StockPoolHistoryServiceImpl.java

@@ -231,6 +231,27 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
 
+        // 批量查询已存在的记录
+        List<String> stockCodes = dataList.stream()
+            .map(StockPoolHistoryVo::getStockCode)
+            .filter(StringUtils::isNotBlank)
+            .distinct()
+            .collect(java.util.stream.Collectors.toList());
+
+        Map<String, StockPoolHistory> existingMap = new java.util.HashMap<>();
+        if (!stockCodes.isEmpty()) {
+            LambdaQueryWrapper<StockPoolHistory> lqw = Wrappers.lambdaQuery();
+            lqw.in(StockPoolHistory::getStockCode, stockCodes)
+                .eq(StockPoolHistory::getRecordDate, parsedRecordDate);
+            List<StockPoolHistory> existingList = baseMapper.selectList(lqw);
+            existingMap = existingList.stream()
+                .collect(java.util.stream.Collectors.toMap(StockPoolHistory::getStockCode, e -> e));
+        }
+
+        // 准备批量插入和更新的列表
+        List<StockPoolHistory> toInsertList = new ArrayList<>();
+        List<StockPoolHistory> toUpdateList = new ArrayList<>();
+
         for (int i = 0; i < dataList.size(); i++) {
             StockPoolHistoryVo vo = dataList.get(i);
             try {
@@ -342,11 +363,8 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
                 // 使用管理员指定的记录日期,而不是Excel中的日期
                 vo.setRecordDate(parsedRecordDate);
 
-                // 检查是否已存在(根据股票代码和记录日期)
-                LambdaQueryWrapper<StockPoolHistory> lqw = Wrappers.lambdaQuery();
-                lqw.eq(StockPoolHistory::getStockCode, vo.getStockCode())
-                    .eq(StockPoolHistory::getRecordDate, parsedRecordDate);
-                StockPoolHistory existing = baseMapper.selectOne(lqw);
+                // 检查是否已存在
+                StockPoolHistory existing = existingMap.get(vo.getStockCode());
 
                 if (existing != null) {
                     if (updateSupport) {
@@ -364,9 +382,7 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
                         existing.setDayLowestPrice(vo.getDayLowestPrice());
                         existing.setDayAvgPrice(vo.getDayAvgPrice());
                         existing.setDayClosePrice(vo.getDayClosePrice());
-                        // 计算行情涨跌(最高涨幅)
-                        existing.setHighTrend(calculateHighTrend(vo.getStockCode(), parsedRecordDate, vo.getDayHighestPrice()));
-                        baseMapper.updateById(existing);
+                        toUpdateList.add(existing);
                         updateNum++;
                         successNum++;
                     } else {
@@ -380,9 +396,7 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
                     StockPoolHistory entity = BeanUtil.toBean(vo, StockPoolHistory.class);
                     entity.setRecordDate(parsedRecordDate);
                     entity.setAdminId(LoginHelper.getUserId());
-                    // 计算行情涨跌(最高涨幅)
-                    entity.setHighTrend(calculateHighTrend(vo.getStockCode(), parsedRecordDate, vo.getDayHighestPrice()));
-                    baseMapper.insert(entity);
+                    toInsertList.add(entity);
                     successNum++;
                 }
             } catch (Exception e) {
@@ -394,6 +408,27 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
             }
         }
 
+        // 批量计算最高涨幅
+        log.info("开始批量计算最高涨幅,待插入: {} 条,待更新: {} 条", toInsertList.size(), toUpdateList.size());
+        for (StockPoolHistory entity : toInsertList) {
+            entity.setHighTrend(calculateHighTrend(entity.getStockCode(), parsedRecordDate, entity.getDayClosePrice()));
+        }
+        for (StockPoolHistory entity : toUpdateList) {
+            entity.setHighTrend(calculateHighTrend(entity.getStockCode(), parsedRecordDate, entity.getDayClosePrice()));
+        }
+
+        // 批量插入
+        if (!toInsertList.isEmpty()) {
+            baseMapper.insertBatch(toInsertList);
+            log.info("批量插入完成: {} 条", toInsertList.size());
+        }
+
+        // 批量更新
+        if (!toUpdateList.isEmpty()) {
+            baseMapper.updateBatchById(toUpdateList);
+            log.info("批量更新完成: {} 条", toUpdateList.size());
+        }
+
         if (failureNum > 0) {
             String message = String.format("导入完成!成功 %d 条(其中更新 %d 条),失败 %d 条。详细错误信息请查看服务器日志。", 
                 successNum, updateNum, failureNum);
@@ -500,30 +535,30 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
 
     /**
      * 计算行情涨跌(最高涨幅)
-     * 公式:(当日最高价 - 昨日收盘价) / 昨日收盘价 * 100
-     * 如果找不到昨日数据则返回0
-     * 
+     * 公式:(十日之内最高价 - 当天收盘价) / 当天收盘价 * 100
+     * 如果找不到数据则返回0
+     *
      * @param stockCode 股票代码
      * @param recordDate 当前记录日期
-     * @param dayHighestPrice 当日最高
+     * @param dayClosePrice 当天收盘
      * @return 最高涨幅百分比,保留2位小数
      */
-    private BigDecimal calculateHighTrend(String stockCode, LocalDate recordDate, BigDecimal dayHighestPrice) {
-        if (dayHighestPrice == null) {
+    private BigDecimal calculateHighTrend(String stockCode, LocalDate recordDate, BigDecimal dayClosePrice) {
+        if (dayClosePrice == null || dayClosePrice.compareTo(BigDecimal.ZERO) == 0) {
             return BigDecimal.ZERO;
         }
-        
-        // 查询昨日收盘
-        BigDecimal previousClosePrice = baseMapper.selectPreviousClosePrice(stockCode, recordDate);
-        
-        if (previousClosePrice == null || previousClosePrice.compareTo(BigDecimal.ZERO) == 0) {
-            // 找不到昨日数据或昨日收盘价为0,返回0
+
+        // 查询十日内最高
+        BigDecimal tenDaysHighestPrice = baseMapper.selectTenDaysHighestPrice(stockCode, recordDate);
+
+        if (tenDaysHighestPrice == null) {
+            // 找不到十日内数据,返回0
             return BigDecimal.ZERO;
         }
-        
-        // 计算最高涨幅:(当日最高价 - 昨日收盘价) / 昨日收盘价 * 100
-        return dayHighestPrice.subtract(previousClosePrice)
-            .divide(previousClosePrice, 4, RoundingMode.HALF_UP)
+
+        // 计算最高涨幅:(十日之内最高价 - 当天收盘价) / 当天收盘价 * 100
+        return tenDaysHighestPrice.subtract(dayClosePrice)
+            .divide(dayClosePrice, 4, RoundingMode.HALF_UP)
             .multiply(new BigDecimal("100"))
             .setScale(2, RoundingMode.HALF_UP);
     }