feat: 任务增加进度接口
This commit is contained in:
@@ -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("任务结束时间")
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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