diff --git a/frontend/components/common/admin/task-manager.tsx b/frontend/components/common/admin/task-manager.tsx index 187c339b..66b0a071 100644 --- a/frontend/components/common/admin/task-manager.tsx +++ b/frontend/components/common/admin/task-manager.tsx @@ -6,6 +6,7 @@ import {Button} from "@/components/ui/button" import {Input} from "@/components/ui/input" import {Label} from "@/components/ui/label" import {Textarea} from "@/components/ui/textarea" +import {Switch} from "@/components/ui/switch" import {Spinner} from "@/components/ui/spinner" import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle} from "@/components/ui/dialog" import {Calendar as CalendarIcon, Clock, Info, Layers, Play} from "lucide-react" @@ -380,6 +381,17 @@ export function TaskManager() { value={paramValues[param.name] || ""} onChange={(e) => setParamValues(prev => ({ ...prev, [param.name]: e.target.value }))} /> + ) : param.type === 'boolean' ? ( +
+ setParamValues(prev => ({ ...prev, [param.name]: checked ? 'true' : 'false' }))} + /> + + {paramValues[param.name] === 'true' ? '开启' : '关闭'} + +
) : ( setParamValues(prev => ({ ...prev, [param.name]: e.target.value }))} /> + ) : param.type === 'boolean' ? ( +
+ setParamValues(prev => ({ ...prev, [param.name]: checked ? 'true' : 'false' }))} + /> + + {paramValues[param.name] === 'true' ? '开启' : '关闭'} + +
) : ( , ): BuildPayloadResult { - const payloadData: Record = {}; + const payloadData: Record = {}; for (const param of params) { const raw = values[param.name] ?? ''; diff --git a/internal/apps/admin/task/routers.go b/internal/apps/admin/task/routers.go index 9ebe574b..54c0b9a8 100644 --- a/internal/apps/admin/task/routers.go +++ b/internal/apps/admin/task/routers.go @@ -187,7 +187,7 @@ func RetryTask(c *gin.Context) { switch { case strings.Contains(errMsg, "不存在"): c.JSON(http.StatusNotFound, util.Err(errMsg)) - case strings.Contains(errMsg, "只有非进行中") || strings.Contains(errMsg, "不支持重试") || strings.Contains(errMsg, "已达到最大重试"): + case strings.Contains(errMsg, "只有失败的任务") || strings.Contains(errMsg, "不支持重试") || strings.Contains(errMsg, "已达到最大重试"): c.JSON(http.StatusBadRequest, util.Err(errMsg)) default: c.JSON(http.StatusInternalServerError, util.Err(fmt.Sprintf("%s: %v", TaskRetryFailed, err))) diff --git a/internal/task/constants.go b/internal/task/constants.go index 5a208c3e..7bd9ccfa 100644 --- a/internal/task/constants.go +++ b/internal/task/constants.go @@ -31,7 +31,7 @@ const defaultMaxRetry = 3 type TaskParam struct { Name string `json:"Name"` // 参数键名 Label string `json:"Label"` // 显示名称 - Type string `json:"Type"` // 类型:string, text, number + Type string `json:"Type"` // 类型:string, text, number, boolean Required bool `json:"Required"` // 是否必填 Placeholder string `json:"Placeholder"` // 占位符 Description string `json:"Description"` // 描述 diff --git a/internal/task/errs.go b/internal/task/errs.go index 37b41b8b..6e020ef3 100644 --- a/internal/task/errs.go +++ b/internal/task/errs.go @@ -8,7 +8,7 @@ const ( errCreateTaskExecutionFailed = "创建任务执行记录失败: %w" errTaskEnqueueFailed = "任务入队失败: %w" errTaskExecutionNotFound = "任务执行记录不存在: %w" - errRetryOnlyFinishedTask = "只有非进行中的任务才能重试,当前状态: %s" + errRetryOnlyFailedTask = "只有失败的任务才能重试,当前状态: %s" errTaskNotRetryable = "该任务不支持重试" errTaskMaxRetryExceeded = "已达到最大重试次数 %d" errCreateRetryExecutionFailed = "创建重试任务执行记录失败: %w" diff --git a/internal/task/executor.go b/internal/task/executor.go index b6567751..87c0fc66 100644 --- a/internal/task/executor.go +++ b/internal/task/executor.go @@ -138,8 +138,8 @@ func RetryTask(ctx context.Context, id uint64) (string, error) { return "", fmt.Errorf(errTaskExecutionNotFound, err) } - if execution.Status == model.TaskExecutionStatusPending || execution.Status == model.TaskExecutionStatusRunning { - return "", fmt.Errorf(errRetryOnlyFinishedTask, execution.Status) + if execution.Status != model.TaskExecutionStatusFailed { + return "", fmt.Errorf(errRetryOnlyFailedTask, execution.Status) } if !execution.Retryable {