1
0

feat: 任务增加进度接口

This commit is contained in:
2025-09-08 21:26:39 +08:00
parent 30225afcba
commit 3114654280
7 changed files with 72 additions and 27 deletions

View File

@@ -59,6 +59,9 @@ public class Task extends SimpleEntity {
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
@Comment("任务状态") @Comment("任务状态")
private Status status = Status.RUNNING; private Status status = Status.RUNNING;
@Column(nullable = false)
@Comment("任务进度")
private Integer step = 0;
@Comment("任务开始时间") @Comment("任务开始时间")
private LocalDateTime launchedTime; private LocalDateTime launchedTime;
@Comment("任务结束时间") @Comment("任务结束时间")

View File

@@ -15,4 +15,8 @@ public interface TaskRepository extends SimpleRepository<Task> {
@Modifying @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") @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(); void updateAllRunningTaskToFailure();
@Modifying
@Query("update Task task set task.step = ?1 where task.id = ?2")
void updateStepById(Integer step, Long id);
} }

View File

@@ -73,7 +73,8 @@ public class TaskController extends SimpleControllerSupport<Task, Void, TaskCont
task.getLaunchedTime(), task.getLaunchedTime(),
task.getFinishedTime(), task.getFinishedTime(),
cost.cost(), cost.cost(),
cost.costText() cost.costText(),
task.getStep()
); );
}; };
} }
@@ -92,7 +93,8 @@ public class TaskController extends SimpleControllerSupport<Task, Void, TaskCont
task.getLaunchedTime(), task.getLaunchedTime(),
task.getFinishedTime(), task.getFinishedTime(),
cost.cost(), cost.cost(),
cost.costText() cost.costText(),
task.getStep()
); );
}; };
} }
@@ -105,7 +107,8 @@ public class TaskController extends SimpleControllerSupport<Task, Void, TaskCont
LocalDateTime launchedTime, LocalDateTime launchedTime,
LocalDateTime finishedTime, LocalDateTime finishedTime,
Long cost, Long cost,
String costText String costText,
Integer step
) { ) {
} }
@@ -119,7 +122,8 @@ public class TaskController extends SimpleControllerSupport<Task, Void, TaskCont
LocalDateTime launchedTime, LocalDateTime launchedTime,
LocalDateTime finishedTime, LocalDateTime finishedTime,
Long cost, Long cost,
String costText String costText,
Integer step
) { ) {
} }

View File

@@ -42,4 +42,9 @@ public class TaskService extends SimpleServiceSupport<Task> {
var context = new TaskMonitorNodes.TaskMonitorContext(template); var context = new TaskMonitorNodes.TaskMonitorContext(template);
flowExecutor.execute2Future(template.getChain(), params, context); flowExecutor.execute2Future(template.getChain(), params, context);
} }
@Transactional(rollbackOn = Throwable.class)
public void updateStepById(Integer step, Long id) {
taskRepository.updateStepById(step, id);
}
} }

View File

@@ -6,9 +6,9 @@ import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.leopard.core.entity.Stock; import com.lanyuanxiaoyao.leopard.core.entity.Stock;
import com.lanyuanxiaoyao.leopard.server.service.DailyService; import com.lanyuanxiaoyao.leopard.server.service.DailyService;
import com.lanyuanxiaoyao.leopard.server.service.StockService; import com.lanyuanxiaoyao.leopard.server.service.StockService;
import com.lanyuanxiaoyao.leopard.server.service.TaskService;
import com.lanyuanxiaoyao.leopard.server.service.TuShareService; import com.lanyuanxiaoyao.leopard.server.service.TuShareService;
import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -17,12 +17,13 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@LiteflowComponent("check_daily") @LiteflowComponent("check_daily")
public class CheckDailyNode extends NodeComponent { public class CheckDailyNode extends TaskNodeComponent {
private final StockService stockService; private final StockService stockService;
private final DailyService dailyService; private final DailyService dailyService;
private final TuShareService tuShareService; 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.stockService = stockService;
this.dailyService = dailyService; this.dailyService = dailyService;
this.tuShareService = tuShareService; this.tuShareService = tuShareService;
@@ -42,27 +43,30 @@ public class CheckDailyNode extends NodeComponent {
.map(item -> LocalDate.parse(item.get(0), TuShareService.TRADE_FORMAT)) .map(item -> LocalDate.parse(item.get(0), TuShareService.TRADE_FORMAT))
.filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate)) .filter(date -> date.isBefore(nowDate) || date.isEqual(nowDate))
.toList(); .toList();
stocks.forEach(stock -> { var total = stocks.size();
if (exchange.equals(stock.getMarket())) { var progress = 0;
var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId()); for (Stock stock : stocks) {
var missedTradeDates = allTradeDates.stream() if (exchange.equals(stock.getMarket())) {
.filter(date -> date.isAfter(stock.getListedDate()) || date.isEqual(stock.getListedDate())) var existsTradeDates = dailyService.findDistinctTradeDateByStockId(stock.getId());
.filter(date -> !existsTradeDates.contains(date)) var missedTradeDates = allTradeDates.stream()
.filter(date -> { .filter(date -> date.isAfter(stock.getListedDate()) || date.isEqual(stock.getListedDate()))
ThreadUtil.safeSleep(100); .filter(date -> !existsTradeDates.contains(date))
var response = tuShareService.dailyList(date, stock.getCode()); .filter(date -> {
return !response.data().items().isEmpty(); ThreadUtil.safeSleep(100);
}) var response = tuShareService.dailyList(date, stock.getCode());
.toList(); return !response.data().items().isEmpty();
if (ObjectUtil.isNotEmpty(missedTradeDates)) { })
reports.add(new MissedTradeReport( .toList();
stock.getCode(), if (ObjectUtil.isNotEmpty(missedTradeDates)) {
stock.getName(), reports.add(new MissedTradeReport(
missedTradeDates stock.getCode(),
)); stock.getName(),
} missedTradeDates
));
} }
}); }
setStep(++progress * 100 / total);
}
} }
if (ObjectUtil.isNotEmpty(reports)) { if (ObjectUtil.isNotEmpty(reports)) {
var context = getContextBean(TaskMonitorNodes.TaskMonitorContext.class); var context = getContextBean(TaskMonitorNodes.TaskMonitorContext.class);

View File

@@ -45,6 +45,7 @@ public class TaskMonitorNodes {
if (ObjectUtil.isNotNull(taskId)) { if (ObjectUtil.isNotNull(taskId)) {
var task = taskService.detail(taskId); var task = taskService.detail(taskId);
task.setStatus(Task.Status.SUCCESS); task.setStatus(Task.Status.SUCCESS);
task.setStep(100);
task.setFinishedTime(LocalDateTime.now()); task.setFinishedTime(LocalDateTime.now());
var result = node.<String>getContextValue("taskResult"); var result = node.<String>getContextValue("taskResult");
if (StrUtil.isNotBlank(result)) { if (StrUtil.isNotBlank(result)) {

View File

@@ -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) {
}
}
}