diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java index 0a03023..984719a 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateDailyNode.java @@ -8,21 +8,20 @@ import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository; import com.lanyuanxiaoyao.leopard.core.repository.StockRepository; import com.lanyuanxiaoyao.leopard.server.helper.NumberHelper; -import com.lanyuanxiaoyao.leopard.server.service.TaskService; import com.lanyuanxiaoyao.leopard.server.service.TuShareService; import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; import java.time.LocalDate; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.support.TransactionTemplate; @Slf4j @LiteflowComponent("update_daily") -public class UpdateDailyNode extends TaskNodeComponent { +public class UpdateDailyNode extends NodeComponent { private final StockRepository stockRepository; private final DailyRepository dailyRepository; @@ -30,8 +29,7 @@ public class UpdateDailyNode extends TaskNodeComponent { private final TransactionTemplate transactionTemplate; - public UpdateDailyNode(TaskService taskService, StockRepository stockRepository, DailyRepository dailyRepository, TuShareService tuShareService, TransactionTemplate transactionTemplate) { - super(taskService); + public UpdateDailyNode(StockRepository stockRepository, DailyRepository dailyRepository, TuShareService tuShareService, TransactionTemplate transactionTemplate) { this.stockRepository = stockRepository; this.dailyRepository = dailyRepository; this.tuShareService = tuShareService; @@ -51,15 +49,11 @@ public class UpdateDailyNode extends TaskNodeComponent { } var existsTradeDates = dailyRepository.findDistinctTradeDate(); var nowDate = LocalDate.now(); - var stocks = stockRepository.findAll(); - var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); - var allTradeDates = tradeDates.stream() + var stocksMap = stockRepository.findAll().stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); + tradeDates.parallelStream() .filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate)) .filter(date -> !existsTradeDates.contains(date)) - .sorted() - .toList(); - var total = new AtomicInteger(allTradeDates.size()); - allTradeDates.parallelStream() + .filter(date -> date.isAfter(LocalDate.of(2024, 12, 31))) .forEach(tradeDate -> { var factorResponse = tuShareService.factorList(tradeDate); var factorMap = new HashMap(); diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateFinanceIndicatorNode.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateFinanceIndicatorNode.java index 920fcfa..3d5e11a 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateFinanceIndicatorNode.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateFinanceIndicatorNode.java @@ -126,6 +126,13 @@ public class UpdateFinanceIndicatorNode extends TaskNodeComponent { (existing, replacement) -> existing )); + var financeIndicatorsMap = financeIndicatorRepository.findAll(QFinanceIndicator.financeIndicator.year.eq(year)) + .stream() + .collect(Collectors.toMap( + indicator -> indicator.getStock().getCode(), + indicator -> indicator + )); + for (Stock stock : stocks) { var balance = balancesMap.get(stock.getCode()); var income = incomesMap.get(stock.getCode()); @@ -134,10 +141,7 @@ public class UpdateFinanceIndicatorNode extends TaskNodeComponent { if (ArrayUtil.isAllNull(balance, income, cashFlow, finaIndicator)) { continue; } - var indicator = financeIndicatorRepository.findOne( - QFinanceIndicator.financeIndicator.stock.id.eq(stock.getId()) - .and(QFinanceIndicator.financeIndicator.year.eq(year)) - ).orElse(new FinanceIndicator()); + var indicator = financeIndicatorsMap.getOrDefault(stock.getCode(), new FinanceIndicator()); indicator.setStock(stock); indicator.setYear(year); if (ObjectUtil.isNotNull(balance)) { diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateStockNode.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateStockNode.java index 208e02a..30bf05e 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateStockNode.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/UpdateStockNode.java @@ -8,7 +8,6 @@ import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; import jakarta.transaction.Transactional; import java.time.LocalDate; -import java.util.HashSet; import java.util.stream.Collectors; @LiteflowComponent("update_stock") @@ -25,44 +24,32 @@ public class UpdateStockNode extends NodeComponent { @Transactional(rollbackOn = Throwable.class) @Override public void process() { - var stocks = stockRepository.findAll(); - var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); - var targetCodes = new HashSet(); - tuShareService.stockList() + var existsStockMap = stockRepository.findAll().stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); + var stocks = tuShareService.stockList() .data() .items() - .forEach(item -> { + .stream() + .map(item -> { var code = item.get(0); var name = item.get(1); var fullname = item.get(2); var market = EnumUtil.fromString(Stock.Market.class, item.get(3)); var industry = item.get(4); var listedDate = LocalDate.parse(item.get(5), TuShareService.TRADE_FORMAT); - if (stocksMap.containsKey(code)) { - var stock = stocksMap.get(code); - stock.setName(name); - stock.setFullname(fullname); - stock.setMarket(market); - stock.setIndustry(industry); - stock.setListedDate(listedDate); - } else { - var stock = new Stock(); - stock.setCode(code); - stock.setName(name); - stock.setFullname(fullname); - stock.setMarket(market); - stock.setIndustry(industry); - stock.setListedDate(listedDate); - stocks.add(stock); - } - targetCodes.add(code); - }); - var deleteStocks = stocks.stream() - .filter(stock -> !targetCodes.contains(stock.getCode())) - .map(Stock::getId) + var stock = existsStockMap.getOrDefault(code, new Stock()); + stock.setCode(code); + stock.setName(name); + stock.setFullname(fullname); + stock.setMarket(market); + stock.setIndustry(industry); + stock.setListedDate(listedDate); + return stock; + }) .toList(); - stockRepository.deleteByIds(deleteStocks); - + var currentCodes = stocks.stream().map(Stock::getCode).toList(); + var existsCodes = stockRepository.findDistinctCodes(); + var deleteCodes = existsCodes.stream().filter(code -> !currentCodes.contains(code)).toList(); + stockRepository.deleteAllByCodeIn(deleteCodes); stockRepository.saveAll(stocks); } }