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

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

View File

@@ -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.<String>getContextValue("taskResult");
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) {
}
}
}