diff --git a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/entity/Task.java b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/entity/Task.java index 44adbd5..27b3202 100644 --- a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/entity/Task.java +++ b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/entity/Task.java @@ -59,6 +59,9 @@ public class Task extends SimpleEntity { @Enumerated(EnumType.STRING) @Comment("任务状态") private Status status = Status.RUNNING; + @Column(nullable = false) + @Comment("任务进度") + private Integer step = 0; @Comment("任务开始时间") private LocalDateTime launchedTime; @Comment("任务结束时间") diff --git a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/TaskRepository.java b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/TaskRepository.java index 38fc2a4..152f2cb 100644 --- a/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/TaskRepository.java +++ b/leopard-core/src/main/java/com/lanyuanxiaoyao/leopard/core/repository/TaskRepository.java @@ -15,4 +15,8 @@ public interface TaskRepository extends SimpleRepository { @Modifying @Query("update Task task set task.status = com.lanyuanxiaoyao.leopard.core.entity.Task.Status.FAILURE where task.status = com.lanyuanxiaoyao.leopard.core.entity.Task.Status.RUNNING") void updateAllRunningTaskToFailure(); + + @Modifying + @Query("update Task task set task.step = ?1 where task.id = ?2") + void updateStepById(Integer step, Long id); } diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/TaskController.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/TaskController.java index 79e919f..bb2f4db 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/TaskController.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/controller/TaskController.java @@ -73,7 +73,8 @@ public class TaskController extends SimpleControllerSupport { var context = new TaskMonitorNodes.TaskMonitorContext(template); flowExecutor.execute2Future(template.getChain(), params, context); } + + @Transactional(rollbackOn = Throwable.class) + public void updateStepById(Integer step, Long id) { + taskRepository.updateStepById(step, id); + } } 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 b6f1c71..1a8af15 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 @@ -6,9 +6,9 @@ import cn.hutool.core.util.StrUtil; import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.server.service.DailyService; import com.lanyuanxiaoyao.leopard.server.service.StockService; +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.ArrayList; import java.util.List; @@ -17,12 +17,13 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @LiteflowComponent("check_daily") -public class CheckDailyNode extends NodeComponent { +public class CheckDailyNode extends TaskNodeComponent { private final StockService stockService; private final DailyService dailyService; private final TuShareService tuShareService; - public CheckDailyNode(StockService stockService, DailyService dailyService, TuShareService tuShareService) { + public CheckDailyNode(TaskService taskService, StockService stockService, DailyService dailyService, TuShareService tuShareService) { + super(taskService); this.stockService = stockService; this.dailyService = dailyService; this.tuShareService = tuShareService; @@ -42,27 +43,30 @@ public class CheckDailyNode extends NodeComponent { .map(item -> LocalDate.parse(item.get(0), TuShareService.TRADE_FORMAT)) .filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate)) .toList(); - stocks.forEach(stock -> { - if (exchange.equals(stock.getMarket())) { - var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId()); - var missedTradeDates = allTradeDates.stream() - .filter(date -> date.isAfter(stock.getListedDate()) || date.isEqual(stock.getListedDate())) - .filter(date -> !existsTradeDates.contains(date)) - .filter(date -> { - ThreadUtil.safeSleep(100); - var response = tuShareService.dailyList(date, stock.getCode()); - return !response.data().items().isEmpty(); - }) - .toList(); - if (ObjectUtil.isNotEmpty(missedTradeDates)) { - reports.add(new MissedTradeReport( - stock.getCode(), - stock.getName(), - missedTradeDates - )); - } + var total = stocks.size(); + var progress = 0; + for (Stock stock : stocks) { + if (exchange.equals(stock.getMarket())) { + var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId()); + var missedTradeDates = allTradeDates.stream() + .filter(date -> date.isAfter(stock.getListedDate()) || date.isEqual(stock.getListedDate())) + .filter(date -> !existsTradeDates.contains(date)) + .filter(date -> { + ThreadUtil.safeSleep(100); + var response = tuShareService.dailyList(date, stock.getCode()); + return !response.data().items().isEmpty(); + }) + .toList(); + if (ObjectUtil.isNotEmpty(missedTradeDates)) { + reports.add(new MissedTradeReport( + stock.getCode(), + stock.getName(), + missedTradeDates + )); } - }); + } + setStep(++progress * 100 / total); + } } if (ObjectUtil.isNotEmpty(reports)) { var context = getContextBean(TaskMonitorNodes.TaskMonitorContext.class); diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskMonitorNodes.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskMonitorNodes.java index 76ecefe..94f8824 100644 --- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskMonitorNodes.java +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskMonitorNodes.java @@ -45,6 +45,7 @@ public class TaskMonitorNodes { if (ObjectUtil.isNotNull(taskId)) { var task = taskService.detail(taskId); task.setStatus(Task.Status.SUCCESS); + task.setStep(100); task.setFinishedTime(LocalDateTime.now()); var result = node.getContextValue("taskResult"); if (StrUtil.isNotBlank(result)) { diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskNodeComponent.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskNodeComponent.java new file mode 100644 index 0000000..5c0839e --- /dev/null +++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/task/TaskNodeComponent.java @@ -0,0 +1,24 @@ +package com.lanyuanxiaoyao.leopard.server.service.task; + +import com.lanyuanxiaoyao.leopard.server.service.TaskService; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.exception.NoSuchContextBeanException; + +public abstract class TaskNodeComponent extends NodeComponent { + private final TaskService taskService; + + protected TaskNodeComponent(TaskService taskService) { + this.taskService = taskService; + } + + protected void setStep(int step) { + if (step < 0 || step > 100) { + throw new IllegalArgumentException("step must be between 0 and 100"); + } + try { + var context = getContextBean(TaskMonitorNodes.TaskMonitorContext.class); + taskService.updateStepById(step, context.getTaskId()); + } catch (NoSuchContextBeanException ignored) { + } + } +}