实现 #1097;修复导出时sql报错的问题
This commit is contained in:
1 parent
82bce9f784
commit
14c55097e7
7 files changed
+424
-14
No files matched your search
@@ -118,10 +118,15 @@ function ExportPage() {
|
||||
allTasks: backgroundTasks,
|
||||
pauseTask: pauseBgTask,
|
||||
resumeTask: resumeBgTask,
|
||||
cancelTask: cancelBgTask
|
||||
cancelTask: cancelBgTask,
|
||||
clearSettledTasks: clearSettledBgTasks
|
||||
} = useBackgroundTasks()
|
||||
const taskCenterBackgroundTasks = backgroundTasks.filter(task => task.sourcePage === 'export' || task.sourcePage === 'chat')
|
||||
|
||||
const clearCompletedTaskCenterBackgroundTasks = useCallback(() => {
|
||||
clearSettledBgTasks(task => task.sourcePage === 'export' || task.sourcePage === 'chat')
|
||||
}, [clearSettledBgTasks])
|
||||
|
||||
// ── 4. Dialog & Exports ──
|
||||
const { dialogState, openDialog, closeDialog } = useExportDialog()
|
||||
|
||||
@@ -297,6 +302,7 @@ function ExportPage() {
|
||||
onPauseBackgroundTask={pauseBgTask}
|
||||
onResumeBackgroundTask={resumeBgTask}
|
||||
onCancelBackgroundTask={cancelBgTask}
|
||||
onClearCompletedBackgroundTasks={clearCompletedTaskCenterBackgroundTasks}
|
||||
/>
|
||||
</section>
|
||||
)}
|
||||
|
||||
@@ -17,8 +17,13 @@ interface TaskCenterProps {
|
||||
onPauseBackgroundTask: (taskId: string) => void
|
||||
onResumeBackgroundTask: (taskId: string) => void
|
||||
onCancelBackgroundTask: (taskId: string) => void
|
||||
onClearCompletedBackgroundTasks: () => void
|
||||
}
|
||||
|
||||
const isBackgroundTaskSettled = (task: BackgroundTaskRecord): boolean => (
|
||||
task.status === 'completed' || task.status === 'failed' || task.status === 'canceled'
|
||||
)
|
||||
|
||||
const parseBackgroundTaskProgress = (progressText?: string): { current: number; total: number; percent: number } | null => {
|
||||
const match = String(progressText || '').match(/(\d[\d,]*)\s*\/\s*(\d[\d,]*)/)
|
||||
if (!match) return null
|
||||
@@ -40,21 +45,28 @@ const TaskCenter: React.FC<TaskCenterProps> = ({
|
||||
backgroundTasks,
|
||||
onPauseBackgroundTask,
|
||||
onResumeBackgroundTask,
|
||||
onCancelBackgroundTask
|
||||
onCancelBackgroundTask,
|
||||
onClearCompletedBackgroundTasks
|
||||
}) => {
|
||||
const hasTasks = exportTasks.length > 0 || backgroundTasks.length > 0
|
||||
|
||||
if (!hasTasks) return null
|
||||
|
||||
const activeExportTasks = exportTasks.filter(t => t.status === 'running' || t.status === 'cancel_requested')
|
||||
const completedExportTasks = exportTasks.filter(t => t.status === 'success' || t.status === 'error')
|
||||
const completedBackgroundTasks = backgroundTasks.filter(isBackgroundTaskSettled)
|
||||
const hasCompletedTasks = completedExportTasks.length > 0 || completedBackgroundTasks.length > 0
|
||||
|
||||
const handleClearCompletedTasks = () => {
|
||||
onClearCompletedExportTasks()
|
||||
onClearCompletedBackgroundTasks()
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="task-center">
|
||||
<div className="task-center-header">
|
||||
<h2 className="title">任务中心</h2>
|
||||
{completedExportTasks.length > 0 && (
|
||||
<button className="clear-btn" onClick={onClearCompletedExportTasks}>
|
||||
{hasCompletedTasks && (
|
||||
<button className="clear-btn" onClick={handleClearCompletedTasks}>
|
||||
<Trash2 size={14} /> 清理已完成
|
||||
</button>
|
||||
)}
|
||||
@@ -116,7 +128,7 @@ const TaskCenter: React.FC<TaskCenterProps> = ({
|
||||
{backgroundTasks.map(bgTask => {
|
||||
const isPausable = bgTask.status === 'running'
|
||||
const isResumable = bgTask.status === 'paused'
|
||||
const isCancelable = bgTask.status !== 'completed' && bgTask.status !== 'canceled' && bgTask.status !== 'failed'
|
||||
const isCancelable = !isBackgroundTaskSettled(bgTask)
|
||||
const progress = parseBackgroundTaskProgress(bgTask.progressText)
|
||||
const sourceLabel = backgroundTaskSourceLabels[bgTask.sourcePage] || '后台任务'
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
import { useState, useEffect, useCallback, useMemo } from 'react'
|
||||
import type { BackgroundTaskRecord } from '../../../types/backgroundTask'
|
||||
import {
|
||||
clearSettledBackgroundTasks,
|
||||
requestCancelBackgroundTask,
|
||||
requestCancelBackgroundTasks,
|
||||
requestPauseBackgroundTask,
|
||||
@@ -25,6 +26,7 @@ export interface BackgroundTasksResult {
|
||||
resumeTask: (taskId: string) => void
|
||||
cancelTask: (taskId: string) => void
|
||||
cancelChatTasks: () => void
|
||||
clearSettledTasks: (predicate?: (task: BackgroundTaskRecord) => boolean) => void
|
||||
}
|
||||
|
||||
export function useBackgroundTasks(): BackgroundTasksResult {
|
||||
@@ -67,6 +69,10 @@ export function useBackgroundTasks(): BackgroundTasksResult {
|
||||
requestCancelBackgroundTasks(task => task.sourcePage === 'chat' && task.status !== 'completed' && task.status !== 'canceled' && task.status !== 'failed')
|
||||
}, [])
|
||||
|
||||
const clearSettledTasks = useCallback((predicate?: (task: BackgroundTaskRecord) => boolean) => {
|
||||
clearSettledBackgroundTasks(predicate)
|
||||
}, [])
|
||||
|
||||
return {
|
||||
allTasks: tasks,
|
||||
chatTasks,
|
||||
@@ -76,6 +82,7 @@ export function useBackgroundTasks(): BackgroundTasksResult {
|
||||
pauseTask,
|
||||
resumeTask,
|
||||
cancelTask,
|
||||
cancelChatTasks
|
||||
cancelChatTasks,
|
||||
clearSettledTasks
|
||||
}
|
||||
}
|
||||
@@ -203,6 +203,26 @@ export const requestCancelBackgroundTasks = (predicate: (task: BackgroundTaskRec
|
||||
return canceledCount
|
||||
}
|
||||
|
||||
export const clearSettledBackgroundTasks = (predicate?: (task: BackgroundTaskRecord) => boolean): number => {
|
||||
let clearedCount = 0
|
||||
for (const task of [...tasks.values()]) {
|
||||
if (ACTIVE_STATUSES.has(task.status)) continue
|
||||
if (predicate && !predicate(task)) continue
|
||||
|
||||
tasks.delete(task.id)
|
||||
cancelHandlers.delete(task.id)
|
||||
pauseHandlers.delete(task.id)
|
||||
resumeHandlers.delete(task.id)
|
||||
clearedCount += 1
|
||||
}
|
||||
|
||||
if (clearedCount > 0) {
|
||||
notifyListeners()
|
||||
}
|
||||
|
||||
return clearedCount
|
||||
}
|
||||
|
||||
export const isBackgroundTaskCancelRequested = (taskId: string): boolean => {
|
||||
const task = tasks.get(taskId)
|
||||
return Boolean(task?.cancelRequested)
|
||||
|
||||
Reference in new issue
Block a user