diff --git a/backend/internal/handler/generate.go b/backend/internal/handler/generate.go index 7994a52..b5fb767 100755 --- a/backend/internal/handler/generate.go +++ b/backend/internal/handler/generate.go @@ -74,9 +74,11 @@ func Generate(c *gin.Context) { // runPipelineBg 后台执行生成管线,更新任务状态。 func runPipelineBg(ctx context.Context, projectID, taskID string, req GenerateRequest) { l := logger.With("task_id", taskID, "project_id", projectID) + l.Info("task started", "asset_type", req.AssetType, "prompt", req.Prompt) // 注入进度上报回调 ctx = service.WithProgressReporter(ctx, func(stage string, progress int) { + l.Info("progress update", "stage", stage, "progress", progress) updateTaskInDB(ctx, taskID, "running", stage, "", progress) }) @@ -101,12 +103,14 @@ func runPipelineBg(ctx context.Context, projectID, taskID string, req GenerateRe }, } + l.Info("calling pipeline", "input_tags", in.Tags, "user_note", in.UserNote) output, err := service.RunPipeline(ctx, in) if err != nil { l.Error("task pipeline failed", "error", err) updateTaskInDB(ctx, taskID, "failed", "", err.Error(), 0) return } + l.Info("pipeline completed", "asset_count", len(output.Assets)) updateTaskInDB(ctx, taskID, "saving", "format_adapter", "", 90) diff --git a/frontend/src/components/PipelineStages.tsx b/frontend/src/components/PipelineStages.tsx new file mode 100644 index 0000000..1fc166d --- /dev/null +++ b/frontend/src/components/PipelineStages.tsx @@ -0,0 +1,71 @@ +const STAGES = [ + { key: 'prompt_builder', label: '提示词' }, + { key: 'asset_generator', label: '生成中' }, + { key: 'quality_supervisor', label: '质检中' }, + { key: 'format_adapter', label: '格式转换' }, +] as const + +type Stage = typeof STAGES[number]['key'] + +interface PipelineStagesProps { + currentStage: Stage | null + status: string +} + +export default function PipelineStages({ currentStage, status }: PipelineStagesProps) { + if (!currentStage || status !== 'running') { + return null + } + + const currentIndex = STAGES.findIndex(s => s.key === currentStage) + + return ( +