Browse Source

强势池导入更新逻辑修改

Zhangbw 1 month ago
parent
commit
ee227d1286

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

@@ -236,45 +236,21 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
                 debugVo.getChangePercent(), debugVo.getClosePrice());
         }
 
-        // 收集本次导入的股票代码
-        List<String> stockCodes = dataList.stream()
-            .map(StockPoolHistoryVo::getStockCode)
-            .filter(StringUtils::isNotBlank)
-            .distinct()
-            .collect(java.util.stream.Collectors.toList());
-
-        // 如果不支持更新,先删除本次导入的股票在该日期的记录(覆盖模式)
-        if (!updateSupport && !stockCodes.isEmpty()) {
-            LambdaQueryWrapper<StockPoolHistory> deleteLqw = Wrappers.lambdaQuery();
-            deleteLqw.eq(StockPoolHistory::getRecordDate, parsedRecordDate)
-                     .in(StockPoolHistory::getStockCode, stockCodes);
-            int deletedCount = baseMapper.delete(deleteLqw);
-            if (deletedCount > 0) {
-                log.info("覆盖模式:删除本次导入股票在同一天的旧历史记录: {} 条", deletedCount);
-            }
+        // 先删除当天所有历史记录,再重新插入,确保ID顺序与Excel行顺序一致
+        LambdaQueryWrapper<StockPoolHistory> deleteLqw = Wrappers.lambdaQuery();
+        deleteLqw.eq(StockPoolHistory::getRecordDate, parsedRecordDate);
+        int deletedCount = baseMapper.delete(deleteLqw);
+        if (deletedCount > 0) {
+            log.info("先删后插模式:删除当天旧历史记录: {} 条", deletedCount);
         }
 
         int successNum = 0;
-        int updateNum = 0;
         int failureNum = 0;
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
 
-        // 批量查询已存在的记录
-
-        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);
@@ -387,42 +363,12 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
                 // 使用管理员指定的记录日期,而不是Excel中的日期
                 vo.setRecordDate(parsedRecordDate);
 
-                // 检查是否已存在
-                StockPoolHistory existing = existingMap.get(vo.getStockCode());
-
-                if (existing != null) {
-                    if (updateSupport) {
-                        // 更新所有字段
-                        existing.setStockName(vo.getStockName());
-                        existing.setChangePercent(vo.getChangePercent());
-                        existing.setClosePrice(vo.getClosePrice());
-                        existing.setTotalAmount(vo.getTotalAmount());
-                        existing.setStrengthScore(vo.getStrengthScore());
-                        existing.setCirculationMarketValue(vo.getCirculationMarketValue());
-                        existing.setMainRisePeriod(vo.getMainRisePeriod());
-                        existing.setRecentRiseHand(vo.getRecentRiseHand());
-                        existing.setRecentLimitUp(vo.getRecentLimitUp());
-                        existing.setDayHighestPrice(vo.getDayHighestPrice());
-                        existing.setDayLowestPrice(vo.getDayLowestPrice());
-                        existing.setDayAvgPrice(vo.getDayAvgPrice());
-                        existing.setDayClosePrice(vo.getDayClosePrice());
-                        toUpdateList.add(existing);
-                        updateNum++;
-                        successNum++;
-                    } else {
-                        failureNum++;
-                        failureMsg.append("<br/>").append(failureNum).append("、股票 ")
-                            .append(vo.getStockCode()).append(" 在 ")
-                            .append(parsedRecordDate).append(" 的记录已存在");
-                    }
-                } else {
-                    // 新增
-                    StockPoolHistory entity = BeanUtil.toBean(vo, StockPoolHistory.class);
-                    entity.setRecordDate(parsedRecordDate);
-                    entity.setAdminId(LoginHelper.getUserId());
-                    toInsertList.add(entity);
-                    successNum++;
-                }
+                // 先删后插,直接新增
+                StockPoolHistory entity = BeanUtil.toBean(vo, StockPoolHistory.class);
+                entity.setRecordDate(parsedRecordDate);
+                entity.setAdminId(LoginHelper.getUserId());
+                toInsertList.add(entity);
+                successNum++;
             } catch (Exception e) {
                 failureNum++;
                 String code = vo.getStockCode() != null ? vo.getStockCode() : "未知";
@@ -432,15 +378,11 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
             }
         }
 
-        // 批量初始化最高涨幅为0(因为导入当天数据时,还没有未来数据)
-        // 后续会通过回溯更新逐步更新这个值
-        log.info("开始批量初始化最高涨幅,待插入: {} 条,待更新: {} 条", toInsertList.size(), toUpdateList.size());
+        // 批量初始化最高涨幅为0
+        log.info("开始批量插入,待插入: {} 条", toInsertList.size());
         for (StockPoolHistory entity : toInsertList) {
             entity.setHighTrend(BigDecimal.ZERO);
         }
-        for (StockPoolHistory entity : toUpdateList) {
-            entity.setHighTrend(BigDecimal.ZERO);
-        }
 
         // 批量插入
         if (!toInsertList.isEmpty()) {
@@ -448,12 +390,6 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
             log.info("批量插入完成: {} 条", toInsertList.size());
         }
 
-        // 批量更新
-        if (!toUpdateList.isEmpty()) {
-            baseMapper.updateBatchById(toUpdateList);
-            log.info("批量更新完成: {} 条", toUpdateList.size());
-        }
-
         // 将排名前十的股票加入强势池
         log.info("[强势池] 开始将排名前十的股票加入强势池,导入日期: {}", parsedRecordDate);
         addTopTenToStrongPool(parsedRecordDate);
@@ -462,12 +398,12 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
         stockPoolAsyncService.asyncProcessAfterImport(parsedRecordDate);
 
         if (failureNum > 0) {
-            String message = String.format("导入完成!成功 %d 条(其中更新 %d 条),失败 %d 条。详细错误信息请查看服务器日志。",
-                successNum, updateNum, failureNum);
+            String message = String.format("导入完成!成功 %d 条,失败 %d 条。详细错误信息请查看服务器日志。",
+                successNum, failureNum);
             log.error("导入失败详情:{}", failureMsg.toString());
             return message;
         } else {
-            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条(其中更新 " + updateNum + " 条)");
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条");
             return successMsg.toString();
         }
     }
@@ -477,10 +413,10 @@ public class StockPoolHistoryServiceImpl implements IStockPoolHistoryService {
      */
     private void addTopTenToStrongPool(LocalDate recordDate) {
         try {
-            // 1. 查询当天按强度评分排名前十的股票(Excel中的前10行
+            // 1. 查询当天按强度评分降序排名前十的股票(与Excel排序一致,不依赖ID顺序
             LambdaQueryWrapper<StockPoolHistory> lqw = Wrappers.lambdaQuery();
             lqw.eq(StockPoolHistory::getRecordDate, recordDate)
-                .orderByAsc(StockPoolHistory::getId)  // 按ID升序,获取Excel中的前10行
+                .orderByDesc(StockPoolHistory::getStrengthScore)
                 .last("LIMIT 10");
             List<StockPoolHistory> topTen = baseMapper.selectList(lqw);