package activities import ( "beacon/pkg/dao/mysql" "beacon/pkg/pb" "context" "fmt" "go.temporal.io/sdk/activity" ) // LoadCompositeCaseStepsActivity 用于加载复合案例步骤的Activity结构 // LoadCompositeCaseSteps 加载复合案例步骤定义 func LoadCompositeCaseSteps(ctx context.Context, compositeCaseId string) ([]*pb.CompositeCaseStepDefinition, error) { // 获取 Activity 日志记录器 logger := activity.GetLogger(ctx) logger.Info("Loading composite case steps", "compositeCaseId", compositeCaseId) // 参数验证 if compositeCaseId == "" { return nil, fmt.Errorf("compositeCaseId cannot be empty") } // 发送心跳信号,表明 Activity 正在运行 activity.RecordHeartbeat(ctx) // 通过DAO从数据库加载复合案例步骤数据 steps, err := dao.GetCompositeCaseSteps(compositeCaseId) if err != nil { logger.Error("Failed to load composite case steps from database", "error", err) return nil, fmt.Errorf("failed to load composite case steps: %w", err) } // 如果没有找到步骤,返回空切片而不是错误 if len(steps) == 0 { logger.Warn("No steps found for composite case", "compositeCaseId", compositeCaseId) return []*pb.CompositeCaseStepDefinition{}, nil } // 转换数据库模型为 Protobuf 结构 var pbSteps []*pb.CompositeCaseStepDefinition for _, step := range steps { pbStep := &pb.CompositeCaseStepDefinition{ StepId: int64(step.ID), StepOrder: int32(step.StepOrder), StepType: step.StepType, ActivityName: step.ActivityName, ParametersJson: step.ParametersJson, //SuccessNextStepOrder: convertToInt32Ptr(step.SuccessNextStepOrder), //FailureNextStepOrder: convertToInt32Ptr(step.FailureNextStepOrder), //IsParallel: step.IsParallel, //DependsOnStepIds: step.DependsOnStepIds, //ContinueOnFailure: step.ContinueOnFailure, //TimeoutSeconds: int32(step.TimeoutSeconds), //RetryCount: int32(step.RetryCount), //Description: step.Description, //CreatedAt: step.CreatedAt.Unix(), //UpdatedAt: step.UpdatedAt.Unix(), } pbSteps = append(pbSteps, pbStep) } // 再次发送心跳信号 activity.RecordHeartbeat(ctx) logger.Info("Successfully loaded composite case steps", "compositeCaseId", compositeCaseId, "stepCount", len(pbSteps)) return pbSteps, nil }