feat(backtest): 结算显示市场名称,列表非终态任务 3s 轮询进度

- 结算记录: WIN/LOSE/UNKNOWN/CLOSED 通过 marketService.getMarket 写入 marketTitle
- 回测列表: 存在 PENDING/RUNNING 时每 3 秒静默刷新列表更新进度,全部终态后停止轮询

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
WrBug
2026-02-09 01:12:31 +08:00
co-authored by Cursor
parent b1ad6f02d2
commit c1829fe21b
2 changed files with 20 additions and 8 deletions
@@ -554,11 +554,12 @@ class BacktestExecutionService(
balance += settlementValue balance += settlementValue
val marketTitle = marketService.getMarket(position.marketId)?.title ?: ""
val settlementTrade = BacktestTrade( val settlementTrade = BacktestTrade(
backtestTaskId = task.id!!, backtestTaskId = task.id!!,
tradeTime = currentTime, tradeTime = currentTime,
marketId = position.marketId, marketId = position.marketId,
marketTitle = "", marketTitle = marketTitle,
side = "SETTLEMENT", side = "SETTLEMENT",
outcome = when { outcome = when {
settlementPrice == BigDecimal.ONE -> "WIN" settlementPrice == BigDecimal.ONE -> "WIN"
@@ -611,11 +612,12 @@ class BacktestExecutionService(
balance += settlementValue balance += settlementValue
val marketTitle = marketService.getMarket(position.marketId)?.title ?: ""
val closedTrade = BacktestTrade( val closedTrade = BacktestTrade(
backtestTaskId = task.id!!, backtestTaskId = task.id!!,
tradeTime = currentTime, tradeTime = currentTime,
marketId = position.marketId, marketId = position.marketId,
marketTitle = "", marketTitle = marketTitle,
side = "SETTLEMENT", side = "SETTLEMENT",
outcome = "CLOSED", outcome = "CLOSED",
outcomeIndex = position.outcomeIndex, outcomeIndex = position.outcomeIndex,
+16 -6
View File
@@ -53,9 +53,9 @@ const BacktestList: React.FC = () => {
const [detailTradesPage, setDetailTradesPage] = useState(1) const [detailTradesPage, setDetailTradesPage] = useState(1)
const [detailTradesSize] = useState(20) const [detailTradesSize] = useState(20)
// 获取回测任务列表 // 获取回测任务列表silent 为 true 时不显示 loading,用于轮询刷新)
const fetchTasks = async () => { const fetchTasks = async (silent = false) => {
setLoading(true) if (!silent) setLoading(true)
try { try {
const request: BacktestListRequest = { const request: BacktestListRequest = {
leaderId: leaderIdFilter, leaderId: leaderIdFilter,
@@ -69,14 +69,14 @@ const BacktestList: React.FC = () => {
if (response.data.code === 0 && response.data.data) { if (response.data.code === 0 && response.data.data) {
setTasks(response.data.data.list) setTasks(response.data.data.list)
setTotal(response.data.data.total) setTotal(response.data.data.total)
} else { } else if (!silent) {
message.error(response.data.msg || t('backtest.fetchTasksFailed')) message.error(response.data.msg || t('backtest.fetchTasksFailed'))
} }
} catch (error) { } catch (error) {
console.error('Failed to fetch backtest tasks:', error) console.error('Failed to fetch backtest tasks:', error)
message.error(t('backtest.fetchTasksFailed')) if (!silent) message.error(t('backtest.fetchTasksFailed'))
} finally { } finally {
setLoading(false) if (!silent) setLoading(false)
} }
} }
@@ -84,6 +84,16 @@ const BacktestList: React.FC = () => {
fetchTasks() fetchTasks()
}, [page, statusFilter, leaderIdFilter, sortBy, sortOrder]) }, [page, statusFilter, leaderIdFilter, sortBy, sortOrder])
// 存在非终态任务(PENDING/RUNNING)时每 3s 轮询刷新进度
const hasNonTerminalTask = tasks.some(
(task) => task.status === 'PENDING' || task.status === 'RUNNING'
)
useEffect(() => {
if (!hasNonTerminalTask) return
const timer = setInterval(() => fetchTasks(true), 3000)
return () => clearInterval(timer)
}, [hasNonTerminalTask, page, statusFilter, leaderIdFilter, sortBy, sortOrder])
// 刷新 // 刷新
const handleRefresh = () => { const handleRefresh = () => {
fetchTasks() fetchTasks()