From 5b6e4fa153f0388513fc14c66daad811bd8ce1f1 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Sun, 7 Sep 2025 11:09:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=97=A5=E7=BA=BF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A3=80=E6=9F=A5=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/LeopardServerApplication.java | 2 +- .../server/service/task/CheckDailyNode.java | 77 +++++++++++++++++++ leopard-server/src/main/resources/flow.xml | 3 + 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/CheckDailyNode.java diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java index f493c2f..b7380fd 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java @@ -31,7 +31,7 @@ public class LeopardServerApplication implements ApplicationRunner { @Override public void run(ApplicationArguments args) { - executor.execute2RespWithEL("THEN(update_daily)"); + // executor.execute2RespWithEL("THEN(update_daily)"); // executor.execute2RespWithEL("THEN(update_stock)"); } } 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 new file mode 100644 index 0000000..7fa30d3 --- /dev/null +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/CheckDailyNode.java @@ -0,0 +1,77 @@ +package com.lanyuanxiaoyao.leopard.server.service.task; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.lanyuanxiaoyao.leopard.server.entity.Stock; +import com.lanyuanxiaoyao.leopard.server.service.DailyService; +import com.lanyuanxiaoyao.leopard.server.service.StockService; +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.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@LiteflowComponent("check_daily") +public class CheckDailyNode extends NodeComponent { + private final StockService stockService; + private final DailyService dailyService; + private final TuShareService tuShareService; + + public CheckDailyNode(StockService stockService, DailyService dailyService, TuShareService tuShareService) { + this.stockService = stockService; + this.dailyService = dailyService; + this.tuShareService = tuShareService; + } + + @Override + public void process() { + var reports = new ArrayList(); + var stocks = stockService.list(); + var exchanges = stocks.stream().map(Stock::getMarket).distinct().toList(); + for (Stock.Market exchange : exchanges) { + var nowDate = LocalDate.now(); + var allTradeDates = tuShareService.tradeDateList(exchange.name()) + .data() + .items() + .stream() + .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 + )); + } + } + } + } + if (ObjectUtil.isNotEmpty(reports)) { + var context = getContextBean(TaskMonitorNodes.TaskMonitorContext.class); + context.setTaskResult( + reports.stream() + .map(report -> StrUtil.format("{}({})缺少如下交易日数据:{}", report.name(), report.code(), report.missedTradeDates().stream().map(LocalDate::toString).collect(Collectors.joining(", ")))) + .collect(Collectors.joining("\n")) + ); + } + } + + public record MissedTradeReport( + String code, + String name, + List missedTradeDates + ) { + } +} diff --git a/leopard-server/src/main/resources/flow.xml b/leopard-server/src/main/resources/flow.xml index a4a28c8..ef5e818 100644 --- a/leopard-server/src/main/resources/flow.xml +++ b/leopard-server/src/main/resources/flow.xml @@ -7,4 +7,7 @@ CATCH(THEN(task_start, update_daily, task_end)).DO(task_error) + + CATCH(THEN(task_start, check_daily, task_end)).DO(task_error) +