diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/CheckDailyNode.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/CheckDailyNode.java index deee881..72d425d 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/CheckDailyNode.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/CheckDailyNode.java @@ -41,22 +41,23 @@ public class CheckDailyNode extends NodeComponent { .map(item -> LocalDate.parse(item.get(0), TuShareService.TRADE_FORMAT)) .filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate)) .toList(); - for (Stock stock : stocks) { - if (exchange.equals(stock.getMarket())) { - var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId()); - var missedTradeDates = allTradeDates.stream() - .filter(date -> date.isBefore(stock.getListedDate())) - .filter(date -> !existsTradeDates.contains(date)) - .toList(); - if (ObjectUtil.isNotEmpty(missedTradeDates)) { - reports.add(new MissedTradeReport( - stock.getCode(), - stock.getName(), - missedTradeDates - )); + stocks.parallelStream() + .forEach(stock -> { + if (exchange.equals(stock.getMarket())) { + var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId()); + var missedTradeDates = allTradeDates.stream() + .filter(date -> date.isBefore(stock.getListedDate())) + .filter(date -> !existsTradeDates.contains(date)) + .toList(); + if (ObjectUtil.isNotEmpty(missedTradeDates)) { + reports.add(new MissedTradeReport( + stock.getCode(), + stock.getName(), + missedTradeDates + )); + } } - } - } + }); } if (ObjectUtil.isNotEmpty(reports)) { var context = getContextBean(TaskMonitorNodes.TaskMonitorContext.class); 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 526eb57..ff757be 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 @@ -46,54 +46,54 @@ public class UpdateDailyNode extends NodeComponent { } var existsTradeDates = dailyService.findDistinctTradeDate(); var nowDate = LocalDate.now(); - var targetDates = tradeDates.stream() + var stocks = stockService.list(); + var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); + tradeDates.stream() .filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate)) .filter(date -> !existsTradeDates.contains(date)) .sorted() - .toList(); - var stocks = stockService.list(); - var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock)); - for (LocalDate tradeDate : targetDates) { - var factorResponse = tuShareService.factorList(tradeDate); - var factorMap = new HashMap(); - for (List item : factorResponse.data().items()) { - factorMap.put(item.get(0), Double.valueOf(item.get(2))); - } - - var response = tuShareService.dailyList(tradeDate); - transactionTemplate.execute(status -> { - try { - var count = 0; - for (List item : response.data().items()) { - var code = item.get(0); - if (stocksMap.containsKey(code)) { - count++; - var stock = stocksMap.get(code); - var factor = factorMap.get(code); - var daily = new Daily(); - daily.setTradeDate(LocalDate.parse(item.get(1), TuShareService.TRADE_FORMAT)); - daily.setOpen(item.get(2) == null ? null : Double.valueOf(item.get(2))); - daily.setHigh(item.get(3) == null ? null : Double.valueOf(item.get(3))); - daily.setLow(item.get(4) == null ? null : Double.valueOf(item.get(4))); - daily.setClose(item.get(5) == null ? null : Double.valueOf(item.get(5))); - daily.setPreviousClose(item.get(6) == null ? null : Double.valueOf(item.get(6))); - daily.setPriceChangeAmount(item.get(7) == null ? null : Double.valueOf(item.get(7))); - daily.setPriceFluctuationRange(item.get(8) == null ? null : Double.valueOf(item.get(8))); - daily.setVolume(item.get(9) == null ? null : Double.valueOf(item.get(9))); - daily.setTurnover(item.get(10) == null ? null : Double.valueOf(item.get(10))); - daily.setFactor(factor); - daily.setStock(stock); - dailyService.save(daily); - } - } - log.info("Trade date: {} {}", tradeDate, count); - return true; - } catch (Exception exception) { - log.error("Error", exception); - status.setRollbackOnly(); - return false; + .parallel() + .forEach(tradeDate -> { + var factorResponse = tuShareService.factorList(tradeDate); + var factorMap = new HashMap(); + for (List item : factorResponse.data().items()) { + factorMap.put(item.get(0), Double.valueOf(item.get(2))); } + + var response = tuShareService.dailyList(tradeDate); + transactionTemplate.execute(status -> { + try { + var count = 0; + for (List item : response.data().items()) { + var code = item.get(0); + if (stocksMap.containsKey(code)) { + count++; + var stock = stocksMap.get(code); + var factor = factorMap.get(code); + var daily = new Daily(); + daily.setTradeDate(LocalDate.parse(item.get(1), TuShareService.TRADE_FORMAT)); + daily.setOpen(item.get(2) == null ? null : Double.parseDouble(item.get(2))); + daily.setHigh(item.get(3) == null ? null : Double.parseDouble(item.get(3))); + daily.setLow(item.get(4) == null ? null : Double.parseDouble(item.get(4))); + daily.setClose(item.get(5) == null ? null : Double.parseDouble(item.get(5))); + daily.setPreviousClose(item.get(6) == null ? null : Double.parseDouble(item.get(6))); + daily.setPriceChangeAmount(item.get(7) == null ? null : Double.parseDouble(item.get(7))); + daily.setPriceFluctuationRange(item.get(8) == null ? null : Double.parseDouble(item.get(8))); + daily.setVolume(item.get(9) == null ? null : Double.parseDouble(item.get(9))); + daily.setTurnover(item.get(10) == null ? null : Double.parseDouble(item.get(10)) * 1000); + daily.setFactor(factor); + daily.setStock(stock); + dailyService.save(daily); + } + } + log.info("Trade date: {} {}", tradeDate, count); + return true; + } catch (Exception exception) { + log.error("Error", exception); + status.setRollbackOnly(); + return false; + } + }); }); - } } }