diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index ef4a42f..9ac2599 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -75,6 +75,14 @@
+
+
+
+
+
+
+
+
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index a9efd3a..29f6ae8 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -85,78 +85,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java
index 0c4cf97..76794da 100644
--- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java
+++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/LeopardServerApplication.java
@@ -1,7 +1,6 @@
package com.lanyuanxiaoyao.leopard.server;
import com.blinkfox.fenix.EnableFenix;
-import com.lanyuanxiaoyao.leopard.server.service.StockService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Task.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Task.java
index df5d869..c309d64 100644
--- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Task.java
+++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/entity/Task.java
@@ -60,7 +60,7 @@ public class Task extends SimpleEntity {
@Column(nullable = false)
@Enumerated(EnumType.STRING)
@Comment("任务状态")
- private Status status;
+ private Status status = Status.RUNNING;
@Comment("任务开始时间")
private LocalDateTime launchedTime;
@Comment("任务结束时间")
@@ -69,7 +69,6 @@ public class Task extends SimpleEntity {
@Getter
@AllArgsConstructor
public enum Status implements SimpleEnum {
- PENDING("待执行"),
RUNNING("执行中"),
SUCCESS("成功"),
FAILURE("失败"),
diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/StockService.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/StockService.java
index 25ee638..a58bd49 100644
--- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/StockService.java
+++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/StockService.java
@@ -9,7 +9,6 @@ import java.util.List;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
/**
* @author lanyuanxiaoyao
@@ -20,51 +19,57 @@ import org.springframework.transaction.annotation.Transactional;
public class StockService extends SimpleServiceSupport {
private final StockRepository stockRepository;
private final TuShareService tuShareService;
+ private final TaskService taskService;
- public StockService(StockRepository repository, TuShareService tuShareService) {
+ public StockService(StockRepository repository, TuShareService tuShareService, TaskService taskService) {
super(repository);
this.stockRepository = repository;
this.tuShareService = tuShareService;
+ this.taskService = taskService;
}
public List findDistinctIndustries() {
return stockRepository.findDistinctIndustries();
}
- @Transactional(rollbackFor = Throwable.class)
public void refresh() {
- log.info("开始刷新股票列表");
- var stocks = list();
- var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
- tuShareService.stockList()
- .data()
- .items()
- .forEach(item -> {
- var code = item.get(0);
- var name = item.get(1);
- var fullname = item.get(2);
- var market = EnumUtil.fromString(Stock.Market.class, item.get(3));
- var industry = item.get(4);
- var listed = StrUtil.equals("L", item.get(5));
- if (stocksMap.containsKey(code)) {
- var stock = stocksMap.get(code);
- stock.setName(name);
- stock.setFullname(fullname);
- stock.setMarket(market);
- stock.setIndustry(industry);
- stock.setListed(listed);
- } else {
- var stock = new Stock();
- stock.setCode(code);
- stock.setName(name);
- stock.setFullname(fullname);
- stock.setMarket(market);
- stock.setIndustry(industry);
- stock.setListed(listed);
- stocks.add(stock);
- }
- });
- repository.saveAll(stocks);
- log.info("股票列表刷新完成");
+ taskService.startTask(
+ "股票列表刷新",
+ "股票列表刷新",
+ () -> {
+ var stocks = list();
+ var stocksMap = stocks.stream().collect(Collectors.toMap(Stock::getCode, stock -> stock));
+ tuShareService.stockList()
+ .data()
+ .items()
+ .forEach(item -> {
+ var code = item.get(0);
+ var name = item.get(1);
+ var fullname = item.get(2);
+ var market = EnumUtil.fromString(Stock.Market.class, item.get(3));
+ var industry = item.get(4);
+ var listed = StrUtil.equals("L", item.get(5));
+ if (stocksMap.containsKey(code)) {
+ var stock = stocksMap.get(code);
+ stock.setName(name);
+ stock.setFullname(fullname);
+ stock.setMarket(market);
+ stock.setIndustry(industry);
+ stock.setListed(listed);
+ } else {
+ var stock = new Stock();
+ stock.setCode(code);
+ stock.setName(name);
+ stock.setFullname(fullname);
+ stock.setMarket(market);
+ stock.setIndustry(industry);
+ stock.setListed(listed);
+ stocks.add(stock);
+ }
+ });
+ repository.saveOrUpdateAllByNotNullProperties(stocks);
+ return null;
+ }
+ );
}
}
diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TaskService.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TaskService.java
index 6e691cf..fc386c8 100644
--- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TaskService.java
+++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TaskService.java
@@ -1,11 +1,14 @@
package com.lanyuanxiaoyao.leopard.server.service;
+import cn.hutool.core.util.StrUtil;
import com.lanyuanxiaoyao.leopard.server.entity.Task;
import com.lanyuanxiaoyao.leopard.server.repository.TaskRepository;
-import com.lanyuanxiaoyao.service.template.repository.SimpleRepository;
import com.lanyuanxiaoyao.service.template.service.SimpleServiceSupport;
+import java.time.LocalDateTime;
+import java.util.function.Supplier;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.support.TransactionTemplate;
/**
* @author lanyuanxiaoyao
@@ -14,9 +17,36 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service
public class TaskService extends SimpleServiceSupport {
+ private final TransactionTemplate transactionTemplate;
-
- public TaskService(TaskRepository repository) {
+ public TaskService(TaskRepository repository, TransactionTemplate transactionTemplate) {
super(repository);
+ this.transactionTemplate = transactionTemplate;
+ }
+
+ public void startTask(String name, String description, Supplier executor) {
+ var task = new Task();
+ task.setName(name);
+ task.setDescription(description);
+ task.setStatus(Task.Status.RUNNING);
+ task.setLaunchedTime(LocalDateTime.now());
+ repository.save(task);
+ transactionTemplate.execute(status -> {
+ try {
+ var result = executor.get();
+ task.setStatus(Task.Status.SUCCESS);
+ if (StrUtil.isNotBlank(result)) {
+ task.setResult(result);
+ }
+ return true;
+ } catch (Exception e) {
+ task.setStatus(Task.Status.FAILURE);
+ task.setError(e.getMessage());
+ status.setRollbackOnly();
+ return false;
+ }
+ });
+ task.setFinishedTime(LocalDateTime.now());
+ repository.save(task);
}
}
diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TuShareService.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TuShareService.java
index 60ac35f..424b019 100644
--- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TuShareService.java
+++ b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/service/TuShareService.java
@@ -42,7 +42,7 @@ public class TuShareService {
public TuShareResponse stockList() {
var response = HttpUtil.post(API_URL, buildRequest(
"stock_basic",
- Map.of("list_status", "L"),
+ Map.of("list_status", "D,P,L"),
List.of("ts_code", "name", "fullname", "exchange", "industry", "list_status")
));
var tuShareResponse = mapper.readValue(response, TuShareResponse.class);
diff --git a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/task/TaskTemplate.java b/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/task/TaskTemplate.java
deleted file mode 100644
index 02af71d..0000000
--- a/leopard-server/src/main/java/com/lanyuanxiaoyao/leopard/server/task/TaskTemplate.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.lanyuanxiaoyao.leopard.server.task;
-
-import java.util.Map;
-
-/**
- * 任务
- *
- * @author lanyuanxiaoyao
- * @version 20250829
- */
-public abstract class TaskTemplate {
- private String name;
- private String description;
-
- public abstract Type getType();
-
- public enum Type {
- CLASS
- }
-}
diff --git a/leopard-web/src/pages/task/TaskList.tsx b/leopard-web/src/pages/task/TaskList.tsx
index 35aeee6..1ced1e5 100644
--- a/leopard-web/src/pages/task/TaskList.tsx
+++ b/leopard-web/src/pages/task/TaskList.tsx
@@ -1,5 +1,5 @@
import React from 'react'
-import {amisRender, commonInfo, crudCommonOptions, paginationTemplate, remoteMappings} from '../../util/amis.tsx'
+import {amisRender, commonInfo, crudCommonOptions, paginationTemplate, remoteMappings, time} from '../../util/amis.tsx'
import {useNavigate} from 'react-router'
function TaskList() {
@@ -69,12 +69,16 @@ function TaskList() {
{
name: 'launchedTime',
label: '启动时间',
- width: 100,
+ width: 150,
+ align: 'center',
+ ...time('launchedTime'),
},
{
name: 'finishedTime',
label: '结束时间',
- width: 100,
+ width: 150,
+ align: 'center',
+ ...time('finishedTime'),
},
{
type: 'operation',
diff --git a/pom.xml b/pom.xml
index d085a7b..5060bc0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,6 +25,7 @@
13.0.0
5.8.39
+ 2.13.2
@@ -54,6 +55,12 @@
${hutool.version}
+
+ com.yomahub
+ liteflow-spring-boot-starter
+ ${liteflow.version}
+
+
org.springframework.boot
spring-boot-dependencies