feat: 任务增加进度接口
This commit is contained in:
@@ -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("任务结束时间")
|
||||
|
||||
@@ -15,4 +15,8 @@ public interface TaskRepository extends SimpleRepository<Task> {
|
||||
@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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
) {
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user