refactor: remove dataset cron records

This commit is contained in:
2026-07-23 23:08:25 +08:00
parent 3705d75e59
commit fbd142803a
14 changed files with 125 additions and 380 deletions

View File

@@ -14,7 +14,6 @@ import {
IconStorage,
} from '@arco-design/web-react/icon'
import type {
DatasetCronDTO,
DatasetDepositDTO,
DatasetItemDTO,
DatasetItemPageDTO,
@@ -22,6 +21,7 @@ import type {
DatasetSourceDTO,
DatasetSourceInput,
DatasetSourceKind,
DatasetSyncResultDTO,
} from '../api/dataset'
const { Row, Col } = Grid
@@ -61,8 +61,7 @@ export function WorkspaceExplorePage({
onUpdateSource,
onDeleteSource,
onUpdateItem,
onQueueSync,
onListCrons,
onSyncSources,
onDepositItem,
}: {
activeProjectID: string
@@ -73,8 +72,7 @@ export function WorkspaceExplorePage({
onUpdateSource: (sourceId: string, input: DatasetSourceInput) => Promise<DatasetSourceDTO>
onDeleteSource: (sourceId: string) => Promise<void>
onUpdateItem: (itemId: string, input: DatasetItemUpdate) => Promise<DatasetItemDTO>
onQueueSync: () => Promise<DatasetCronDTO[]>
onListCrons: (signal?: AbortSignal) => Promise<DatasetCronDTO[]>
onSyncSources: () => Promise<DatasetSyncResultDTO[]>
onDepositItem: (itemId: string, projectId: string) => Promise<DatasetDepositDTO & { refreshFailed?: boolean }>
}) {
const [sourceRecords, setSourceRecords] = useState<DatasetSourceDTO[]>([])
@@ -265,12 +263,10 @@ export function WorkspaceExplorePage({
async function syncSources() {
setSyncing(true)
try {
const queued = await onQueueSync()
if (queued.length === 0) {
const results = await onSyncSources()
if (results.length === 0) {
Message.info('暂无已启用的 RSS 数据源')
} else {
Message.info(`已提交 ${queued.length} 个采集任务`)
const crons = await waitForDatasetRuns(queued, onListCrons)
const sourceID = activeSourceID === 'all' ? undefined : activeSourceID
const [nextSources, nextPage] = await Promise.all([
onListSources(),
@@ -279,11 +275,11 @@ export function WorkspaceExplorePage({
setSourceRecords(nextSources)
setItems(nextPage.items)
setItemTotal(nextPage.total)
const failed = crons.filter((cron) => cron.status === 'failed').length
const failed = results.filter((result) => result.status === 'failed').length
if (failed > 0) {
Message.warning(`${crons.length - failed} 个数据源采集完成,${failed} 个失败`)
Message.warning(`${results.length - failed} 个数据源采集完成,${failed} 个失败`)
} else {
Message.success(`已完成 ${crons.length} 个数据源采集任务`)
Message.success(`已完成 ${results.length} 个数据源采集任务`)
}
}
} catch (error) {
@@ -547,19 +543,3 @@ function sourceSubtitle(source: DatasetSourceDTO) {
if (Number.isNaN(parsed.getTime())) return `${source.itemCount}`
return `${source.itemCount} 条 · ${new Intl.DateTimeFormat('zh-CN', { dateStyle: 'short', timeStyle: 'short' }).format(parsed)}`
}
async function waitForDatasetRuns(
queued: DatasetCronDTO[],
listRuns: (signal?: AbortSignal) => Promise<DatasetCronDTO[]>,
) {
const queuedIDs = new Set(queued.map((run) => run.id))
const deadline = Date.now() + 10 * 60 * 1000
while (Date.now() < deadline) {
const runs = (await listRuns()).filter((run) => queuedIDs.has(run.id))
if (runs.length === queuedIDs.size && runs.every((run) => run.status === 'completed' || run.status === 'failed')) {
return runs
}
await new Promise((resolve) => setTimeout(resolve, 1500))
}
throw new Error('采集任务仍在后台运行,请稍后刷新')
}