|
|
@@ -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);
|
|
|
|