perf: 优化查询效率
This commit is contained in:
@@ -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<String, Double>();
|
||||
|
||||
@@ -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.<Object>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)) {
|
||||
|
||||
@@ -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<String>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user