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 {